0

我正在研究一种遗传算法,我想尝试将一些函数放入 cuda 中,看看是否可以实现值得的加速。

目前的数据结构是一棵节点树,其中函数节点包含指向它们可能拥有的任何子节点的指针向量。我相信我需要将这棵树折叠成一个链表,可能是节点的向量(不是指针)。这些节点将包含指向其子节点的整数索引列表。通过这种方式,我可以将结构按值传递给 cuda。

  root/             (0)
  ├── add           (1)
  │   ├── 5         (2)
  │   └── divide    (3)
  │       ├── 10    (4)
  │       └── 5.7   (5)
  └── multiply      (6)
      ├── 1.2       (7)
      └── 77        (8)

它可以很容易地展平,但我担心进行这些更改将需要一些自定义函数,并且可能比 node->childNode[x] 样式结构的计算成本更高。

例如,如果我想用数字 7 替换除法及其子结构,我需要:

  • 流行成员 4,5
  • 将索引 3 处的除数更改为数字 7。
  • 更新根函数,使其第二个子函数的引用现在为 4。
  • 更新乘法函数,现在在 4,即子节点现在在 5 和 6

肯定有更好的办法?我不是 C++ 专家,所以我正在寻找建议和代码示例会非常有帮助!

4

1 回答 1

2

我建议保持你的树结构完全原样,除了用数组中的索引替换你的指针,正如 tera 所说。

我在说什么数组?您需要设置一个内存池(又名固定大小块分配器)。你可以谷歌这个。池基本上是一个包含任何节点类型的数组。您应该提前选择最大大小(树中需要的最大节点数)。然后,您将永远不必调整/增长这个数组。您的内存池类将具有 allocate 和 free 方法,但它们对数组的索引进行操作,而不是指针。

使用这种方法,您将能够非常便宜地进行您提到的树修改 - 使用内存池,分配和删除项目非常便宜,并且您永远不会在内存中复制/移动节点。

您将把树的根(同样,只是一个索引,而不是一个指针)连同内存池的数组一起传递给 GPU。

于 2013-04-26T09:30:03.470 回答