OpenCL - 将树复制到设备内存

OpenCL - copy Tree to device memory

我用 C 代码实现了 Binary-Search-Tree。我的每个树节点如下所示:

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

宿主建造的树。设备对树的查询。

现在,假设我已经在主机内存中完成构建我的树。 我想将树的根复制到设备的内存中。

复制树的根是不够的。因为 right \ left child 不在设备内存中。这是个问题。

那么,我的问题是将整棵树复制到设备内存的最简单方法是什么?

最简单(也可能是最好)的方法是更改​​结构以使用节点索引而不是指针。指针的问题是设备有不同的指针,即使你单独复制所有节点,它仍然无法工作,因为指针也需要更新为设备指针。不幸的是,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 字节也有帮助。

如果您的设备支持 OpenCL 2.0,那么您可以使用 Shared Virtual Memory。在主机上创建的指针在设备上也将有效。这是描述和二叉搜索树示例:opencl-2-shared-virtual-memory.