c++ - 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 进程都会做同样的事情。
推荐阅读
- iis - 在 .Net Core 2.1 及更高版本中获取 HttpStatusCode 504 ( DNS Name Not Found )
- android - Android 帐户列表为空
- apache-kafka - Kafka := 线程“主”org.apache.spark.sql.streaming.StreamingQueryException 中的异常:未找到连接条目
- android - “没有为属性'aptOptions.processorpath'指定值”问题
- reactjs - Visual Studio Code Intellisense 不适用于 Opencv.JS?
- python - 创建嵌套字典以遍历我的文本文件和文件夹以创建多个键字典
- c# - 将列表拆分为块 - C#
- java - 围绕其中心旋转 GLUT 位图/笔画字符串?
- r - 我是否通过标准化我的数据搞砸了我的整个数据科学作业?
- embedded - 嵌入式系统中的跨平台开发意味着什么?