我试图找出MPI传播者中实际进程通信是如何发生的。我有8个节点,每个节点有12个核心(96个实例正在运行)。每个进程都分配了唯一的级别,并且进程之间能够相互通信。那么流程如何获得独特的排名并管理发送实际的消息?据一些幻灯片有打开运行时环境(ORTE),其中“驻留机器从哪个进程在该小区启动了。(集群例如,前端),负责对细胞启动进程。监控细胞的健康(节点,进程)。将单元状态报告给Universe的其余部分。在单元之间路由通信。“我还没有找到任何MPI实现的开发者文档和/或体系结构文章。任何人都有想法如何实现MPI流程之间的实际沟通,即他们如何设法找到自己并获得指定的排名?是否有一个中央或几个中央MPI内部流程用于路由(例如,每个节点)?
谢谢, 大卫
答案 0 :(得分:15)
您所谈论的机制严格依赖于实现。 MPI是一个中等水平的标准,它位于硬件和操作系统提供的通信机制之上。
ORTE是Open MPI的一部分 - 这是当今通用的MPI实现之一。还有MPICH和MPICH2及其变体(例如Intel MPI)。大多数超级计算机供应商都提供自己的MPI实现(例如IBM为Blue Gene / Q提供修改后的MPICH2)。
Open MPI功能的方式是它分为多个层,每个层的功能由多个动态加载的模块提供。有一种评分机制可以在某些条件下选择最佳模块。
所有MPI实现都提供了一种机制来执行所谓的SPMD启动。本质上,MPI应用程序是一种特殊的SPMD(单程序多数据) - 运行单个可执行文件的许多副本,并且消息传递被用作通信和协调的机制。它是SPMD启动器,它获取一系列执行节点,远程启动进程并建立它们之间的关联和通信方案(在Open MPI中称为MPI Universe)。它是创建全局MPI通信器MPI_COMM_WORLD并分配初始排名分配的一个,它可以提供诸如将进程绑定到CPU核心的选项(在NUMA系统上非常重要)。一旦启动了进程,就可以使用一些识别机制(例如,秩和IP地址/ TCP端口之间的映射),可以采用其他寻址方案。例如,Open MPI使用ssh
,rsh
启动远程进程,或者它可以使用不同资源管理系统提供的机制(例如PBS / Torque,SLURM,Grid Engine,LSF ......)。一旦进程启动并且它们的IP地址和端口号在Universe中被记录和广播,则这些进程可以在其他(更快的)网络上找到彼此,例如, InfiniBand,并在它们上建立通信路线。
路由消息通常不是由MPI本身完成的,而是留给底层通信网络。 MPI仅负责构建消息,然后将它们传递到网络以传递到目的地。对于驻留在同一节点上的进程之间的通信,通常使用共享内存。
如果您对技术细节感兴趣,我建议您阅读Open MPI的源代码。您可以在项目WEB site上找到它。