CUDA核函数的参数

9

当调用CUDA核函数进行特定线程配置时,有没有严格规定哪些内存空间(设备/主机)的核函数参数应该存在以及它们应该是什么类型?

假设我启动一个1-D线程网格,使用

kernel<<<numblocks, threadsperblock >>> (/*parameters*/)

我能直接将一个主机-整数变量作为int foo的参数传递给CUDA kernel吗?或者我应该为一个单独的整数,比如dev_foo,分配内存,并将foo复制到dev_foo中,然后将dev_foo作为kernel参数传递?
2个回答

13

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

CUDA不允许通过引用传递参数,您必须小心使用指针。

具体而言,必须通过值传递参数。传递用户定义类型需要默认复制构造函数或您自己的复制构造函数(如果存在)不包含任何内存分配(使用“new”或“malloc”进行的堆分配)。

总之,按值传递对于整型、浮点型或其他基本类型以及简单扁平的用户定义结构或类对象效果良好。


1
自从这个答案被写出来以来,CUDA已经取得了长足的进步。即使在回答被写出来的时候,我相信如果底层数据被固定和映射,使用传递引用应该是合法/可行的。今天,使用UM/managed memory和固定/映射内存(例如cudaHostAlloc())也是合法/可行的。 - Robert Crovella

5
您只需要使用cudaMalloc()cudaMemcpy()来处理数据块,而不是单个的int等。您还可以将struct作为参数传递,只要它们没有指向主机内存中的数据块的成员。

所以作为一个经验法则:如果您需要向内核传递指针,请确保它指向设备内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接