【问题标题】:Passing a pointer based struct to cuda将基于指针的结构传递给 cuda
【发布时间】:2011-11-06 17:04:25
【问题描述】:

我有一个使用指向struct 的指针的C 代码。我正在尝试弄清楚如何将其传递给 cuda,但运气不佳。

我有

typedef struct node {        /* describes a tip species or an ancestor */
  struct node *next, *back;  /* pointers to nodes                      */
 etc...
} node;

然后

typedef node **pointptr;
static pointptr treenode;

在我的代码中,我遍历了所有这些,并试图弄清楚如何将它们传递给内核,以便我可以执行以下操作:

for (i = 1; i <= nonodes; i++) {
    treenode[i - 1]->back = NULL;
    etc....
}

但我不知道如何通过它。 有什么想法吗?

【问题讨论】:

    标签: pointers struct cuda


    【解决方案1】:

    问题在于,为了在内核中使用您的树,您的 nextback 可能应该指向设备内存中的某个位置。假设您在主机上构建树然后传递它,您可以执行以下操作:

    node* traverse(node*n){
        if (n==NULL)
            return NULL;
    
        node x, *d;
        x.back = traverse(n->back);
        x.next = traverse(n->next);
        cudaMalloc(&d, sizeof(node));
        cudaMemcpy(d, &x, sizeof(node), cudaMemcpyHostToDevice);
        return d;
    }
    

    通过在根目录上调用它,你最终会得到一个指向设备内存中树根的指针,你可以直接将它传递给你的内核。我没有测试过这段代码,你必须写一些类似的东西才能删除树。

    或者,您可以将树节点连续存储在一个数组中,并在 backnext 中使用索引而不是指针(如有必要,可以将它们改回设备代码中的指针)。

    【讨论】:

      【解决方案2】:

      检查这个问题:

      Copying a multi-branch tree to GPU memory

      虽然它没有准确地回答您的问题,但我认为它可能会解决一些问题并最终帮助您解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        相关资源
        最近更新 更多