【发布时间】: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()之后。 -
好的,谢谢您的回复。
标签: c++ multithreading boost scope mpi