【问题标题】:Passing a struct pointer to a CUDA kernel [duplicate]将结构指针传递给 CUDA 内核 [重复]
【发布时间】:2012-09-12 19:03:05
【问题描述】:

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

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

struct mystruct{

int* dev1;
double* dev2;
.
.
}

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

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

但这有点不方便,因为我将不得不传递更多的参数 到我的内核。有什么办法可以避免这种情况。我想保留参数的数量 我的内核调用尽可能短。

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

    __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...)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 你的意思是映射的主机内存,马克。页面锁定的主机内存不一定是映射的。
        猜你喜欢
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 2016-04-14
        相关资源
        最近更新 更多