MPI_Send/Recv 与 MPI_Reduce

标签 mpi

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

一,使用 MPI_Send 和 MPI_Recv(其中排名 0 的进程只等待其他进程的部分结果来执行最终求和) http://pastebin.com/AV41hJqn

另一个,使用 MPI_Reduce,这里也是 0 级进程等待部分结果。 http://pastebin.com/8b0czv6a

我预计这两个程序将花费相同的时间完成,但我发现使用 MPI_Reduce 的程序更快。为什么这个?哪里不一样了?

最佳答案

可能有很多原因,具体取决于您使用的 MPI 实现、运行的硬件类型以及实现的优化程度以利用它。 This Google Scholar search给出了在这方面所做的各种工作的一些想法。给你一些关于它可能是什么的想法:

  • 由于缩减可以在中间步骤中完成,因此可以使用 different topology与基本的 rank 0 collect-from-all 方法不同,在延迟和带宽方面进行了权衡。
  • 在一个计算节点内(或者在您的台式机或笔记本电脑上,如果您尝试解决玩具问题),可以利用内核中的局部性、CPU 插槽上的内核之间或插槽之间的局部性来对计算进行排序和以一种对硬件更有效的方式进行通信。听起来像是this paper from IBM的摘要可能会给出一些关于这些设计决策的具体细节。或者,该实现可能会选择缓存不经意的方案,以便在通用计算节点内获得更好的性能。
  • 可以在 MPI_Reduce 实现中使用持久通信(MPI_Send_init 和 MPI_Recv_init)。这些例程可以perform better than their blocking and non-blocking counterparts由于向 MPI 实现和硬件提供了有关程序如何对其通信进行分组的额外详细信息。

这不是一个完整的列表,但希望它能帮助您入门,并提供一些想法,让您了解如何在有兴趣的情况下搜索更多详细信息。

关于MPI_Send/Recv 与 MPI_Reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975196/

相关文章:

c - MPI:广播一个 long long int

c++ - 使用 boost::mpi::packed_oarchive 和 packed_iarchive 进行未知子类的 MPI 传输

multithreading - MPI_Bcast 在 MPI 中使用线程 (OpenMP)

multithreading - MPI和pthreads : nodes with different numbers of cores

从 R 调用 MPI 以运行 C 代码

c++ - 将 MPI 与线程一起使用的正确方法是什么

linux - ubuntu安装mpich时添加路径

c++ - 这个 C++ 程序中的 MPI_Bcast() 是做什么用的?

c++ - 使用并行 I/O 复制大数据文件

c++ - 在 C++ 中实现事件并定期驱动 "script language"?