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

MPI是基于过程的。mpiexec程序通过ssh连接到每个可用节点,并在那里作为进程启动程序。至少,通常是这样做的。这就是SPMD:单程序多数据模型。所以,无论你写什么代码:main都是由每个节点(核心,无论什么;实际上:进程(相同地执行的。在MPI_Init并计算秩之前,每个MPI进程都会做完全相同的事情。

最新更新