MPI通信器的范围
Posted
技术标签:
【中文标题】MPI通信器的范围【英文标题】:Scope of MPI communicator 【发布时间】:2021-09-13 06:21:45 【问题描述】:我是 MPI 的新手,想尝试一下它,即围绕它的 boost 包装器实现。所以现在我想知道“何时”MPI 究竟开始在多个节点上工作。我在文档中读到:
mpi::environment 对象在您的主程序中使用程序参数(它可能会修改)进行初始化。该对象的创建初始化 MPI,其销毁将完成 MPI。在绝大多数 Boost.MPI 程序中,mpi::environment 的实例将在程序的最开始时在 main 中声明。
但是,如果我希望代码在初始化 MPI 之前做几件事(仅在主节点上),但又不想在它们周围有 if 子句,该怎么办。 MPI 是否只是在多个节点上启动相同的代码,而通信器只是告诉不同的节点它们拥有哪个进程号?然后开发人员通过子句决定哪个节点执行哪些操作?或者多节点环境实际上是从 MPI 的实例化开始的吗?我可以做这样的事情吗?例如:
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <iostream>
int main(int, char**)
std::cerr << "I am something on the main process should do." << std::endl;
boost::mpi::environment env;
boost::mpi::communicator world;
std::cerr << "I am process " << world.rank() << " of " << world.size() << "." << std::endl;
return 0;
在我看来,这不会仅限于提升 MPI,因为它只是 MPI 本身的包装器。
【问题讨论】:
虽然 MPI 标准没有指定在MPI_Init()
之前和MPI_Finalize()
之后发生什么,但大多数实现在调用mpirun
时启动所有程序(这意味着所有任务并行执行之前的代码MPI_Init()
和 MPI_Finalize()
之后。
好的,谢谢您的回复。
【参考方案1】:
MPI 是基于进程的。 mpiexec 程序与每个可用节点建立 ssh 连接,并在那里将您的程序作为进程启动。至少,通常情况下是这样的。这就是所谓的 SPMD:单程序多数据模型。因此,无论您编写什么代码:main 都由每个节点(核心,无论如何;实际上:进程)以相同的方式执行。在您MPI_Init
并计算排名之前,每个 MPI 进程都会做同样的事情。
【讨论】:
我明白了,谢谢你的详细回答。以上是关于MPI通信器的范围的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mpi scatter 修复“矢量下标超出范围”?
MPI学习3MPI并行程序设计模式:不同通信模式MPI并行程序的设计