全局和设备功能之间的区别


65

任何人都可以描述__global____device__之间的区别吗?

什么时候应该使用__device__以及何时使用__global__

93

全局函数也称为“内核”。您可以使用CUDA内核调用语义(<<<...>>>)从主机端调用这些函数。

设备功能只能从其他设备或全局功能中调用。 __device__函数不能从主机代码调用。

+7

正如附录所述,如果您使用的是动态并行机制 - 需要CUDA 5.0和3.5或更高版本的计算能力,也可以使用CUDA内核语义(<<<...> >>)从设备调用'__global__'函数。 11 9月. 122012-09-11 17:44:18


10

__global__适用于cuda内核,可直接从主机调用的函数。 __device__函数可以从__global____device__函数调用,但不能从主机调用。


28

__device____global__和功能之间的差异是:

__device__函数只能从设备被调用,并且它仅在设备中执行。

__global__功能可以从主机调用,并在设备中执行。

因此,您可以从内核函数中调用__device__函数,并且不必设置内核设置。您也可以“重载”一个函数,例如:您可以声明void foo(void)__device__ foo (void),然后在主机上执行一个函数,并且只能从主机函数调用。另一个在设备上执行,只能从设备或内核函数中调用。

您还可以访问以下链接:http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions,这对我很有用。


12

我将用一个例子解释:

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)功能,那么“全球”被使用。阅读:“https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions

当我们想要设备(GPU)函数(而不是内核)调用另一个内核函数时,我们使用'设备'。阅读此“https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions

这应该足以了解差异。


5

__global__函数是内核的定义。无论何时从CPU调用该内核,都会在GPU上启动该内核。

但是,执行该内核的每个线程都可能需要一次又一次地执行一些代码,例如交换两个整数。因此,我们可以在这里编写一个辅助函数,就像我们在C程序中一样。对于在GPU上执行的线程,辅助函数应声明为__device__

因此,从内核的线程调用设备函数 - 一个线程的一个实例。而从CPU线程调用全局函数。


6

我在这里记录了一些没有根据的猜测暂且(我以后会证实这些,当我遇到一些权威人士)...

  1. __device__功能可以有非void的返回类型,但__global__函数必须始终返回void。

  2. __global__功能可在GPU上运行的其他内核中被调用,以推出更多的GPU线程(如CUDA动态并行模型(又名CNP)的一部分),而__device__功能同一个线程调用内核上运行。


2

全局功能只能从主机调用,他们没有返回类型,同时设备功能只能从其他设备功能的内核函数,因此这么想的需要内核设置被称为


5

__golbal__是CUDA C关键字(声明说明),它表示,函数,

  1. 执行对设备(GPU)
  2. 呼叫从主机(CPU)的代码。

全局函数(内核),通过使用< < < no_of_blocks,no_of threads_per_block >>>主机代码启动。 每个线程都通过其唯一的线程ID来执行内核。在GPU上运行,从CPU叫做 -

__device__功能不能从主机代码。如果需要做它使用两种__host____device__


11
  1. __global__被调用。执行<<<dim3>>>的论点。
  2. __device__ - 在GPU上运行,从GPU调用。也可以和变种一起使用。
  3. __host__ - 在CPU上运行,由CPU调用。
+1

这个答案有点太晚了 - 在提问的时候是正确的,但是自从[dynamic parallelism]的发明以后,它就不正确了(https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamic-并行/)。 12 9月. 162016-09-12 11:47:03