Windows/CUDA

[CUDA] 수식어

Ohjeonghak 2018. 5. 23. 16:43
반응형

[CUDA] 수식어

수식어의 종류는 함수의 수식어, 변수의 수식어로 크게 2가지로 나뉜다.



함수의 수식어는 함수 type 정의 앞에 붙는다.


※함수의 수식어 종류

  1. __global__

    device(그래픽카드)에서 실행되며, host(CPU)에서 call 할 수는 있어도 device에서 call 할 수는 없다.
    device로 실행하는 kernel function 지정에 사용할 수 있다.

    * 문법 주의사항
    __global__ void function<<< block count, thread count >>>( int a, int b, int c)
    {
    }
      - Function의 Return type은 무조건 void type 이다.
      - <<<, >>>을 이용하여 실행 시 block과 thread를 지정할 수 있다.
      - 재귀호출 하여 사용하면 절대 안된다.
      - Function 내 static 변수를 가질 수 없다.
      - 가변형 인수를 가질 수 없다.
      - __global__ 로 지정한 함수의 포인터를 사용 할 수 있다.
      - __host__ 수식어와 동시에 사용 할 수는 없다.
      - device 에서 처리가 완료되기 전에 호출한 즉시 반환하여 비동기 동작한다.
      - 공유 메모리를 이용하고 256 byte 까지의 인수를 사용 할 수 있다.



  2. __device__

    device에서 실행되며, device에서 call 할 수는 있어도 host에서 call 할 수는 없다.
    device code 중에 작성하여 device 내에서의 실행되는 Sub Function로 사용한다.

    * 문법 주의사항
    __device__ int function(int a, int b)
    {
    }
     - 재귀호출은 할 수 없다.
     - Function 내에 static 변수를 가질 수 없다.
     - 가변형 인수를 가질 수 없다.
     - __device__로 지정한 Function의 포인터는 사용할 수 없다.



  3. __host__

    host에서 실행되며, host에서 call 할 수 있고, device에서 call 할 수 없다.
    host에서 일반적으로 사용하는 Function이다.

    * 문법 주의사항
    // 1번
    __host__ int function()
    {
    }
    
    // 2번
    __host__ __device__ int function()
    {
    }
    
      - __host__, __global__, __device__ 중 하나의 수식어로 지정되지 않은 경우는 묵시적으로 __host__ 가 기본으로 지정된다.
      - __global__ 과 동시에 사용 할 수 없다.
      - __device__ 와 동시에 사용하여, host와 device 양쪽에서 사용할 수 있는 함수로 작성 할 수 있다.




※변수의 수식어 종류

  1. __device__

    global memory 영역에 할당되어 프로그램이 종료 될 때까지 유효하다.
    모든 Thread가 접근 할 수 있고 host 측에서는 API 함수를 통해서 읽기와 쓰기가 가능하다.

  2. __constant__

    상수 메모리(Constant Memory) 영역에 할당되어 프로그램이 종료 될 때까지 유효하다.
    모든 Thread가 접근 가능하며, 읽기만 가능하다.
    host에서 cudaMemcpyToSymbol()의 API를 통해서 값을 쓸 수 있다.
    Constant Cache가 함께 사용된다.


  3. __shared__

    share memory 영역에 할당되어 실행 중인 Thread Block에서만 유효하다.
    Block 내의 Thread는 접근하여 읽고 쓰기가 가능하다.







반응형