首页 > 解决方案 > MPI通信器的范围

问题描述

我是 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 本身的包装器。

标签: c++multithreadingboostscopempi

解决方案


MPI 是基于过程的。mpiexec 程序与每个可用节点建立 ssh 连接,并在那里将您的程序作为进程启动。至少,通常情况下是这样的。这就是所谓的 SPMD:单程序多数据模型。因此,无论您编写什么代码:main 都由每个节点(核心,无论如何;实际上:进程)以相同的方式执行。在您MPI_Init计算排名之前,每个 MPI 进程都会做同样的事情。


推荐阅读