C++ 如何减少Barnes-Hut N-Body编码为C++;和MPI并行实现
为了用Barnes-Hut算法模拟N体问题进行并行实现,我如何减少进程间通信(IPC)时间来构建高效的代码C++ 如何减少Barnes-Hut N-Body编码为C++;和MPI并行实现,c++,parallel-processing,ipc,C++,Parallel Processing,Ipc,为了用Barnes-Hut算法模拟N体问题进行并行实现,我如何减少进程间通信(IPC)时间来构建高效的代码 目前,对于我的C++和MPI实现,使用的处理器越多,进程间的通信时间也越多,这就大大降低了并行执行的执行时间。 我是否可以减少进程间通信(IPC)时间来构建高效代码? 简短回答:是的,但它不会使代码变得更好,就像您优化了任何其他部分一样 为了更好地阐明这一结论,让我们添加更多的细节,对于这些细节,让我们再次使用Barnes-Hut算法运行时分析,如TU Delft发布的: 通过发送消息访问
目前,对于我的C++和MPI实现,使用的处理器越多,进程间的通信时间也越多,这就大大降低了并行执行的执行时间。 我是否可以减少进程间通信(IPC)时间来构建高效代码?
简短回答:是的,但它不会使代码变得更好,就像您优化了任何其他部分一样 为了更好地阐明这一结论,让我们添加更多的细节,对于这些细节,让我们再次使用Barnes-Hut算法运行时分析,如TU Delft发布的: 通过发送消息访问哈希表的远程部分来遍历Barnes Hut树。有许多标准技术可以降低所需的通信量,包括重叠通信和计算、预取树的部分、按树节点可用的顺序(而不是按它们在树中出现的顺序)处理树节点以及缓存。以下是从文献中获得的天体物理计算的一些性能结果,同样是在512处理器Intel Delta上。模拟涉及880万个粒子,这些粒子最初是均匀分布的。巴恩斯小屋一步的时间为114秒,或5.8千兆次。时间的划分是
分解域7秒
建树7秒
树遍历33秒
穿越6秒期间的通信欢迎来到StackOverflow,@Martin您可能已经知道,StackOveflow社区采用了所谓的MCVE格式的问题定义。请随意重新阅读社区实践,并查看/更新您的帖子,以符合此最佳实践。(+在大学里,你的教授不想看到一个带有轴图例的图表,其中2.5体问题似乎被提升为一个可预期的实验装置……最好回顾一下图表,以便停留在物理现实的范围内:o)
)@uers366197谢谢你的评论。我的图表有什么问题?对不起,我不太明白。欢迎,@Martin,在第一轮中,我没有看到刚才出现在我眼前的x1E4
。我有罪。。。然而,在轴文本中的缩放应该是正确的,比如“体的数量[1]x1e4”。接下来,几乎可以肯定的是,在实际运行的几个离散数量的实验之间,计算时间不是线性的——如果没有其他原因,主要是由于缩放的逐步不利影响、不断增长的缓存线未命中效应等。因此,它应该是实验的“曲线图”,而不是外推曲线图(然而,错误)提出了每一部分的线性模型,不是吗?最后一点,您是否介意发布实际代码执行平台的NUMA拓扑细节?至少是lscpu
+hwloc/lstopo
输出?感谢您的帮助。也许我应该把我的问题重新表述如下:你有论文或源代码的链接吗?谢谢
Decomposing the domain 7 seconds
Building the tree 7 seconds
Tree traversal 33 seconds
Communication during traversal 6 seconds <------- 6 / 114 ~ < 5 %
Force evaluation 54 seconds
Load Imbalance 7 seconds
Total 114 seconds