最簡單的(可能也是最好)的方法是改變你的結構使用節點指標,而不是指針。指針的問題在於設備具有不同的指針,即使您單獨複製所有節點,它仍然無法工作,因爲指針也需要更新爲設備指針。不幸的是,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個字節也可以提供幫助。
如果你的樹節點正好是20個字節,可以填充它,直到它變成32首或64個字節,然後重新計算,使得它們成爲在地址空間連續的所有地址,使最小地址零,並從其他減去其價值和保存在其他一些字段中的舊地址(例如填充字段)然後在設備中計算,同時保持主機地址和設備地址的相對地址不變。 –
你打算在OpenCL中用這棵樹做什麼? – dtech