[cuda] 전역 기능과 장치 기능의 차이점

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

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



답변

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

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


답변

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

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

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

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

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


답변

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

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


답변

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

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 ” 읽기

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


답변

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


답변

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

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

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


답변

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

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

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