全局和设备function之间的区别
任何人都可以描述__global__
和__device__
之间的区别吗?
什么时候应该使用__device__
,何时使用__global__
?。
全局函数也被称为“内核”。 这是您可以使用CUDA内核调用语义( <<<...>>>
)从主机端调用的函数。
设备function只能从其他设备或全局function中调用。 __device__
函数不能从主机代码中调用。
__device__
和__global__
函数之间的差异是:
__device__
函数只能从设备调用,并且只能在设备中执行。
__global__
函数可以从主机调用,并在设备中执行。
因此,您可以从内核函数调用__device__
函数,而不必设置内核设置。 你也可以“重载”一个函数,例如:你可以声明void foo(void)
和__device__ foo (void)
,然后在主机上执行一个函数,只能从一个主机函数调用。 另一个在设备上执行,只能从设备或内核函数中调用。
您也可以访问以下链接: http : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions ,这对我很有用。
我会用一个例子来解释一下:
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)function来调用设备(GPU)function时,则使用“ 全局 ”。 请阅读: https : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions
而当我们想要一个设备(GPU)function(而不是内核)调用另一个内核函数时,我们使用' device '。 阅读“ https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions ”
这应该足以了解差异。
__global__
用于cuda内核,可直接从主机调用的函数。 __device__
函数可以从__global__
和__device__
函数调用,但不能从主机调用。
-
__global__
– 在CPU上运行的GPU上运行。 执行<<<dim3>>>
参数。 -
__device__
– 在GPU上运行的GPU上运行。 也可以和变种一起使用。 -
__host__
– 运行在CPU上,由CPU调用。
我暂时在这里logging了一些毫无根据的猜测(当我遇到一些权威的来源时,我会证实这些)。
-
__device__
函数可以具有除void以外的返回types,但__global__
函数必须始终返回void。 -
可以从运行在GPU上的其他内核中调用
__global__
函数来启动额外的GPU线程(作为CUDAdynamic并行模型(又名CNP)的一部分),而__device__
函数与调用内核在同一线程上运行。
__global__
函数是内核的定义。 无论何时从CPU调用,该内核在GPU上启动。
然而每个执行该内核的线程可能需要一次又一次地执行一些代码,例如交换两个整数。 因此,在这里我们可以编写一个帮助函数,就像我们在C程序中一样。 而对于在GPU上执行的线程,辅助函数应该声明为__device__
。
因此,从内核的线程调用一个设备函数 – 一个线程的一个实例。 而从CPU线程调用全局函数。
__golbal__
是一个CUDA C关键字(声明说明符),它表示函数,
- 在设备上执行(GPU)
- 来自主机(CPU)代码的呼叫。
全局函数(内核)由主机代码使用<<< no_of_blocks,no_of threads_per_block >>>启动。 每个线程通过其唯一的线程ID来执行内核。
但__device__
函数不能从主机代码调用。如果你需要使用__host__
__device__
全局函数只能从主机调用,它们不具有返回types,而设备函数只能从其他设备函数的内核函数调用,因此不需要内核设置