전역 기능과 장치 기능의 차이점


108

사람 사이의 차이를 설명 할 수 __global____device__?

을 언제 사용해야 __device__하며 언제 사용해야 __global__합니까?.

답변:


136

전역 함수는 "커널"이라고도합니다. CUDA 커널 호출 의미론 ( <<<...>>>)을 사용하여 호스트 측에서 호출 할 수있는 함수입니다 .

장치 기능은 다른 장치 또는 전역 기능에서만 호출 할 수 있습니다. __device__함수는 호스트 코드에서 호출 할 수 없습니다.


14
부록과 마찬가지로 __global__CUDA 5.0 및 컴퓨팅 기능 3.5 이상이 필요한 동적 병렬 처리를 사용하는 경우 CUDA 커널 의미 체계 (<<< ... >>>)를 사용하여 장치에서 함수를 호출 할 수도 있습니다.

39

__device____global__기능의 차이점은 다음 과 같습니다.

__device__ 함수는 장치에서만 호출 할 수 있으며 장치에서만 실행됩니다.

__global__ 함수는 호스트에서 호출 할 수 있으며 장치에서 실행됩니다.

따라서 __device__커널 함수에서 함수 를 호출 하고 커널 설정을 지정할 필요가 없습니다. 또한 함수를 "오버로드"할 수 있습니다. 예 : void foo(void)and 를 선언 __device__ foo (void)하면 호스트에서 하나가 실행되고 호스트 함수에서만 호출 할 수 있습니다. 다른 하나는 장치에서 실행되며 장치 또는 커널 함수에서만 호출 할 수 있습니다.

다음 링크를 방문 할 수도 있습니다. http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , 나에게 유용했습니다.


31
  1. __global__-CPU 또는 GPU *에서 호출되는 GPU에서 실행됩니다. <<<dim3>>>인수로 실행됩니다 .
  2. __device__-GPU에서 호출되는 GPU에서 실행됩니다. 변수도 함께 사용할 수 있습니다.
  3. __host__ -CPU에서 호출되는 CPU에서 실행됩니다.

*) __global__함수는 계산 능력 3.5를 __global__시작
하는 다른 함수 에서 호출 할 수 있습니다 .


5
이 답변은 너무 늦었습니다. 질문을 받았을 당시에는 정확했지만 동적 병렬 처리 가 발명 된 이후로 더 이상 정확하지 않습니다 .
tera

16

예를 들어 설명하겠습니다.

main()
{
    // Your main function. Executed by CPU
}

__global__ void calledFromCpuForGPU(...)
{
  //This function is called by CPU and suppose to be executed on GPU
}

__device__ void calledFromGPUforGPU(...)
{
  // This function is called by GPU and suppose to be executed on GPU
}

즉, 호스트 (CPU) 함수가 장치 (GPU) 함수를 호출하기를 원할 때 ' global '이 사용됩니다. 읽어보기 : " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

그리고 장치 (GPU) 함수 (커널이 아닌)가 다른 커널 함수를 호출하도록하려면 ' device '를 사용합니다. " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions " 읽기

차이를 이해하기에 충분할 것입니다.


13

__global__cuda 커널 용으로 호스트에서 직접 호출 할 수있는 함수입니다. __device__함수는 __global____device__함수 에서 호출 할 수 있지만 호스트에서는 호출 할 수 없습니다.


7

나는 당분간 여기에 근거없는 추측을 기록하고 있습니다 (나중에 권위있는 출처를 발견하면 이것을 입증 할 것입니다) ...

  1. __device__함수는 void 이외의 반환 유형을 가질 수 있지만 __global__함수는 항상 void를 반환해야합니다.

  2. __global__함수는 GPU에서 실행되는 다른 커널 내에서 호출되어 추가 GPU 스레드 (CUDA 동적 병렬 처리 모델 (일명 CNP)의 일부로)를 시작하고 __device__함수는 호출 커널과 동일한 스레드에서 실행됩니다.


7

__global__function은 커널의 정의입니다. CPU에서 호출 될 때마다 해당 커널이 GPU에서 시작됩니다.

그러나 해당 커널을 실행하는 각 스레드는 몇 가지 코드를 반복해서 실행해야 할 수 있습니다 (예 : 두 정수 교환). 따라서 여기서 우리는 C 프로그램에서하는 것처럼 도우미 함수를 작성할 수 있습니다. GPU에서 실행되는 스레드의 경우 도우미 함수를 __device__.

따라서 장치 함수는 커널의 스레드에서 호출됩니다 (하나의 스레드에 대한 인스턴스 하나). 한편, 전역 함수는 CPU 스레드에서 호출됩니다.


7

__global__ 함수를 말하는 CUDA C 키워드 (선언 지정자)입니다.

  1. 장치 (GPU)에서 실행
  2. 호스트 (CPU) 코드에서 호출합니다.

전역 함수 (커널)를 사용하여 호스트 코드에 의해 시작 <<< no_of_blocks , no_of threads_per_block>>>. 각 스레드는 고유 한 스레드 ID로 커널을 실행합니다.

그러나 __device__호스트 코드에서 함수를 호출 할 수는 없습니다. 필요한 경우 __host__ __device__.


2

전역 함수는 호스트에서만 호출 할 수 있으며 반환 유형이 없지만 장치 함수는 다른 장치 함수의 커널 함수에서만 호출 할 수 있으므로 커널 설정이 필요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.