본문 바로가기

Programming/Todo's CUDA

CUDA 프로그램 준비 - CUDA C언어

CUDA C 언어



CUDA C언어의 목적 : C언어에 가까운 프로그램 언어를 제공하여 기존의 C프로그래머가 사용하기 쉬운 환경을 제공하는 것이다.



3.1 함수의 수식어


| __global__



- 디바이스에서 실행된다. 

- 호스트에서 실행할 수는 있어도 디바이스에서 호출할 수는 없다. 

- 디바이스로 실행하는 커널 함수 지정에 사용할 수 있다.



문법


__global__ function<<<m , n >>>(a, b, c)

{   }




주의사항


-  리턴값은 항상 void 이다.

- <<<. >>> 을 이용하여 실행 시 블록과 스레드를 지정할 수 있다.

- 재귀 호출은 할 수 없다.

- 함수 내에 static변수를 가질 수 없다.

- 가변형 인수를 가질 수 없다.

- __global__로 지정한 함수의 포인터를 이용할 수 있다.

__host__(후술)와 동시에는 이용할 수 없다.

- 디바이스에서 처리가 완료되기 전에 호출한 즉시 반환하여 비동기 동작한다.




| __device__



- 디바이스에서 실행된다.

- 디바이스에서 호출할 수 있고 호스트에서 호출할 수 없다.

- 디바이스 코드 중에 작성하여 디바이스 내에서의 실행되는 서브함수로 사용한다. 



문법


__device__ int function(int a, int b)

{  }



주의사항


- 재귀호출은 할 수 없다.

- 함수 내에 static 변수를 가질 수 없다.

- 가변형 인수를 가질 수 없다.

- __device__ 로 지정한 함수의 포인터는 사용할 수 없다.




| __host__



- 호스트에서 실행된다.

- 호스트에서 호출할 수 있고 디바이스에서 호출할 수 없다.

- 호스트에서 보통 사용하는 함수가 된다.



문법


__host__ int function(int a, int b)

{  }



주의사항


- __host__ , __global__ , __device__ 가 지정되지 않은 경우, __host__를 지정한 것과 동일하다.

- __global__과 동시에 사용할 수 없다.

- __device__ 와 동시에 사용하여, 호스트와 디바이스 양쪽에서 사용할 수 있는 함수로 작성할 수 있다.





3.2 변수의 수식어



| __device__



- 글로벌 메모리 영역에 할당되어 프로그램이 종료될 때까지 유효하다.

- 모든 스레드가 엑세스할 수 있고 호스트 측에서는 API 함수를 통해서 읽기와 쓰기가 가능하다.


*글로벌 메모리 영역

https://m.blog.naver.com/PostView.nhn?blogId=bloodsoda&logNo=221015013243&proxyReferer=https%3A%2F%2Fwww.google.com%2F


| __constant__



- 상수 메모리 영역(Constant Memory) 에 할당되어 프로그램이 종료될 때까지 유효하다.

- 모든 스레드가 엑세스할 수 있고 호스트 측에서는 API 함수를 통해서 읽기만 가능하다.

- 호스트에서 cudaMemcpyToSymbol( ) 의 API 를 통해서 값을 쓸 수 있다.

- 상수 캐시(Constant Cache)가 함께 사용된다.



| __shared__



- 공유 메모리 영역에 할당되어 실행중인 스레드 블록 상에서 유효하다.

- 블록 내의 스레드가 엑세스할 수 있고 호스트 측에서는 API 함수를 통해서 읽기와 쓰기가 가능하다.

호스트에서 cudaMemcpyToSymbol( ) 의 API 를 통해서 값을 쓸 수 있다.

- 상수 캐시(Constant Cache)가 함께 사용된다.