将结构指针传递给CUDA内核

时间:2012-09-12 19:03:05

标签: cuda

  

可能重复:
  Copying a struct containing pointers to CUDA device

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

struct mystruct{

int* dev1;
double* dev2;
.
.
}

此结构中有大量数组。我开始编写一个CUDA内核 我将指针传递给mystruct,然后将其取消 像这样的mystruct->dev1[i]的CUDA内核代码。

但是我写了几句话后才意识到这是不可行的,因为CUDA的第一原则 你不能在CUDA内核中取消主机指针(在本例中为mystruct)。

但这有点不合适,因为我必须传递更多的论点 到我的内核。有没有办法避免这种情况。我想保留一些参数 我的内核调用尽可能短。

3 个答案:

答案 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。