dav*_*dlt 6 parallel-processing mpi openmpi
我试图找出MPI通信器中实际进程通信是如何发生的.我有8个节点,每个节点有12个核心(96个实例正在运行).每个进程都分配了唯一的级别,并且进程之间能够相互通信.那么流程如何获得独特的排名并管理发送实际的消息?根据一些幻灯片,有一个开放运行时环境(ORTE),它"驻留在该单元上启动进程的机器上.(例如,集群的前端).负责在单元上启动进程.监视单元健康状况(节点,进程).将单元状态报告给Universe的其余部分.在单元之间路由通信." 我还没有找到任何MPI实现的开发者文档和/或体系结构文章.任何人都有想法如何实现MPI流程之间的实际沟通,即他们如何设法找到自己并获得指定的排名?是否有中央或多个中央MPI内部流程进行路由(例如,每个节点)?
谢谢,大卫
Hri*_*iev 18
您正在谈论的机制严格依赖于实现.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站点上找到它.