我在C代码中实现了二进制搜索树。我的每个树节点都是这样的:
typedef struct treeNode {
int key;
struct treeNode *right;
struct treeNode *left;
} treeNode_t;
主持人制作的树。设备所做树的查询。
现在,让我们假设我已经在主机内存中完成了我的树构建。 我想将树的根复制到我设备的内存中。
复制树的根是不够的。因为右\左子项不在设备内存中。这是个问题。
所以,我的问题是将整个树复制到设备内存的最简单方法是什么?
答案 0 :(得分: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个字节也可能有所帮助。
答案 1 :(得分:1)
如果您的设备支持OpenCL 2.0,则可以使用Shared Virtual Memory
。在主机上创建的指针也将在设备上有效。以下是描述和二叉搜索树示例:opencl-2-shared-virtual-memory。