aru*_*zhi 2 parallel-processing fortran mpi fortran90
在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集体操作实现细节的文档?
集体操作的实施因MPI库而异.要查看的最佳位置是您正在使用/想要使用的具体库的源代码.
我可以告诉你Open MPI如何实现集体.Open MPI由不同组件(模块)所在的各个层组成.coll集合操作的框架使用较低级别的btl框架来传输消息.coll框架中实现了许多不同的算法以及实现这些算法的许多不同模块.评分机制用于选择库认为最适合您案例的模块,但这可以通过MCA参数轻松覆盖.最突出的一个是tuned经过充分测试的模块,可以在各种互连上很好地扩展,从共享内存到InfiniBand.该tuned模块对流程所处的位置一无所知.它只是使用btl框架来发送消息,btl并注意使用共享内存或网络操作.tuned模块中的一些算法是分层的,并且通过适当调整参数(OMPI的灵活性来自于许多内部MCA参数可以在不重新编译的情况下进行更改),可以使这些算法与集群的实际层次结构相匹配.还有另一个coll模块hierarch,它尽可能地收集尽可能多的物理拓扑信息并使用它来优化集体通信.
不幸的是,几乎所有MPI实现都是用C语言编写的,顶部有非常薄的层,以提供Fortran接口.所以,如果你想深入研究这个话题,我希望你对C语言有一定的了解.关于集体运营优化的研究论文也很多.其中一些是免费提供的,另一些是通过学术订阅提供的.