全局和设备功能之间的差异

时间:2012-09-11 16:15:52

标签: cuda

任何人都可以描述__global____device__之间的差异吗?

我应该何时使用__device__,何时使用__global__

9 个答案:

答案 0 :(得分:114)

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

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

答案 1 :(得分:35)

__device____global__函数之间的差异是:

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

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

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

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

答案 2 :(得分:25)

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

答案 3 :(得分:15)

我将用一个例子解释它:

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)功能时,那么全局&#39;用来。阅读本文:&#34; https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions&#34;

当我们想要一个设备(GPU)功能(而不是内核)来调用另一个内核功能时,我们使用&#39; 设备&#39;。阅读本文&#34; https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions&#34;

这应该足以理解差异。

答案 4 :(得分:12)

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

答案 5 :(得分:7)

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

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

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

答案 6 :(得分:7)

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

  1. 在设备上执行(GPU)
  2. 从主机(CPU)代码调用。
  3. 主机代码使用<<< no_of_blocks , no_of threads_per_block>>>启动的全局函数(内核)。 每个线程通过其唯一的线程id执行内核。

    但是,无法从主机代码调用__device__函数。如果需要,请同时使用__host__ __device__

答案 7 :(得分:6)

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

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

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

答案 8 :(得分:2)

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