0

可能重复:
复制包含指向 CUDA 设备的指针的结构

我有一个设备指针结构,指向设备上分配的数组。像这样

struct mystruct{

int* dev1;
double* dev2;
.
.
}

这个结构中有大量的数组。我开始编写一个 CUDA 内核,在其中传递指针mystruct,然后在 CUDA 内核代码中取消引用它,如下所示mystruct->dev1[i]

但是我在写了几行之后意识到这不起作用,因为根据 CUDA 第一原则,您不能mystruct在 CUDA 内核中取消引用主机指针(在本例中为 )。

但这有点不方便,因为我必须将大量参数传递给我的内核。有什么办法可以避免这种情况。我想尽可能缩短内核调用的参数数量。

4

3 回答 3

2

正如我在这个答案中解释的那样,您可以将结构按值传递给内核,因此您不必担心取消引用主机指针:

__global__ void kernel(mystruct in)
{
  int idx = threadIdx.x + blockIdx.x * blockDim.x;
  in.dev1[idx] *= 2;
  in.dev2[idx] += 3.14159;
}

要注意按值传递结构的开销。但是,如果您的结构不是太大,那应该没关系。

如果您将相同的结构传递给许多内核,或者重复传递,您可以考虑将结构本身复制到全局或常量内存,而不是按照 aland 的建议,或者按照 Mark Ebersole 的建议使用映射的主机内存。但是按值传递结构是一种更简单的入门方法。

(注意:重复问题前请搜索 StackOverflow...)

于 2012-09-13T02:49:32.483 回答
0

您可以将mystruct结构复制到全局内存并将其设备地址传递给内核。

然而,从性能的角度来看,存储在常量内存中会更好mystruct,因为(我猜)有很多线程从中随机读取。

于 2012-09-12T19:08:49.977 回答
0

如果您的设置支持,您还可以使用页面锁定(固定)主机内存并在该区域内创建结构。请参阅CUDA 编程指南的 3.2.4 。

于 2012-09-12T21:04:45.623 回答