在MPI中,每个等级都有一个唯一的地址空间,它们之间的通信通过消息传递发生。
我想知道 MPI如何在具有共享内存的多核计算机上运行。 如果排名在两台不具有共享内存的不同机器上,则MPI必须使用消息进行通信。但如果排名在同一台物理机器上(但每个排名仍有不同的地址空间),MPI调用是否会利用共享内存?
例如,假设我正在发出ALLREDUCE电话。我有两台机器M1和M2,每台机器有2个核心。等级R1和R2在机器M1的核心1和核心2上,R3和R4在机器M2的核心1和2上。 ALLREDUCE将如何发生?是否会传输超过1条消息? 理想情况下,我希望R1和R2使用可用的共享内存(类似R3和R4)进行减少,然后在M1和M2之间进行消息交换。
是否有任何文档可以让我了解MPI中集体操作的实现细节?
答案 0 :(得分:6)
集体操作的实施因MPI库而异。最好看的地方是您正在使用/想要使用的具体库的源代码。
我可以告诉你Open MPI如何实现集体。 Open MPI由不同组件(模块)所在的各个层组成。集合操作的coll
框架使用较低级别的btl
框架来传输消息。在coll
框架中实现了许多不同的算法以及实现这些算法的许多不同模块。评分机制用于选择库认为是您案例的最佳模块,但这可以通过MCA参数轻松覆盖。最突出的一个是tuned
模块,该模块经过了良好的测试,可以在各种互连上很好地扩展,从共享内存到InfiniBand。 tuned
模块对进程所在的位置一无所知。它只使用btl
框架发送消息,btl
注意使用共享内存或网络操作。 tuned
模块中的一些算法是分层的,并且通过适当调整参数(OMPI的灵活性来自于许多内部MCA参数可以在不重新编译的情况下进行更改),可以使这些算法与实际的层次结构相匹配。集群。还有另一个名为coll
的{{1}}模块,它尽可能地收集尽可能多的物理拓扑信息并使用它来优化集体通信。
不幸的是,几乎所有MPI实现都是用C语言编写的,顶部有非常薄的层,以提供Fortran接口。所以,如果你想深入研究这个话题,我希望你对C语言有一定的了解。关于集体运营优化的研究论文也很多。其中一些是免费提供的,另一些可通过学术订阅获得。
答案 1 :(得分:2)
由于这是您正在使用的MPI实现的实现细节,我想最好在邮件列表中询问您正在使用的任何MPI实现。或者,在Google学者或其他网站上搜索“mpi collective”以搜索科学论文会给你带来很多点击。
但是,合理的实现是首先使用共享内存在节点内进行缩减,以减少网络消息的数量。