[CUDA] CUDA 공부 2 - CUDA 기본 구조 및 함수 키워드
자 이제 GPU 메모리에 데이터를 올렸으니 연산이 들어가야 할 차례이다.
우선 CUDA를 이용하여 GPU를 연산에 사용할려면 파일 확장자를 CUDA 용으로 cu로 작성하여야
CUDA 관련 컴파일러(NVCC)가 이를 컴파일 해줄 것이다.
CUDA에서 사용되는 함수는 크게 3가지로 구분된다.
CPU에서 사용되는 함수, GPU에서 사용되는 함수, CPU와 GPU에서 사용되는 함수 이다.
CPU와 GPU에서 사용되는 함수는 CPU에서 사용되는 함수와 GPU에서 사용되는 함수를 이어주는 다리 같은 역할이라고 이해하면 되겠다.
이 각각의 함수는 __host__, __device__, __global__ 의 키워드로 대표된다.
1. __host__
호스트 즉, CPU와 시스템 메모리에서 실행되는 함수. 일반적으로 사용하는 함수처럼 키워드를 생략가능하다.
디바이스 함수에서 호출 불가하다.
__host__ int main()
{
...
}
2. __device__
디바이스(GPU)에서 실행되는 함수. 호스트에서 호출 불가능하다.
클래스내의 private 멤버 함수와 비슷하다고 생각하면 될 듯 하다.
__device__ void function()
{
...
}
3. __global__
디바이스에서 실행되는 함수. 호스트에서 호출 가능하나 디바이스 함수에선 호출 불가하다.
호스트 함수에서 호출하여 실행하는 커널 함수를 지정하거나 디바이스 함수를 호출하는데 사용된다.
주의 점은 리턴 값은 무조건 void 이다.
__global__ void function()
{
...
}
위 소스는 __global__ 함수로 작성된 두 개 벡터의 값을 더해 다른 벡터에 대입하는 예제이다.(예제소스 : vectorAdd)
여기서 blockDim 과 blockIdx, threadIdx 가 보인다.
이것들이 뭔지 정확히 하고 가야 CUDA 함수를 작성할 때 혼란이 없다.
자세한 내용은 성태님의 블로그를 확인하자.
간단히 요약하면 CUDA는 작업을 thread 단위로 수행하며 thread를 관리하기 위해 묶은 단위가 block 이며 이 block을 관리하기 위해 묶은 단위가 grid 이다.
thread << block << grid
block 과 grid는 3차원까지 표현이 가능하며 1,2차원으로도 표현이 가능하다.
마치 2D 이미지를 1D 배열로 다룰수 있듯이 말이다.
block이 수행되는 grid의 인덱스는 gridDim.x, gridDim.y, gridDim.z 로 확인 가능하며
thread가 수행되는 block의 인덱스는 blockDim.x blockDim.y, blockDim.z 로 확인 가능하다.
마지막으로 thread의 인덱스는 threadIdx.x,y,z 를 통해 가능하다.
댓글
댓글 쓰기