为特定线程配置调用CUDA内核时,是否有任何严格的规则 哪个内存空间(设备/主机)内核参数应该驻留在哪个类型和它们应该是什么类型?
假设我使用
启动一维线程网格kernel<<<numblocks, threadsperblock >>> (/*parameters*/)
我可以传递一个整数参数int foo
,它是主机 - 整数变量,
直接到CUDA内核?或者我应该cudaMalloc
内存为单个整数说dev_foo
然后cudaMemcpy
foo
进入devfoo
然后传递devfoo
作为内核参数?
答案 0 :(得分:12)
内核参数的规则是C ++参数传递规则的逻辑结果,以及设备和主机内存在物理上是分开的事实。
CUDA不允许通过引用传递参数,你必须小心指针。
具体而言,您必须按值传递参数。传递用户定义的类型要求默认的复制构造函数或您自己的复制构造函数(如果存在)不包含任何内存分配(堆分配“new”或“malloc”)。
总结pass-by-value适用于整数,浮点或其他基本类型,以及简单的用户定义的平面结构或类对象。
答案 1 :(得分:5)
您只需要使用cudaMalloc()
和cudaMemcpy()
来获取数据块。不是单int
之类的。您也可以将struct
作为参数传递,只要它们没有指向主机内存中的数据块的成员。
根据经验,如果您要将指针传递给内核,请确保它指向设备内存。