__global__ 是否比 __device__ 有开销?

use*_*321 1 c++ performance cuda gpu

这个问题__device__询问和之间的区别__global__

区别在于:

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

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

__global__我将和之间的区别解释__device__为类似于publicprivate类访问说明符。重点是防止意外地__device__从主机调用函数。听起来我可以将所有void返回函数标记为__global__不改变程序行为。这会改变程序性能吗?

Rob*_*lla 6

是的,__global__与 相比,有开销__device__,但还有其他细节需要注意。你提出的建议可能不是一个好主意。

__global__是来自主机代码的设备代码入口点。最初,GPU 上没有运行任何代码。当您的主机代码决定要在 GPU 上启动某些处理时,只能通过__global__调用函数(即所谓的内核启动)来完成。

您可以__global__从设备代码调用函数,但这是调用称为CUDA 动态并行性的东西,它具有内核启动的所有属性。如果您是初学者,您几乎肯定不想这样做。

如果您有在 GPU 上运行的代码,并且想要在 CUDA 线程上下文中调用函数,则执行此操作的方法是调用函数__device__

听起来我可以将所有返回 void 的函数标记为__global__不改变程序行为。这会改变程序性能吗?

它将改变行为和表现。

当您调用__global__函数(无论是从主机代码还是设备代码)时,唯一的方法是通过正确配置的内核启动。使用 CUDA 运行时 API 中的典型方法,即:

kernel<<<blocks, threads, ...>>>(... arguments ...);
Run Code Online (Sandbox Code Playgroud)

三 V 形语法中的这些内容使其不同于普通的函数调用,并且其行为也有所不同。它将启动一个新内核,具有自己的网格(与内核启动相关的线程/块的补充)。

当你调用一个__device__函数时,它看起来就像一个普通的函数调用:

func(... arguments ...);
Run Code Online (Sandbox Code Playgroud)

并且行为也像一个人。它在单线程上下文中运行,并且不会启动任何新线程/块/内核来服务函数调用。

您可能需要花几个小时按顺序介绍该主题。只是一个建议,当然按照你的意愿去做。