穿上八叉树

Threading an octree

本文关键字:八叉树      更新时间:2023-10-16
线程

化八叉树的有效方法,使得八进制中每个八位字节中包含的指针可以轻松地在同一级别遍历树。

我们必须在这里使用全线程树,以便我可以使用 openmp 在同一级别并行化代码。

我对八点树有一些经验,自己也编写了几个。基本问题是树(至少)有两个遍历方向:水平(子细胞之间)和垂直(母细胞和子细胞之间),它们不能映射到线性记忆。因此,遍历树(例如,用于邻居搜索)将不可避免地导致缓存未命中。

对于最有效的实现,您应该将非最终单元的所有(最多 8 个)子单元放在一个连续的内存块中,从而避免遍历它们时出现缓存未命中,也避免需要将它们与指针链接起来。然后,每个单元只需要一个指针/索引用于其第一个子单元,并且可能(取决于应用程序的需要)一个指向其父单元的指针。

同样,按树排序的任何粒子/位置

都应按顺序排序,以便单元格中包含的所有粒子/位置在所有树级别上在内存中都是连续的。然后,每个细胞只需要存储第一个粒子和粒子数量,允许在树的每个级别(不仅仅是最终细胞)访问所有粒子。

在实践中,这种排序可以通过首先构建一个完全链接的树,然后将其映射到上述形式来实现。此映射的开销很小,但应用程序中的收益很大。

最后,当仅略微改变粒子位置的重新构建树时,可以显着加快(取决于您的算法)将前一个树顺序中的粒子馈送到树构建算法。