任何人都可以描述之间的差异__global__
和__device__
?
我应该何时使用__device__
,以及何时使用__global__
?
任何人都可以描述之间的差异__global__
和__device__
?
我应该何时使用__device__
,以及何时使用__global__
?
Answers:
__device__
和__global__
功能之间的区别是:
__device__
只能从设备调用功能,并且只能在设备中执行功能。
__global__
可以从主机调用函数,并在设备中执行。
因此,您__device__
可以从内核函数中调用函数,而不必设置内核设置。您还可以“重载”一个函数,例如:您可以声明void foo(void)
和__device__ foo (void)
,然后在主机上执行一个,并且只能从主机函数中调用它。另一个在设备上执行,只能从设备或内核函数中调用。
您也可以访问以下链接:http : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions,这对我很有用。
__global__
-在GPU上运行,从CPU或GPU *调用。用<<<dim3>>>
参数执行。__device__
-在GPU上运行,从GPU调用。也可以与可变性一起使用。__host__
-在CPU上运行,从CPU调用。*)__global__
可以从其他__global__
开始
计算能力3.5的函数中调用这些函数。
我将用一个例子来解释:
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)功能(而不是内核)调用另一个内核功能时,我们使用“ 设备 ”。阅读此“ https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions ”
这应该足以理解差异。
__global__
函数是内核的定义。每当从CPU调用它时,该内核就会在GPU上启动。
但是,每个执行该内核的线程可能都需要一次又一次地执行一些代码,例如交换两个整数。因此,在这里我们可以像在C程序中一样编写一个辅助函数。对于在GPU上执行的线程,辅助函数应声明为__device__
。
因此,从内核的线程(一个线程的一个实例)中调用设备功能。同时,从CPU线程调用全局函数。
__global__
是CUDA C关键字(声明说明符),它表示函数,
主机代码使用启动的全局函数(内核)<<< no_of_blocks , no_of threads_per_block>>>
。每个线程都通过其唯一的线程ID执行内核。
但是,__device__
不能从主机代码中调用函数。如果需要,请同时使用两者__host__
__device__
。
全局函数只能从主机调用,它们没有返回类型,而设备函数只能从其他设备函数的内核函数调用,因此不需要内核设置
__global__
如果您使用的是动态并行性,则还可以使用CUDA内核语义(<< ...