답변:
__device__
와 __global__
기능의 차이점은 다음 과 같습니다.
__device__
함수는 장치에서만 호출 할 수 있으며 장치에서만 실행됩니다.
__global__
함수는 호스트에서 호출 할 수 있으며 장치에서 실행됩니다.
따라서 __device__
커널 함수에서 함수 를 호출 하고 커널 설정을 지정할 필요가 없습니다. 또한 함수를 "오버로드"할 수 있습니다. 예 : void foo(void)
and 를 선언 __device__ foo (void)
하면 호스트에서 하나가 실행되고 호스트 함수에서만 호출 할 수 있습니다. 다른 하나는 장치에서 실행되며 장치 또는 커널 함수에서만 호출 할 수 있습니다.
다음 링크를 방문 할 수도 있습니다. http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , 나에게 유용했습니다.
__global__
-CPU 또는 GPU *에서 호출되는 GPU에서 실행됩니다. <<<dim3>>>
인수로 실행됩니다 .__device__
-GPU에서 호출되는 GPU에서 실행됩니다. 변수도 함께 사용할 수 있습니다.__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 " 읽기
차이를 이해하기에 충분할 것입니다.
나는 당분간 여기에 근거없는 추측을 기록하고 있습니다 (나중에 권위있는 출처를 발견하면 이것을 입증 할 것입니다) ...
__device__
함수는 void 이외의 반환 유형을 가질 수 있지만 __global__
함수는 항상 void를 반환해야합니다.
__global__
함수는 GPU에서 실행되는 다른 커널 내에서 호출되어 추가 GPU 스레드 (CUDA 동적 병렬 처리 모델 (일명 CNP)의 일부로)를 시작하고 __device__
함수는 호출 커널과 동일한 스레드에서 실행됩니다.
__global__
function은 커널의 정의입니다. CPU에서 호출 될 때마다 해당 커널이 GPU에서 시작됩니다.
그러나 해당 커널을 실행하는 각 스레드는 몇 가지 코드를 반복해서 실행해야 할 수 있습니다 (예 : 두 정수 교환). 따라서 여기서 우리는 C 프로그램에서하는 것처럼 도우미 함수를 작성할 수 있습니다. GPU에서 실행되는 스레드의 경우 도우미 함수를 __device__
.
따라서 장치 함수는 커널의 스레드에서 호출됩니다 (하나의 스레드에 대한 인스턴스 하나). 한편, 전역 함수는 CPU 스레드에서 호출됩니다.
__global__
함수를 말하는 CUDA C 키워드 (선언 지정자)입니다.
전역 함수 (커널)를 사용하여 호스트 코드에 의해 시작 <<< no_of_blocks , no_of threads_per_block>>>
. 각 스레드는 고유 한 스레드 ID로 커널을 실행합니다.
그러나 __device__
호스트 코드에서 함수를 호출 할 수는 없습니다. 필요한 경우 __host__
__device__
.
전역 함수는 호스트에서만 호출 할 수 있으며 반환 유형이 없지만 장치 함수는 다른 장치 함수의 커널 함수에서만 호출 할 수 있으므로 커널 설정이 필요하지 않습니다.
__global__
CUDA 5.0 및 컴퓨팅 기능 3.5 이상이 필요한 동적 병렬 처리를 사용하는 경우 CUDA 커널 의미 체계 (<<< ... >>>)를 사용하여 장치에서 함수를 호출 할 수도 있습니다.