全局和设备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__函数调用,但不能从主机调用。

  1. __global__ – 在CPU上运行的GPU上运行。 执行<<<dim3>>>参数。
  2. __device__ – 在GPU上运行的GPU上运行。 也可以和变种一起使用。
  3. __host__ – 运行在CPU上,由CPU调用。

我暂时在这里logging了一些毫无根据的猜测(当我遇到一些权威的来源时,我会证实这些)。

  1. __device__函数可以具有除void以外的返回types,但__global__函数必须始终返回void。

  2. 可以从运行在GPU上的其他内核中调用__global__函数来启动额外的GPU线程(作为CUDAdynamic并行模型(又名CNP)的一部分),而__device__函数与调用内核在同一线程上运行。

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

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

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

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

  1. 在设备上执行(GPU)
  2. 来自主机(CPU)代码的呼叫。

全局函数(内核)由主机代码使用<<< no_of_blocks,no_of threads_per_block >>>启动。 每个线程通过其唯一的线程ID来执行内核。

__device__函数不能从主机代码调用。如果你需要使用__host__ __device__

全局函数只能从主机调用,它们不具有返回types,而设备函数只能从其他设备函数的内核函数调用,因此不需要内核设置