1.初探MPI——MPI简介

news2024/11/17 16:14:58

系列文章目录

  1. 初探MPI——MPI简介
  2. 初探MPI——点对点通信
  3. 初探MPI——集体通信

文章目录

  • 系列文章目录
  • 前言
  • 一、MPI_COMM_WORLD, size and ranks
  • 二、Hello World
    • Instructions
  • 总结
  • 参考


前言

Message Passing Interface (MPI) 是一种标准化的消息传递库接口规范。该标准是消息传递模型的一种标准,该标准大量运用在科学计算领域。详尽的介绍参看MPI Tutorials。


一、MPI_COMM_WORLD, size and ranks

当一个程序使用MPI运行时,所有进程都被分组到一个叫通信器(communicator)中,它们之间能相互通信。每个通信都链接到一个通信器,允许通信到达不同的进程。通信有两种类型:

  • 点对点(point to point)通信 Two processes in the same communicator are going to communicate.
  • 集体性(collective)通信All the processes in a communicator are going to communicate together.

默认通信器叫MPI_COMM_WORLD,它对程序启动时的所有进程进行分组。看下面的例子,一个程序,它运行了五个进程。每个进程都是相互连接的,并且可以在此通信器内进行通信。
在这里插入图片描述MPI_COMM_WORLD 不是 MPI 中唯一的通信者。在接下来的章节中介绍如何创建自定义通信器,但目前,让我们坚持使用 MPI_COMM_WORLD .在接下来的章节中,每次提到communicator时,只需将其替换为 MPI_COMM_WORLD .

communicator中的号码在创建后不会更改。该数字称为communicator的大小(size)。同时,communicator中的每个进程都有一个唯一的编号来识别它。此数字称为进程的秩(rank)。在前面的示例中,MPI_COMM_WORLD 的size为 5。每个进程的rank是每个圆圈内的数字。进程的秩始终在 0 到 size - 1 之间 。

二、Hello World

编写一个跨多个进程的简单Hello World代码

首先,MPI必须初始化(initialised)和结束(finalised)。**这两个操作必须始终是代码的第一次和最后一次调用。**现在关于这两个操作没有太多可说的,我们只是说他们是程序的setup。
MPICH 实现文档,它警告我们:

The MPI standard does not say what a program can do before an MPI_INIT or after an MPI_FINALIZE. 
In the MPICH implementation, you should do as little as possible. 
In particular, avoid anything that changes the external state of 
the program, such as opening files, reading standard input or writing to standard output.

因此,按照惯例,这两个命令在程序中始终被调用为第一个和最后一个。对应的命令是 MPI_InitMPI_Finalize MPI_Init 总是引用命令行参数,而 MPI_Finalize 不接受。因此,在 C++ 中,它们的签名如下:

int MPI_Init(int *argc, char ***argv);
int MPI_Finalize();

获得rank和size的方法,遵循以下调用:

int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

请注意 MPI_COMM_WORLD . MPI_COMM_WORLD 这表明该操作是在封装了当前运行的每个进程的全局通信器上完成的。我们稍后将看到什么是通信器以及如何创建它们以创建流程组。目前,我们将坚持在本章的 WORLD 通信器上调用 MPI。

Instructions

  • Initialises MPI.
  • Reads the rank of the current process on MPI_COMM_WORLD.
  • Prints Hello world, from process #<RANK OF THE PROCESS.
  • Finalizes MPI and exits.
#include <iostream>
#include <mpi.h>

int main(int argc, char** argv) {
  // Initialisation
  MPI_Init(&argc, &argv);
  // Reading size and rank
  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  // Printing
  std::cout << "Hello world, from process #" << world_rank << std::endl;
  
  // Finalisation
  MPI_Finalize();

  return 0;
}

运行结果:
在这里插入图片描述在本地机器上运行需要注意,有一种简单的方法可以编译 MPI 代码。安装任何实现(如 OpenMPI 或 MPICH)时,都会提供wrapper compilers。如果要在安装 OpenMPI 发行版后编译此代码,则必须替换简单的编译器行:

g++ -o hello_world hello_world.cpp  
替换为下面编译指令
mpicxx -o hello_world hello_world.cpp

有三种这样的包装器可以用 MPI 实现主要支持的三种语言进行编译:C、C++ 和 Fortran。相应的包装器是 : mpicc 和 mpicxx mpifort 。请注意,这些命令只是包装器,它们将使用环境变量调用编译器。通过 --show 使用命令行参数,可以看到使用这些编译器之一时实际执行的行。例如,在相当标准的 Linux 安装中, mpicxx --show 将返回如下内容:

g++ -I/usr/local/include -pthread -Wl,-rpath -Wl,/usr/local/lib -Wl,--enable-new-dtags -L/usr/local/lib -lmpi_cxx -lmpi

编译程序后,可以使用该 mpirun 命令跨多个进程运行该程序

mpirun -np 4 ./hello_world

总结

  1. MPI简介,消息传递模型
  2. global communicator
  3. rank 和 size
  4. 初始化和结束
  5. 使用MPI进行简单的hello world小程序编写

参考

  1. Introduction to MPI
  2. MPI Tutorials

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1637548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构体的对齐原则

