莫顿订购点的平行四晶构建
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 实现。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 用CMake构建C++协议
- Mingw-64 在构建和安装后不会编译 openCV 代码