131

谁能描述和之间的__global__区别__device__

我应该什么时候使用__device__,什么时候使用__global__

4

9 回答 9

163

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

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

于 2012-09-11T16:18:44.487 回答
45

__device____global__函数之间的区别是:

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

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

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

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

于 2012-09-11T16:33:44.310 回答
41
  1. __global__- 在 GPU 上运行,从 CPU 或 GPU* 调用。用<<<dim3>>>参数执行。
  2. __device__- 在 GPU 上运行,从 GPU 调用。也可以与变量一起使用。
  3. __host__- 在 CPU 上运行,从 CPU 调用。

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

于 2016-09-12T10:58:36.303 回答
17

我将用一个例子来解释它:

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

这应该足以理解差异。

于 2014-02-11T09:49:04.710 回答
13

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

于 2012-09-11T16:19:00.320 回答
7

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

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

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

于 2014-02-16T05:33:22.207 回答
7

暂时在此记录一些毫无根据的推测(以后遇到权威资料我会佐证)...

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

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

于 2014-10-18T18:56:38.477 回答
7

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

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

主机代码使用<<< no_of_blocks , no_of threads_per_block>>>. 每个线程通过其唯一的线程 ID 执行内核。

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

于 2016-07-02T06:04:17.027 回答
2

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

于 2015-03-29T00:33:18.820 回答