【问题标题】:OpenCL - copy Tree to device memoryOpenCL - 将树复制到设备内存
【发布时间】:2015-08-08 13:05:03
【问题描述】:

我在 C 代码中实现了二叉搜索树。我的每个树节点都如下所示:

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

宿主制作的树的构造。设备对树的查询。

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

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

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

【问题讨论】:

  • 如果你的树节点正好是 20 字节,你可以填充它直到它变成 32 或 64 字节,然后重新计算所有地址,使它们在地址空间中变得连续,使最小的地址为零并减去它的来自其他人的值并将旧地址保存在其他一些字段(例如填充字段)中,然后在设备中计算,同时保持主机地址和设备地址的相对地址不变。
  • 你打算用 OpenCL 中的那棵树做什么?

标签: c tree opencl binary-tree


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2013-07-27
      • 1970-01-01
      • 2018-07-17
      • 2020-09-11
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多