我是MPI的新手,我试图理解MPI(特别是OpenMPI)是如何工作的,以便推断我的系统性能。
我试图在网上找资源来帮助我更好地理解事情,但是没有多少运气。我以为我会来这里。
现在我的问题很简单:如果我有3个节点(1个主节点,2个客户端)并且我发出MPI_Gather,根进程是按顺序还是同时处理传入数据?换句话说,如果进程1是第一个与进程0建立连接的进程,那么进程2是否必须等到进程1完成后才能开始发送数据?
谢谢!
答案 0 :(得分:1)
Open MPI中有多个组件实现集合操作,其中一些组件为每个操作的实现提供了多种算法。
您最感兴趣的是tuned
框架的coll
组件,因为这是Open MPI默认使用的组件。 tuned
使用点对点操作实现所有集合,并为收集提供了几种算法:
每种算法的性能在很大程度上取决于消息大小和排名数的特定组合,因此该库带有一组试探法,试图根据数据大小和通信器的大小确定最佳算法(如上所述)。有几种机制可以覆盖启发式,并强制使用某种算法或提供自定义算法选择规则列表。
基本线性算法只是在所有其他排序上依次接收其消息的根循环。在这种情况下,排名2将无法在排名1之前发送其组块,因为根将首先从排名1接收消息,然后继续排名为2.
线性同步算法将每个块分成两部分。第一部分按顺序收集,就像在基本线性算法中一样。第二部分是使用非阻塞接收异步收集的。
二项式算法将排名排列为二叉树。树节点处的进程从较低级别接收块并将它们聚合成较大的块,然后传递到较高层,直到它们达到根级别。
您可以在Open MPI source tree的tuned
文件夹中找到ompi/mca/coll/tuned
模块的源代码。在开发分支中,tuned
组件的一部分被提升为集合框架的基本实现,而聚集的代码可以在ompi/mca/coll/base
中找到。
答案 1 :(得分:0)
Hristo的答案当然很棒,但我想提出一个不同的观点。
与您的期望相反,问题不是简单。正如Hristo指出的那样,在不了解更多系统细节的情况下,甚至不可能专门回答它。这并不意味着问题无效,但您应该开始在不同的层面上推断绩效。
首先,考虑收集操作的复杂性:到根的总网络传输以及内存要求随着通信器中的进程数量线性增长。这自然会限制可扩展性。
其次,您可以假设您的MPI实现以尽可能最有效的方式实现MPI_Gather
- 比您手动执行更好。这个假设可能是错误的,但它是编写程序的最佳起点。
现在,当您拥有自己的计划时,您应该衡量并查看花费的时间 - 或浪费时间。为此,你应该MPI performance analysis tools。现在,如果您发现您的Gather对性能有重大影响,您可以继续尝试优化:但要做到这一点,首先要考虑您是否可以在概念上更好地构建通信,例如:通过某种方式一起删除计算或使用巧妙的减少。如果你仍然需要坚持聚集:继续并调整你的MPI实现。然后验证您的优化确实提高了特定系统的性能。