MPI_发送/接收与MPI_减少

MPI_发送/接收与MPI_减少,mpi,Mpi,有人给我做了一个小练习,我必须实现一个蒙特卡罗算法,使用MPI来估计n个球体的总体积,其中心和半径的坐标为3维。即使我们必须使用MPI,我们也可以在本地机器上启动所有进程,因此没有网络开销。我实现了本例的两个版本: 一种是使用MPI_Send和MPI_Recv(其中秩0的进程只等待其他进程的部分结果来执行最终求和) 另一种是使用MPI_Reduce,这里秩0的过程也会等待部分结果。 我希望这两个程序需要相同的时间才能完成,但我发现使用MPI_Reduce的程序速度更快。为什么会这样?区别在哪

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

一种是使用MPI_Send和MPI_Recv(其中秩0的进程只等待其他进程的部分结果来执行最终求和)

另一种是使用MPI_Reduce,这里秩0的过程也会等待部分结果。


我希望这两个程序需要相同的时间才能完成,但我发现使用MPI_Reduce的程序速度更快。为什么会这样?区别在哪里?

可能有很多原因,这取决于您使用的是哪种MPI实现,您运行的是哪种硬件,以及实现如何优化以利用这一点。给出了在这方面所做的各种工作的一些想法。给你一些关于它可能是什么的想法:

  • 由于减少可以在中间步骤中完成,因此可以使用一种比基本秩0从所有方法中收集更高的方法,并在延迟和带宽方面进行权衡
  • 在计算节点内(或者在您的台式机或笔记本电脑上,如果您正在尝试解决一个玩具问题),可以利用内核内、CPU插槽上的内核之间或插槽之间的局部性,以更高效的方式对计算和通信进行排序。从抽象的角度来看,它可能会给出一些关于这些设计决策的具体细节。或者,实现可能会选择一种缓存无关方案,以便在通用计算节点中获得更好的性能
  • 持久通信(MPI_Send_init和MPI_Recv_init)可以在MPI_Reduce实现中的后台使用。这些例程可能是由于为MPI实现和硬件提供了关于程序如何分组其通信的额外细节

这不是一个全面的列表,但希望它能让您开始,并为您提供一些想法,如果您感兴趣,如何搜索更多详细信息。

您的
MPI\u Reduce
示例可以计算所有等级,包括等级0。我想这不是问题所在。例如,使用Send/Recv,我启动了5个进程,其中4个工作,第一个等待结果。使用Reduce,我启动了4个流程,它们都可以工作。因此,在这两种情况下,始终有4个进程在工作。您能否提供一些基准,即两种算法和一组输入文件的计时?如果在同一台机器上运行进程,那么这两种算法之间的速度应该没有明显差异,尽管共享内存通信也有非零延迟。