任何人都可以描述__global__
和__device__
之间的差异吗?
我应该何时使用__device__
,何时使用__global__
?
答案 0 :(得分:114)
全局函数也称为“内核”。这是您可以使用CUDA内核调用语义(<<<...>>>
)从主机端调用的函数。
只能从其他设备或全局功能调用设备功能。无法从主机代码调用__device__
个函数。
答案 1 :(得分:35)
__device__
和__global__
函数之间的差异是:
__device__
函数只能从设备调用,并且只在设备中执行。
__global__
函数可以从主机调用,并在设备中执行。
因此,您从内核函数调用__device__
函数,并且您不必设置内核设置。你也可以超载&#34;一个函数,例如:你可以声明void foo(void)
和__device__ foo (void)
,然后一个在主机上执行,只能从主机函数调用。另一个在设备上执行,只能从设备或内核函数调用。
您还可以访问以下链接:http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions,这对我有用。
答案 2 :(得分:25)
__global__
- 在GPU上运行,从CPU调用。使用<<<dim3>>>
参数执行。__device__
- 在GPU上运行,从GPU调用。也可以与变量一起使用。__host__
- 在CPU上运行,从CPU调用。答案 3 :(得分:15)
我将用一个例子解释它:
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)功能时,那么全局&#39;用来。阅读本文:&#34; https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions&#34;
当我们想要一个设备(GPU)功能(而不是内核)来调用另一个内核功能时,我们使用&#39; 设备&#39;。阅读本文&#34; https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions&#34;
这应该足以理解差异。
答案 4 :(得分:12)
__global__
适用于cuda内核,可直接从主机调用的函数。 __device__
个函数可以从__global__
和__device__
函数调用,但不能从主机调用。
答案 5 :(得分:7)
我暂时在这里记录一些毫无根据的猜测(稍后当我遇到一些权威来源时,我会证实这些......)
__device__
函数可以具有void之外的返回类型,但__global__
函数必须始终返回void。
__global__
函数可以在GPU上运行的其他内核中调用,以启动其他GPU线程(作为CUDA动态并行模型(也称为CNP)的一部分),同时运行__device__
函数与调用内核相同的线程。
答案 6 :(得分:7)
__global__
是一个CUDA C关键字(声明说明符),表示该函数,
主机代码使用<<< no_of_blocks , no_of threads_per_block>>>
启动的全局函数(内核)。
每个线程通过其唯一的线程id执行内核。
但是,无法从主机代码调用__device__
函数。如果需要,请同时使用__host__
__device__
。
答案 7 :(得分:6)
__global__
函数是内核的定义。无论何时从CPU调用,该内核都在GPU上启动。
但是,执行该内核的每个线程可能需要一次又一次地执行某些代码,例如交换两个整数。因此,在这里我们可以编写一个辅助函数,就像我们在C程序中一样。对于在GPU上执行的线程,辅助函数应声明为__device__
。
因此,从内核的线程调用设备函数 - 一个线程的一个实例。同时,从CPU线程调用全局函数。
答案 8 :(得分:2)
全局函数只能从主机调用,它们没有返回类型,而Device Function只能从其他Device函数的内核函数调用,因此不需要内核设置