重力n体问题如何并行解决?


Answers:


27

有各种各样的算法;Barnes Hut是一种流行的方法,而Fast Multipole方法是一种更为复杂的替代方法。ON O(NlogN)O(N)

两种方法都利用树数据结构,其中节点实际上仅与树的每个级别上与其最近的邻居进行交互。您可以考虑将树以足够的深度在一组进程之间进行拆分,然后让它们仅在最高级别上进行协作。

您可以在此处找到有关在petascale机器上讨论FMM的最新论文。


2
BH,也称为树代码,似乎在较低的精度上是可取的。这是一篇论文,其中的方法是自适应组合的,但是我还没有在实践中看到这项工作。
马特·克奈普利


8

作为替代来源,您还可以查看基于网格的类似Ewald的方法。“粒子网格”方法(例如PPPM和平滑的粒子网格Ewald)的起源在于模拟天体物理学的星系。与收费的关系是无意的副作用(恰好最终超过了最初的用法)。

最近,也有一些关于多级求和方法的文献,它们在本质上类似于快速多极方法和Barnes-Hut,但可能在不同情况下具有优势(更通用,更灵活的几何结构,某些效率提高等)。


8

对于经典的重力n体问题,我认为以下两篇论文在讨论力评估步骤的并行实现的实质方面做得很好。尽管论文讨论了GPU的实现,但它们在讨论并行性方面做得很好,并提供了算法的详细信息:

Nyland,Harris和Prins撰写的这篇论文介绍了CUDA中用于GPU的直接n体算法。

等纸由横田和巴尔巴还在GPU的计算的情况下对treecode和快速多极算法的一个很好的讨论

对n体数值模拟准确性提出的问题涉及更多,并且有如此多的重要细节,因此答案可以产生几本书。我认为最好的办法是给您一些参考书。我建议:

Sverre J. Aarseth的引力N体模拟

Hockney和Eastwood 使用粒子进行计算机模拟。(对不起,没有pdf版本)


4

如果您需要一种在渐近意义上不是最佳的简单实现方法,则可能需要考虑使用全聚集通信操作。由于每个N体都需要了解其他物体的引力效应,因此对于每个处理器来说,了解整个数据集都是很重要的。这就是所有聚集操作的作用。有一本很好的书:Michael J. Quinn(2004)撰写的《使用MPI和OPENMP的C并行编程》,在第82页上讨论了这个主题。也许值得一开始。


3
您正在描述“直接求和”,它是一种算法,具有巨大的通信量,因此仅建议用于极小的问题。由于交互具有结构,因此绝对不需要“每个处理器都知道整个数据集”。您的建议就像建议解决具有稠密线性代数的稀疏线性系统或使用气泡排序进行排序一样。O(n2)
杰德·布朗

确实如此。虽然,正如我前面所说,这是一个简单的实现,但不一定是有效的实现。
保罗

以某种方式+1的所有其他答案都假定OP正在寻找兆兆或千万亿级性能。FMM和akin仅与更幼稚的方法相反才有意义。
Stefano M

1

请参阅Google学术搜索,并查找对HACC和GADGET的引用以及其他代码。


2
您能否添加一些更多关于为什么推荐HACC和GADGET的详细信息?
保罗

1
它们都是引人注目的宇宙学代码,其中包括重力解算器。
杰夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.