OpenMPI如何收集工作?

时间:2016-10-14 05:11:50

标签: mpi openmpi

我是MPI的新手,我试图理解MPI(特别是OpenMPI)是如何工作的,以便推断我的系统性能。

我试图在网上找资源来帮助我更好地理解事情,但是没有多少运气。我以为我会来这里。

现在我的问题很简单:如果我有3个节点(1个主节点,2个客户端)并且我发出MPI_Gather,根进程是按顺序还是同时处理传入数据?换句话说,如果进程1是第一个与进程0建立连接的进程,那么进程2是否必须等到进程1完成后才能开始发送数据?

谢谢!

2 个答案:

答案 0 :(得分:1)

Open MPI中有多个组件实现集合操作,其中一些组件为每个操作的实现提供了多种算法。

您最感兴趣的是tuned框架的coll组件,因为这是Open MPI默认使用的组件。 tuned使用点对点操作实现所有集合,并为收集提供了几种算法:

  • 线性同步 - 当消息大到中等时使用
  • 二项 - 当进程数量很大或邮件大小很小时使用
  • 基本线性 - 用于所有其他情况

每种算法的性能在很大程度上取决于消息大小和排名数的特定组合,因此该库带有一组试探法,试图根据数据大小和通信器的大小确定最佳算法(如上所述)。有几种机制可以覆盖启发式,并强制使用某种算法或提供自定义算法选择规则列表。

基本线性算法只是在所有其他排序上依次接收其消息的根循环。在这种情况下,排名2将无法在排名1之前发送其组块,因为根将首先从排名1接收消息,然后继续排名为2.

线性同步算法将每个块分成两部分。第一部分按顺序收集,就像在基本线性算法中一样。第二部分是使用非阻塞接收异步收集的。

二项式算法将排名排列为二叉树。树节点处的进程从较低级别接收块并将它们聚合成较大的块,然后传递到较高层,直到它们达到根级别。

您可以在Open MPI source treetuned文件夹中找到ompi/mca/coll/tuned模块的源代码。在开发分支中,tuned组件的一部分被提升为集合框架的基本实现,而聚集的代码可以在ompi/mca/coll/base中找到。

答案 1 :(得分:0)

Hristo的答案当然很棒,但我想提出一个不同的观点。

与您的期望相反,问题不是简单。正如Hristo指出的那样,在不了解更多系统细节的情况下,甚至不可能专门回答它。这并不意味着问题无效,但您应该开始在不同的层面上推断绩效。

首先,考虑收集操作的复杂性:到根的总网络传输以及内存要求随着通信器中的进程数量线性增长。这自然会限制可扩展性。

其次,您可以假设您的MPI实现以尽可能最有效的方式实现MPI_Gather - 比您手动执行更好。这个假设可能是错误的,但它是编写程序的最佳起点。

现在,当您拥有自己的计划时,您应该衡量并查看花费的时间 - 或浪费时间。为此,你应该MPI performance analysis tools。现在,如果您发现您的Gather对性能有重大影响,您可以继续尝试优化:但要做到这一点,首先要考虑您是否可以在概念上更好地构建通信,例如:通过某种方式一起删除计算或使用巧妙的减少。如果你仍然需要坚持聚集:继续并调整你的MPI实现。然后验证您的优化确实提高了特定系统的性能。