全局函数和设备函数之间的区别

Posted

技术标签:

【中文标题】全局函数和设备函数之间的区别【英文标题】:Difference between global and device functions 【发布时间】:2012-09-04 15:11:42 【问题描述】:

谁能描述__global____device__ 之间的区别?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

作为附录,__global__ 函数也可以使用 CUDA 内核语义 (>>) 从设备调用,如果您使用的是动态并行 - 这需要 CUDA 5.0和计算能力 3.5 或更高。【参考方案2】:

__device____global__ 函数之间的区别是:

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

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

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

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

【讨论】:

【参考方案3】:
    __global__ - 在 GPU 上运行,从 CPU 或 GPU* 调用。使用<<<dim3>>> 参数执行。 __device__ - 在 GPU 上运行,从 GPU 调用。也可以与变量一起使用。 __host__ - 在 CPU 上运行,从 CPU 调用。

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

【讨论】:

这个答案有点晚了——在提出问题时它是正确的,但自从dynamic parallelism的发明以来它就不再正确了。【参考方案4】:

我会举例说明:

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)函数(而不是内核)调用另一个内核函数时,我们使用“device”。阅读此“https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions”

这应该足以理解差异。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

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

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

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于全局函数和设备函数之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

总结javascript中的全局变量和局部变量的区别以及声明函数和调用函数的区别

js学习-全局函数和类内部函数区别

vue引入全局组件和局部组件的区别以及全局注册公共函数

全局变量和局部变量的区别

MFC 中,全局SetTimer函数怎么用?