2015-08-08 33 views
0

我在C代碼中實現了二進制搜索樹。我的每個樹節點如下所示:OpenCL - 將樹複製到設備內存

typedef struct treeNode { 
    int key; 
    struct treeNode *right; 
    struct treeNode *left; 
} treeNode_t; 

由主機制作的樹的構造。設備製作的樹的查詢。

現在,讓我們假設我已經建好我的樹在主機內存。 我想複製我的樹的根到我的設備的內存。

複製樹的根目錄是不夠的。因爲右側\左側的孩子不在設備內存中。這是個問題。

所以,我的問題是什麼是我的整個樹複製到設備內存的最簡單的方法?

+0

如果你的樹節點正好是20個字節,可以填充它,直到它變成32首或64個字節,然後重新計算,使得它們成爲在地址空間連續的所有地址,使最小地址零,並從其他減去其價值和保存在其他一些字段中的舊地址(例如填充字段)然後在設備中計算,同時保持主機地址和設備地址的相對地址不變。 –

+0

你打算在OpenCL中用這棵樹做什麼? – dtech

回答

1

如果您的設備支持的OpenCL 2.0,那麼你可以使用Shared Virtual Memory。在主機上創建的指針也將在設備上有效。以下是描述和二叉搜索樹示例:opencl-2-shared-virtual-memory

2

最簡單的(可能也是最好)的方法是改變你的結構使用節點指標,而不是指針。指針的問題在於設備具有不同的指針,即使您單獨複製所有節點,它仍然無法工作,因爲指針也需要更新爲設備指針。不幸的是,OpenCL 1.2甚至不保證器件指針的有效期比單個內核調用更長。出於這個原因,你必須至少在設備上使用索引而不是指針。

修改您的結構是這樣的:

typedef struct treeNode { 
    int key; 
    int left; 
    int right; 
} treeNode_t; 

之前建立的樹你分配樹節點的一個大陣,大到足以容納所有節點。

treeNode_t nodes[MAX_NODES]; // or dynamic allocation 
int first_free_node=0; 

每次你通常會分配一個新的節點,您現在使用節點[first_free_node]來存儲數據並增加first_free_node計數器。當您完成構建樹時,您可以使用一個clEnqueueCopyBuffer調用將所有節點複製到設備。您只需將first_free_node * sizeof(treeNode_t)個字節從節點陣列的起始位置複製到設備。如果您無法更改主機樹構建代碼,則可以使用樹的簡單遞歸深度第一次傳輸來計算節點數並將節點從基於指針的格式轉換爲基於索引的格式。

在某些設備上,如果您轉換您的樹的結構,從結構的陣列排列的結構,你可能會得到更高的性能。將結構填充到每個節點16個字節也可以提供幫助。