OpenCL – 将树复制到设备内存

我在C代码中实现了二进制搜索树。 我的每个树节点都是这样的:

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

由主人制作的树的构造。 设备所做树的查询。

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

复制树的根本它是不够的。 因为右\左子不在设备内存中。 这是个问题。

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

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

最简单(也可能是最好的)方法是将结构更改为使用节点索引而不是指针。 指针的问题是设备有不同的指针,即使你单独复制所有节点,它仍然无法工作,因为指针也需要更新到设备指针。 不幸的是,OpenCL 1.2甚至不能保证设备指针的保持时间长于单个内核调用。 因此,您必须至少在设备上使用索引而不是指针。

像这样修改你的结构:

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

在构建树之前,您需要分配一个大的树节点arrays,大到足以容纳所有节点。

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

每次通常分配新节点时,现在使用节点[first_free_node]来存储数据并递增first_free_node计数器。 完成构建树后,只需使用单个clEnqueueCopyBuffer调用即可将所有节点复制到设备。 您只需要将nodes_ array的起始处的first_free_node * sizeof(treeNode_t)字节复制到设备。 如果您无法更改主机树构建代码,则可以使用树的简单递归深度第一个travesal来计算节点数,并将节点从基于指针的格式转换为基于索引的格式。

在某些设备上,如果将树的结构从结构数组转换为数组结构,则可能会获得更高的性能。 将结构填充到每个节点16个字节也可能有所帮助。