对八叉树进行线程化的有效方法,使得每个八字节包含在八位字节中的指针使得在遍历同一级别的树中的过程变得容易。
我们必须在这里使用完全线程化的树,以便我可以使用openmp在同一级别并行化代码。
答案 0 :(得分:3)
我对oct-trees有一些经验并且自己编写了几个。基本问题是树具有(至少)两个遍历方向:水平(在子单元之间)和垂直(在母单元和子单元之间),其不能映射到线性存储器。因此,遍历树(例如用于邻居搜索)将不可避免地导致缓存未命中。
对于最有效的实现,您应该将非最终单元的所有(最多8个)子单元放在一个连续的内存块中,避免在遍历它们时发生缓存未命中以及需要将它们链接起来用指针。然后每个单元只需要一个指针/索引用于它们的第一个子单元格,并且可能(取决于应用程序的需要)指向其母单元格的指针。
类似地,应该对由树排序的任何粒子/位置进行排序,使得包含在单元内的所有粒子/位置在所有树级别的内存中是连续的。然后每个单元只需要存储第一个和多个粒子,允许在树的每个级别(而不仅仅是最终单元格)访问它们。
实际上,可以通过首先构建完全链接的树然后将其映射到上述形式来实现这种排序。这种映射的开销很小,但应用程序的收益很大。
最后,当重新构建只有稍微改变的粒子位置的树时,它可以显着提高速度(取决于你的算法),将以前树序中的粒子提供给树构建算法。