2011-03-25 58 views
1

我有一個節點樹,我想複製到GPU memroy。該節點看起來像這樣:將樹複製到GPU內存

struct Node 
{ 
    char *NodeName; 
    int NumberOfChildren; 
    Node *Children; 
    Node *Parent; 
} 

每個節點都有一個動態數量的子節點,但有一個父節點。我如何將這棵樹複製到CUDA全局內存?我應該通過樹BFS分配/複製數據到GPU?或者我可以使用單個cuda內存複製指令嗎?

回答

1

一般而言,您希望使用單個內存副本,因爲多個小副本會導致性能下降。可能正確的做法是跟蹤插入樹中所需的總大小(或漫遊樹計算它),分配(或更大)數量,然後執行單個數據傳輸。如果您以後需要複製大於分配的樹,請釋放該內存並分配新的塊。

不幸的是,所有的指針將在GPU上無效的,所以你可能對你的結構擴展到類似:

 
struct Node 
{ 
    char *NodeName; 
    int NumberOfChildren; 
    Node *Children; /* children on host */ 
    Node *Parent;  /* parent on host */ 
    Node *d_children; /* children on device */ 
    Node *d_parent; /* parent on device */ 
} 

,然後分配後,在樹內,分配給新節點。

就性能而言,您絕對要避免多次小數據傳輸。

5

我不確定數據的來源,但可以使用平坦的內存空間並使用索引偏移作爲訪問內存的索引。

節點將被定義爲:

struct Node 
{ 
    unsigned int name; 
    unsigned int number_of_children; 
    unsigned int parent; 
    unsigned int children; 
} 

你會的malloc內存一個大區塊,並建立您的樹在那裏。 (保留最後插入物品的地方的記憶計數器)。

你這樣做也可以添加字符串。

這樣你會有一個連續的內存塊,它會是一個簡單的內存拷貝。訪問一個簡單的演員將工作的項目。

意思是重寫樹和字符串代碼,但會保持一致。如果你不知道你的內存有多大,你可以這樣做,就是頁面,並將引用改爲一對整數,這將使分配內存更容易。

Peter。 PS:嵌入式工程師不是CUDA程序員,但遇到了類似的問題,不需要執行解析就可以跨處理器移動樹。