【发布时间】:2016-02-09 19:12:14
【问题描述】:
使用 C++ AMP 我需要遍历最大深度为 10 的四叉树。我知道 C++ AMP 不支持递归,因为它不需要设备有堆栈,但我希望它是能够推出一个小的有限递归深度调用树,因此它仍然可以在没有堆栈的情况下内联和处理。
喜欢
int recur(int i) restrict(amp) {
if (i <= 1) return 1;
else if (i > 5) return 1000; //just dummy code to limit the depth
else return i + recur(i - 1);
}
看来运气不好。不递归规则真的没有例外吗?
关于这个问题,我想知道使用 C++ AMP 遍历树的常用方法是什么。显然,我可以创建自己的每个线程堆栈,然后在深入之前推送当前节点,然后在返回的路上弹出,或者我可以扩展我的树以将“指针”保持在树上,不仅向下,而且...... .
找不到任何显示 C++ AMP 树遍历的示例,我想知道这里的最佳做法是什么?
编辑:我这样做是为了在 2D 域中查找邻居。我有 n 个随机定位的点,需要为每个点找到最近的邻居。这些点位于按空间填充曲线 (https://en.wikipedia.org/wiki/Z-order_curve) 排序的单个 1D 数组中,因此 1D 数组中接近的点在 2D 中也趋于接近,这反过来意味着它们倾向于共享许多邻居也是一样的。
【问题讨论】:
-
“树”在 GPU 代码的上下文中并不常见。 GPU 在历史上的分支预测很差,当您使用这种数据结构时,这确实会降低性能。首先执行所有代码,然后确定应该执行哪个分支是很常见的!也许使用“array-as-a-a-fixed-depth-tree”可能是有意义的。参见algoviz.org/OpenDSA/Books/OpenDSA/html/CompleteTree.html 此外,递归代码可以用迭代表示:参见programmers.stackexchange.com/questions/24997/…
-
感谢您的评论。您是正确的,如果不加以防范,树可能会导致发散,这对 gpu 来说是非常糟糕的。对于邻居搜索,沿着空间填充曲线对数据进行排序不会阻止这种情况,但会大大缓解这个问题。我将编辑我的问题以保存实际的使用场景,因为这是相关的。我的 cpu 版本的节点已经在一个平面数组中,我确实考虑过使用我自己的堆栈结构进行迭代遍历。我主要想知道“最好的”GPU 实现。
-
邻居查找是什么意思...对于 n 个点,为每个点查找最近的邻居?所以输入是(p1,p2,p3...),输出是点对(pa,pb)(pc,pd),...?你需要为每个点找到多少个邻居?
-
我需要在一定的搜索范围内找到所有的。