我有一個節點樹,我想複製到GPU memroy。該節點看起來像這樣:將樹複製到GPU內存
struct Node
{
char *NodeName;
int NumberOfChildren;
Node *Children;
Node *Parent;
}
每個節點都有一個動態數量的子節點,但有一個父節點。我如何將這棵樹複製到CUDA全局內存?我應該通過樹BFS分配/複製數據到GPU?或者我可以使用單個cuda內存複製指令嗎?
我有一個節點樹,我想複製到GPU memroy。該節點看起來像這樣:將樹複製到GPU內存
struct Node
{
char *NodeName;
int NumberOfChildren;
Node *Children;
Node *Parent;
}
每個節點都有一個動態數量的子節點,但有一個父節點。我如何將這棵樹複製到CUDA全局內存?我應該通過樹BFS分配/複製數據到GPU?或者我可以使用單個cuda內存複製指令嗎?
一般而言,您希望使用單個內存副本,因爲多個小副本會導致性能下降。可能正確的做法是跟蹤插入樹中所需的總大小(或漫遊樹計算它),分配(或更大)數量,然後執行單個數據傳輸。如果您以後需要複製大於分配的樹,請釋放該內存並分配新的塊。
不幸的是,所有的指針將在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 */ }
,然後分配後,在樹內,分配給新節點。
就性能而言,您絕對要避免多次小數據傳輸。
我不確定數據的來源,但可以使用平坦的內存空間並使用索引偏移作爲訪問內存的索引。
即
節點將被定義爲:
struct Node
{
unsigned int name;
unsigned int number_of_children;
unsigned int parent;
unsigned int children;
}
你會的malloc內存一個大區塊,並建立您的樹在那裏。 (保留最後插入物品的地方的記憶計數器)。
你這樣做也可以添加字符串。
這樣你會有一個連續的內存塊,它會是一個簡單的內存拷貝。訪問一個簡單的演員將工作的項目。
意思是重寫樹和字符串代碼,但會保持一致。如果你不知道你的內存有多大,你可以這樣做,就是頁面,並將引用改爲一對整數,這將使分配內存更容易。
Peter。 PS:嵌入式工程師不是CUDA程序員,但遇到了類似的問題,不需要執行解析就可以跨處理器移動樹。