use*_*321 1 c++ performance cuda gpu
这个问题__device__
询问和之间的区别__global__
。
区别在于:
__device__
函数只能从设备调用,并且只能在设备中执行。
__global__
函数可以从主机调用,并在设备中执行。
__global__
我将和之间的区别解释__device__
为类似于public
和private
类访问说明符。重点是防止意外地__device__
从主机调用函数。听起来我可以将所有void
返回函数标记为__global__
不改变程序行为。这会改变程序性能吗?
是的,__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)
并且行为也像一个人。它在单线程上下文中运行,并且不会启动任何新线程/块/内核来服务函数调用。
您可能需要花几个小时按顺序介绍该主题。只是一个建议,当然按照你的意愿去做。