사람 사이의 차이를 설명 할 수 __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 , 나에게 유용했습니다.
답변
__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 ” 읽기
차이를 이해하기에 충분할 것입니다.
답변
__global__
cuda 커널 용으로 호스트에서 직접 호출 할 수있는 함수입니다. __device__
함수는 __global__
및 __device__
함수 에서 호출 할 수 있지만 호스트에서는 호출 할 수 없습니다.
답변
나는 당분간 여기에 근거없는 추측을 기록하고 있습니다 (나중에 권위있는 출처를 발견하면 이것을 입증 할 것입니다) …
-
__device__
함수는 void 이외의 반환 유형을 가질 수 있지만__global__
함수는 항상 void를 반환해야합니다. -
__global__
함수는 GPU에서 실행되는 다른 커널 내에서 호출되어 추가 GPU 스레드 (CUDA 동적 병렬 처리 모델 (일명 CNP)의 일부로)를 시작하고__device__
함수는 호출 커널과 동일한 스레드에서 실행됩니다.
답변
__global__
function은 커널의 정의입니다. CPU에서 호출 될 때마다 해당 커널이 GPU에서 시작됩니다.
그러나 해당 커널을 실행하는 각 스레드는 몇 가지 코드를 반복해서 실행해야 할 수 있습니다 (예 : 두 정수 교환). 따라서 여기서 우리는 C 프로그램에서하는 것처럼 도우미 함수를 작성할 수 있습니다. GPU에서 실행되는 스레드의 경우 도우미 함수를 __device__
.
따라서 장치 함수는 커널의 스레드에서 호출됩니다 (하나의 스레드에 대한 인스턴스 하나). 한편, 전역 함수는 CPU 스레드에서 호출됩니다.