![]() |
1
2
最简单(可能也是最好的)方法是更改结构,使用节点索引而不是指针。指针的问题是设备具有不同的指针,即使您单独复制所有节点,它仍然无法工作,因为指针也需要更新为设备指针。不幸的是,OpenCL 1.2甚至不能保证设备指针比单个内核调用的有效时间更长。因此,您必须至少在设备上使用索引而不是指针。 像这样修改结构:
在构建树之前,要分配一个很大的树节点数组,足够容纳所有节点。
每次通常分配一个新节点时,现在都使用节点[first_free_node]来存储数据并递增first_free_node计数器。构建完树后,只需使用单个clEnqueueCopyBuffer调用即可将所有节点复制到设备。您只需要将first_free_node*sizeof(treeNode_t)字节从节点阵列的开始复制到设备。如果无法更改宿主树构建代码,可以使用树的简单递归深度第一遍历来计算节点数,并将节点从基于指针的格式转换为基于索引的格式。 在某些设备上,如果将树的结构从结构数组转换为数组结构,则可能会获得更高的性能。将结构填充到每个节点16字节也会有所帮助。 |
![]() |
2
1
如果您的设备支持OpenCL 2.0,则可以使用
|
![]() |
Zevvysan · 为什么我的打印函数之一要删除节点? 7 年前 |
|
user9573040 · 递归二叉树高度 7 年前 |
![]() |
Dipesh Desai · 在二叉树haskell中搜索值 7 年前 |
![]() |
ibrahim · “main”已停止工作-C++[开发人员++] 7 年前 |