MPI_Send / Recv与MPI_Reduce

时间:2014-01-07 15:14:59

标签: mpi

我得到了一点运动,我必须通过使用MPI来估算n个球体的总体积来实现蒙特卡罗算法,其中心和半径的坐标为3维。即使我们必须使用MPI,我们也可以在本地机器上启动所有进程,因此没有网络开销。我实现了这个版本的两个版本:

一,使用MPI_Send和MPI_Recv(其中等级0的过程仅等待其他人的部分结果执行最终总和) http://pastebin.com/AV41hJqn

另一方面,使用MPI_Reduce,此处等级0的过程也等待部分结果。 http://pastebin.com/8b0czv6a

我预计两个程序都会花费相同的时间来完成,但我发现使用MPI_Reduce的程序更快。为什么这个?差异在哪里?

1 个答案:

答案 0 :(得分:4)

可能有很多原因取决于您正在使用的MPI实现,您正在运行的硬件类型以及如何优化实施以利用它。 This Google Scholar search给出了关于此的各种工作的一些想法。为了给你一些可能的想法:

  • 由于减少可以在中间步骤中完成,因此可以使用different topology而不是基本等级0全部采集方法,并在延迟和带宽方面进行权衡。
  • 在计算节点内(或者在你的台式机或笔记本电脑上,如果你正在尝试解决玩具问题),可能会利用核心内部,CPU插槽核心之间或套接字之间的位置来订购计算和以对硬件更有效的方式进行通信。它听起来像this paper from IBM这样的摘要可能会给出一些关于这些设计决策的具体细节。或者,实现可能会选择缓存无关的方案,以便在通用计算节点内获得更好的性能。
  • 持久通信(MPI_Send_init和MPI_Recv_init)可以在MPI_Reduce实现中使用。这些例程可以perform better than their blocking and non-blocking counterparts由于提供MPI实现和硬件以及有关程序如何对其通信进行分组的额外细节。

这不是一个全面的列表,但希望它可以帮助您入门,并提供一些想法,以便在您感兴趣时搜索更多详细信息。