莫顿订购点的平行四晶构建

parallel quadtree construction from morton ordered points

本文关键字:构建      更新时间:2023-10-16

我有一个分类的点[(x1,y1),(x2,y2), ..., (xn,yn)]集合。我希望并行从这些点构建一个Quadtree。我的直觉是在每个核心上构建一个子树,并合并所有子树以形成一个完整的Quadtree。谁能提供一些高级见解或伪代码,我该如何有效地做到这一点?

首先对您的计划进行一些思考:

  • 您确定并行的结构会有所帮助吗?我认为您的速度不会太大。CPU上的Quadtree构造非常便宜,因此它将部分受您的内存带宽约束。除非您有单独的内存总线,例如单独的计算机,否则并行化可能无济于事。
  • 如果您想在并行机器上并行化构造,则可以简单地在均匀尺寸的块中拆分您的点收集来创建单独的四分之一。这比另一个解决方案具有一个重要的优势:当您要插入更多点或想要查找点时,Morton订单使您可以非常有效地确定哪个树包含点(或应包含它,以插入(。对于窗口查询,您可以进行类似的优化,如果"最小/最小"的莫尔顿编码和查询窗口的"最大/最大"角位于相同的"块"(子树(中,那么您就可以只需要查询这棵树即可。可以进行更多优化。

如果您真的想在一台计算机上创建单个Quadtree,则有几种有效拆分数据集的方法:

  • 遍历所有点并确定全球最小/最大。然后穿过所有点并将它们分配(假设4个核(到每个核心,每个核心代表一个象限。通过将数据集分为4个均匀尺寸的块,这些步骤可平行,并且会导致Quadtree完全适合您的数据集。您将必须将插入插入到树上,但是由于数据集是莫尔顿订购的,因此锁碰撞相对较少。
  • 您可以通过将quadtrant与Morton坐标对准在插入过程中完全避免锁定碰撞,从而使Morton-Curve(Z-Curve(仅越过象限边界一次。缺点:树将不平衡,即所有象限都不可能包含相同数量的数据。这意味着您的CPU可能具有相当不同的工作负载,除非您将子树拆分为子树,否则依此类推,以更好地分配负载。可以在您的坐标的Morton代码/Z代码上识别用于避免Z曲线交叉边框的Z-Curve的拆分平面。将z代码分成两个位,每个块都告诉您要选择哪个(子(象限,即00在下/左/左,01是下/右,10是上/左/左/左,11是上/右。由于您的观点是莫顿订购的,因此您只需使用二进制搜索即可找到每个象限的块。我意识到这听起来可能很神秘,没有更多的解释。因此,也许您可以看一下pH-Tree,它本质上是由z排序(已订购的(Quadtree(而不是"树"(。这里和这里也有一些深入的解释(无耻的自我广告(。pH树具有一些不错的特性,例如固有地将深度限制为64个级别(用于64位数字(,同时保证小节点(4个条目最大为2个维度(;它还可以保证像Quadtree一样,任何插入/删除都不会影响一个以上的节点,再加上可能添加或删除第二个节点。这里还有一个C 实现。