使用Barnes-Hut算法并行实现模拟N体问题,如何减少进程间通信(IPC)时间以构建高效代码?
目前,对于我的C ++和MPI实现,使用的处理器/内核越多,使用的进程间通信时间就越多,这大大减慢了并行实现的执行时间。
答案 0 :(得分:0)
我可以减少进程间通信(IPC)构建高效代码的时间吗?
为了更清楚地了解这个结论,让我们再添加一些细节,让我们重新使用Barne-Hut算法运行时分析,就像TU Delft发布的那样:
通过发送消息来访问哈希表的远程部分来遍历Barnes-Hut树。有许多标准技术可以降低所需的通信,包括重叠通信和计算,预取树的各个部分,按照它们变得可用的顺序处理树节点而不是它们在树中出现的顺序,以及缓存。
以下是从文献中获取的天体物理学计算的一些性能结果,再次在512处理器Intel Delta上。模拟中涉及880万个粒子,这些粒子最初是均匀分布的。 Barnes-Hut一步的时间是114秒,即5.8 Gflops。时间的细分是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
因此,力评估的浮点工作几乎花费了一半的时间,因此实现效率相当高。在计算的后期阶段,粒子变得高度聚集,时间增加到160秒,但与上面的时序分解大致相同。
看过这个,有95%的时间,每次迭代需要大约108秒,这比运行时间的某些部分削减的机会要高得多,因为IPC保留了N体算法“在一起”正确“跨越” - 分布式计算基础架构的足迹。
相对改进速度提高100%的IPC模块(涉及不存在或不可用的IPC技术技巧)可以节省不超过3秒的费用(但是,未知的附加副作用成本)。
相反,相比非快速增加10%的非IPC处理块的相对改进将带来一个 ~10.6秒的账单,附加的副作用成本为零,甚至在IPC实现(驱动程序,堆栈等)部分略有改进。
这更像是一个专业的管理现实成本/收益(和副作用)而非算法问题。