2011-11-28 109 views
8

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

假设我启动的线程的与

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

1-d网格我可以传递一个整数参数int foo其为主机 -integer变量, 直接向CUDA内核?或者我应该将cudaMalloc内存的单个整数表示为dev_foo,然后cudaMemcpyfoo分成devfoo,然后通过devfoo作为内核参数?

回答

12

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

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

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

总结传值函数适用于整型,浮点或其他基本类型,以及简单的平面用户定义的结构或类对象。

5

对于数据块,您只需要使用cudaMalloc()cudaMemcpy()。不是单一的int s等等。您还可以通过struct s作为参数,只要它们没有指向主机内存中的数据块的成员即可。作为一个经验法则:如果你传递一个指向内核的指针,确保它指向设备内存。