一、C语言结构体对齐步骤: 1.每个成员对齐 2.总体对齐 二、C语言结构体对齐规则: 1.结构体第一个成员存放在相较于结构体变量起始位置的偏移量为0的位置 2.从第二个成员开始&#xff0c;往后的每一个成员都要对齐到某个对齐数的整数倍处。 对齐数&#xff1a;结构体成员自身的…

C 408—《数据结构》图、查找、排序专题考点(含解析)

目录 Δ前言 六、图 6.1 图的基本概念 6.2 图的存储及基本操作 6.3 图的遍历 6.4 图的应用 七、查找 7.2 顺序查找和折半查找 7.3 树型查找 7.4 B树和B树 7.5 散列表 八、排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序和基数排序 8.6 各种内部排序算法的比较及…

33.基础乐理-原调、移调、转调、离调

原调、移调、转调、离调分为两类&#xff1a;原调是一个定义、一个名词&#xff0c;移调、转调、离调可以称之为是技术或者操作&#xff0c;是一种动词。也就是分为名词和动词两类。 原调&#xff1a; 一种音乐原本的调&#xff0c;就是它的原调&#xff0c;或者说按照简谱的调…

Codeforces Round 941 (Div. 2) (A~D)

1966A - Card Exchange 题意&#xff1a; 思路&#xff1a;手玩一下发现当存在某个数字个数超过k个&#xff0c;那么就能一直操作下去。那么答案就是k-1. void solve() {cin >> n >> m;map<int,int>mp;int maxx 1;for(int i 0 ; i < n ; i ){int x;c…

【热闻速递】Google 裁撤 Python研发团队

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【&#x1f525;热闻速递】Google 裁撤 Python研发团队引入研究结论 【&#x1f5…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

SpringWebFlux RequestBody多出双引号问题——ProxyPin抓包揪出真凶

缘起 公司有个服务做埋点收集的&#xff0c;可以参考我之前的文章埋点日志最终解决方案&#xff0c;今天突然发现有些数据日志可以输出&#xff0c;但是没法入库。 多出的双引号 查看Flink日志发现了JSON解析失败&#xff0c;Flink是从Kafka拿数据&#xff0c;Kafka本身不处…

2024深圳杯数学建模竞赛D题(东三省数学建模竞赛D题):建立非均质音板振动模型与参数识别模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛D题&#xff08;东三省数学建模竞赛D题&#xff0…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

Vue项目打包APK----Vue发布App

时隔多年我又来跟新了&#xff0c;今天给大普家及下前端Vue傻瓜式发布App&#xff0c;话不多说直接上干货。 首先准备开发工具HBuilder X&#xff0c;去官网直接下载即可&#xff0c;算了直接给你们上地址吧HBuilderX-高效极客技巧。 打开软件&#xff0c;文件-->新建--&g…

通用漏洞评估系统CVSS4.0简介

文章目录 什么是CVSS&#xff1f;CVSS 漏洞等级分类历史版本的 CVSS 存在哪些问题&#xff1f;CVSS 4.0改进的“命名法”改进的“基本指标”考虑“OT/IOT”新增的“其他指标”CVSS 4.0存在的问题 Reference: 什么是CVSS&#xff1f; 在信息安全评估领域&#xff0c;CVSS为我们…

可视化大屏也在卷组件化,组件绝对是效率利器呀。

组件化设计在B端上应用十分普遍&#xff0c;其实可视化大屏组件更为规范&#xff0c;本期分享组件化设计的好处&#xff0c;至于组件源文件如何获取&#xff0c;大家都懂的。 组件化设计对可视化大屏设计有以下几个方面的帮助&#xff1a; 提高可重用性&#xff1a; 组件化设…

打印x型图案Java

KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的X形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线…

Codeforces Round 942 (Div. 2)

Codeforces Round 942 (Div. 2) Codeforces Round 942 (Div. 2) A. Contest Proposal 题意&#xff1a;给出两个长度为n的非递减排序的ab序列&#xff0c;通过向a序列中插入新元素&#xff0c;然后排序后删除最大元素&#xff0c;使得两个长度为n的排列中每一个 a i a_i ai​…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构&#xff1a;分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变&#xff0c;软件架构也需要同步进行升级&#xff0c;引入面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;简称 SOA&#xff09;方法论。…

探索Plotly交互式数据可视化

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Plotly交互式数据可视化 在数据科学和数据分析领域&#xff0c;可视化是一种强大的工具…

LeetCode 105.从前序与中序遍历构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,nul…

Window(Qt/Vs)软件添加版本信息

Window&#xff08;Qt/Vs&#xff09;软件添加版本信息 文章目录 Window&#xff08;Qt/Vs&#xff09;软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

HR招聘测评,什么是好用的在线人才测评工具?

选择哪一种人才测评工具&#xff1f;特别是每年的招聘高峰季节。根据以往的工作经验&#xff0c;一个好用的在线人才工具&#xff0c;可以起到事半功倍的效果&#xff0c;带给人力资源工作者一个轻松的工作体验。因此&#xff0c;我们必须对好用的人才测评工具有一个基本的认识…

vuex的学习

首先下载vuex&#xff0c;然后建立一个目录在vueX中 接着在index。js文件夹中引入 引入后导出这个文件 在main.js文件中导入&#xff0c;这样vue就有了状态管理 接着我创建了2个组件&#xff0c;在 里边规定了一个num:0 在 打印出来就可以看见 映射函数mapState&#xff0c;必…