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


Answers:


136

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

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


14
就像附录一样,__global__如果您使用的是动态并行性,则还可以使用CUDA内核语义(<< ...
汤姆(Tom)

39

__device____global__功能之间的区别是:

__device__ 只能从设备调用功能,并且只能在设备中执行功能。

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

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

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


31
  1. __global__-在GPU上运行,从CPU或GPU *调用。用<<<dim3>>>参数执行。
  2. __device__-在GPU上运行,从GPU调用。也可以与可变性一起使用。
  3. __host__ -在CPU上运行,从CPU调用。

*)__global__可以从其他__global__开始
计算能力3.5的函数中调用这些函数。


5
这个答案有点太晚了-在提出问题时是正确的,但是自从动态并行性发明以来,它就不再正确了。
tera

16

我将用一个例子来解释:

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

这应该足以理解差异。


13

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


7

我暂时在这里记录一些毫无根据的猜测(稍后当我遇到一些权威消息来源时,我将证实这些猜测)...

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

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


7

__global__函数是内核的定义。每当从CPU调用它时,该内核就会在GPU上启动。

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

因此,从内核的线程(一个线程的一个实例)中调用设备功能。同时,从CPU线程调用全局函数。


7

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

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

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

但是,__device__不能从主机代码中调用函数。如果需要,请同时使用两者__host__ __device__


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.