CUDA内核的参数

smi*_*dha 8 cuda gpgpu

在为特定的线程配置调用CUDA内核时,是否有关于哪些内存空间(设备/主机)内核参数应该驻留在哪个以及它们应该是什么类型的严格规则?

假设我启动了1-D线程网格

kernel<<<numblocks, threadsperblock >>> (/*parameters*/)
Run Code Online (Sandbox Code Playgroud)

我可以直接向CUDA内核传递int foo一个host -integer变量的整数参数吗?或者我应该cudaMalloc记住单个整数说dev_foo然后cudaMemcpy foo进入devfoo然后devfoo作为内核参数传递?

Yap*_*pie 12

内核参数的规则是C++参数传递规则的逻辑结果,以及设备和主机内存在物理上是分开的事实.

CUDA不允许通过引用传递参数,你必须小心指针.

具体而言,您必须按值传递参数.传递用户定义的类型要求默认的复制构造函数或您自己的复制构造函数(如果存在)不包含任何内存分配(堆分配"new"或"malloc").

总而言之,pass-by-value适用于整数,浮点或其他基本类型,以及简单的用户定义的平面结构或类对象.


Goo*_*ide 5

您只需要使用cudaMalloc()cudaMemcpy()数据块.不是单身int之类的.您也可以将structs作为参数传递,只要它们没有指向主机内存中的数据块的成员即可.

因此,根据经验:如果要将指针传递给内核,请确保它指向设备内存.