让我们考虑MPI应用程序的以下简单场景:根进程广播(MPI_Bcast
)一些参数(几十字节-固定大小),然后所有节点开始执行一些计算,然后根收集结果(MPI_Gather
-可能是非常大的数据集)。根目录保存数据后,程序结束。
在什么情况下(进程数、延迟等)(如果有的话),使用使用虚拟星形拓扑创建的通信器会比使用MPI_COMM_WORLD
提供更好的性能?为什么?通信器是否对实际信道使用延迟初始化(即,仅在第一次需要时打开管道、插座等)。此行为是否依赖于实现?
注意:我使用的是openmpi1.4.3-2
和纯C。
最佳答案
通信器拓扑是方便的映射特性,它们不需要改变实际通信的方式。即使给定在星形或任何其他图形拓扑中存在未连接的进程(在拓扑意义上),如果它们知道通信器中另一个进程的秩,这也不会阻止它们相互发送消息。MPI实现可以使用拓扑作为一个提示,以优化通信路径,但这会使它们成为非常复杂的代码片段,而且至少开放式MPI在其集合算法中没有做到这一点(未经过很好的测试,因此通常禁用hierarch
集合组件会考虑硬件层次结构,但不会虚拟拓扑)。
如果将reorder=1
赋给通信器构造函数,拓扑可能通过列组重新排序影响通信。这使得MPI实现可以自由地重新排序进程列组,以便尽可能地将它们的物理位置与提供给构造函数的拓扑方案相匹配,前提是下面硬件的物理拓扑。有专用网络的硬件平台用于集体操作。例如,IBM Blue Gene/P有一个允许快速实现MPI_BARRIER
的全局中断网络和一个加速一些集体操作(包括广播)的专用集体网络。但这些功能仅在MPI_COMM_WORLD
上可用-回退软件实现用于任何其他通信器。
此行为是否依赖于实现?
是的,它依赖于实现和系统(对于支持多个硬件/通信系统的实现)。这也是你其余问题的答案。
关于c - MPI星型(中心辐射型)通信器的性能是否优于MPI_COMM_WORLD?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13892768/