我有一个设备指针结构,指向设备上分配的数组。 像这样
struct mystruct{
int* dev1;
double* dev2;
.
.
}
此结构中有大量数组。我开始编写一个CUDA内核
我将指针传递给mystruct
,然后将其取消
像这样的mystruct->dev1[i]
的CUDA内核代码。
但是我写了几句话后才意识到这是不可行的,因为CUDA的第一原则
你不能在CUDA内核中取消主机指针(在本例中为mystruct
)。
但这有点不合适,因为我必须传递更多的论点 到我的内核。有没有办法避免这种情况。我想保留一些参数 我的内核调用尽可能短。
答案 0 :(得分:2)
正如我在this answer中解释的那样,您可以按值将结构传递给内核,因此您不必担心取消引用主机指针:
__global__ void kernel(mystruct in)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
in.dev1[idx] *= 2;
in.dev2[idx] += 3.14159;
}
通过值传递struct需要注意的开销。但是,如果你的结构不是太大,那就无所谓了。
如果将相同的结构传递给许多内核,或者重复传递,您可以考虑将结构本身复制到全局或常量内存,而不是按照aland的建议,或者使用Mark Ebersole建议的映射主机内存。但是按值传递struct是一种更简单的入门方式。
(注意:请在复制问题之前搜索StackOverflow ...)
答案 1 :(得分:0)
您可以将mystruct
结构复制到全局内存并将其设备地址传递给内核。
然而,从性能的角度来看,将mystruct
存储在常量内存中会更好,因为(我猜)很多线程都有很多随机读取。
答案 2 :(得分:0)
如果您的设置支持,您还可以使用页锁定(固定)主机内存并在该区域内创建结构。请参阅CUDA programming guide的3.2.4。