2011-11-06 56 views
1

我有C代码,它使用指向struct的指针。我试图找出如何将它传递给cuda而没有太多的运气。将基于指针的结构传递给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.... 
} 

但我想不出如何通过它。 任何想法?

回答

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,而不是指针(如有必要,可能会将其更改回设备代码中的指针)。