2011-11-06 79 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,而不是指針(如有必要,可能會將其更改回設備代碼中的指針)。