【笔记】OpenMPI基本使用1

news2024/12/24 10:11:36

【笔记】OpenMPI基本使用1

介绍

在 90 年代之前,对不同的计算架构写并发程序是一件困难而且复杂的事情。当时,虽然很多软件库可以帮助写并发程序,但是并没有一个大家都接受的标准。

在当时,大多数的并发程序出现在科学研究领域。其中最广为接受的模型就是消息传递模型。那么,什么是消息传递模型呢?它其实是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,将并发程序用这个模型实现十分容易。举例来说,主进程(manager process)可以通过对从进程(worker process)发送一个描述工作的消息来把这个工作分配给它。实际上,几乎所有的并行程序都可以使用消息传递模型来描述。

由于当时很多软件库都用到了消息传递模型,但是在定义上却有一些差异,这些库的作者以及其他一些人为了解决这个问题就在1992 Supercomputing 大会上定义了一个消息传递接口的标准,也就是 MPI。这个标准接口使得程序员写的并发程序可以在所有主流的并发框架中运行,并且允许使用一些流行库的特性和模型。

到 1994 年的时候,一个完整的接口标准已经被定义好了(MPI-1)。MPI 其实就是一个接口的定义,然后需要程序员去根据不同的架构去实现这个接口。但很幸运的是仅仅一年之后,一个完整的 MPI 实现就出现了,之后 MPI 就被大量地使用在消息传递应用程序中,并且一直是写这类程序的标准(de-facto)。

设计

通讯器定义了一组能够互相发消息的进程。在这组进程中,每个进程会被分配一个序号,称作秩(rank),进程间显性地通过指定 rank 来进行通信。

通信的基础建立在不同进程间发送和接收操作。一个进程可以通过指定另一个进程的 rank 以及一个独一无二的消息标签(tag)来发送消息给另一个进程。接受者可以只接收特定标签标记的消息(或者也可以完全不管标签来接收任何消息),然后依次处理接收到的数据。类似这样的涉及一个发送者以及一个接受者的通信被称作点对点(point-to-point)通信。

当然在很多情况下,某个进程可能需要跟所有其他进程通信。比如主进程想发一个广播给所有的从进程。在这种情况下,手动去写一个个进程点对点的信息传递就显得很笨拙,并且这样也会导致网络利用率低下。MPI 有专门的接口来帮我们处理这类所有进程间的集体性(collective)通信。

安装

安装过程详见openmpi入门1-安装与测试,这里只简单介绍一下

到openmpi官网下载openmpi,也可以使用wget下载:

wget https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.4.tar.gz

下载完成之后进行解压:

tar -zxvf openmpi-4.0.4.tar.gz

进入openmpi-4.0.4文件夹检查配置文件

cd openmpi-4.0.4
./configure

编译安装

sudo make all install

配置openmpi环境变量

vim /etc/profile

# 在这个文件末尾添加如下两行
export PATH=/usr/local/path:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
source /etc/profile

进入到examples文件夹中,执行make编译一下测试代码,进行测试

mpirun -np 4 hello_c

正常输出结果则说明安装完成

如果出现 enough slots available in the system 报错可传送至最后一节查看解决方法

Hello World

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);

    // Get the number of processes
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // Get the rank of the process
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    // Get the name of the processor
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    // Print off a hello world message
    printf("Hello world from processor %s, rank %d out of %d processors\n",
           processor_name, world_rank, world_size);

    // Finalize the MPI environment.
    MPI_Finalize();
}
EXECS=mpi_hello_world
MPICC?=mpicc

all: ${EXECS}

mpi_hello_world: mpi_hello_world.c
	${MPICC} -o mpi_hello_world mpi_hello_world.c

clean:
	rm ${EXECS}

我们可以编辑makefile文件来运行此Demo,注意makefile文件复制过程中的 Tab

make
mpirun --oversubscribe -np 4 mpi_hello_world

image-20230305200508098

OpenMPI程序基本结构

结合上述Hello World,我们不难发现 OpenMPI程序的基本结构

首先添加 MPI 头文件#include <mpi.h>. 然后使用以下命令进行 MPI 初始化:

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

MPI_Init 的过程中,所有 MPI 的全局变量或者内部变量都会被创建。举例来说,一个通讯器 communicator 会根据所有可用的进程被创建出来(进程是我们通过 mpi 运行时的参数指定的),然后每个进程会被分配独一无二的秩 rank。当前来说,MPI_Init 接受的两个参数是没有用处的,不过参数的位置保留着,可能以后会需要用到。

MPI_Init 之后,有两个主要的函数被调用,这两个函数是几乎所有 MPI 程序都会用到的。

MPI_Comm_size(MPI_Comm communicator,int* size)

MPI_Comm_size返回通信器的大小。在示例中,MPI_COMM_WORLD(由 MPI 为我们构建)包含其所有进程,因此该调用应返回进程数。

MPI_Comm_rank(MPI_Comm communicator,int* rank)

MPI_Comm_rank返回通信器中进程的rank。通信器内的每个进程都被分配了一个从零开始的递增等级。进程的rank主要用于发送和接收消息时的识别。

程序的最终调用是MPI_Finalize用于清理 MPI 环境。

我们亦可以通过一些配置实现多机的分布式并行计算,这里先不再介绍。

发送与接收

MPI 的发送和接收方法是按以下方式进行的:

开始的时候,A 进程决定要发送一些消息给 B 进程。A进程就会把需要发送给B进程的所有数据打包好,放到一个缓存里面。因为所有数据会被打包到一个大的信息里面,因此缓存常常会被叫做信封(envelopes),就像我们把好多信纸打包到一个信封里,然后再寄去邮局。数据打包进缓存之后,通信设备(通常是网络)就需要负责把信息传递到正确的地方。这个正确的地方也就是根据特定 rank 确定的那个进程。

尽管数据已经被送达到 B 了,但是进程 B 依然需要确认它想要接收 A 的数据。一旦它进行了确定,数据就被传输成功了。进程 A 会接收到数据传递成功的信息,然后去干其他的事情。

有时候 A 需要传递很多不同的消息给 B。为了让 B 能比较方便地区分不同的消息,MPI 发送者和接受者额外指定一些信息ID (即标签 tags)。当 B 只要求接收某种特定标签的信息的时候,其他的不是这个标签的信息会先被缓存起来,等到 B 需要的时候才会给 B。

MPI_Send(
    void* data,
    int count,
    MPI_Datatype datatype,
    int destination,
    int tag,
    MPI_Comm communicator)
MPI_Recv(
    void* data,
    int count,
    MPI_Datatype datatype,
    int source,
    int tag,
    MPI_Comm communicator,
    MPI_Status* status)

第一个参数是数据缓冲区。第二个和第三个参数分别描述了数据的数量和类型。MPI_Send会精确地发送 count 指定的数量个元素,MPI_Recv会最多接受 count 个元素接。第四个和第五个参数指定发送方/接受方进程的rank以及信息的标签。第六个参数指定通信器,MPI_Recv 方法特有的最后一个参数提供了接受到的信息的状态。

相关例子与测试:https://github.com/mpitutorial/mpitutorial/tree/gh-pages/tutorials/mpi-send-and-receive/code

报错:enough slots available in the system

原因:在虚拟机中运行经常会出现报错enough slots available in the system,这是由于Open MPI 会估算我们的CPU承载能力,用一定算法计算出进程的上限。

解决:一般来说,我们加上--oversubscribe超出上限个数运行即可(但要注意可能会有未定义行为)

参考

A Comprehensive MPI Tutorial Resource

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

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

相关文章

为什么我复制的中文url粘贴出来会是乱码的? 浏览器url编码和解码

为什么我复制的中文url粘贴出来会是乱码的&#xff1f; 浏览器url编码和解码 Start 番茄最近涉及到一些和单点登录相关的业务需求&#xff0c;在实现功能的过程中&#xff0c;难免少不了和 url 打交道。但是在打交道的过程中&#xff0c;遇到一个痛点&#xff1a;明明我复制的…

网络基础(二)之HTTP与HTTPS

应用层 再谈 "协议" 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢? 为什么要转换呢&#xff1f; 如果我们将struct message里面的信息…

【C++】-- 类型转换

目录 前言 C语言中的类型转换 C强制类型转换 static_cast&#xff08;static静止的&#xff09; reinterpret_cast&#xff08;reinterpret重新解释&#xff09; const_cast&#xff08;const常量&#xff09; 总结 dynamic_cast&#xff08;dynamic动态&#xff09; …

JavaWeb开发(三)3.5——Java的反射机制

一、反射机制的概念 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能调用它的任意一个方法。这种动态获取信息&#xff0c;及动态调用对象方法的功能叫java语言的反射机制。 Java反射机制的核心是在程序运行时动…

Vue3电商项目实战-购物车模块4【11-购物车页面-确认框组件】

文章目录11-购物车页面-确认框组件11-购物车页面-确认框组件 目的&#xff1a;通过vue实例调用$confirm函数弹出确认框。import导入函数使用也需要支持。 大致步骤&#xff1a; 实现组件基础结构和样式。实现函数式调用组件方式和完成交互。加上打开时动画效果。给购物车删除加…

飞鹤奶粉营销杀手级动作,让对手郁闷

飞鹤奶粉杀手级动作&#xff0c;让对手绝望 不是“更适合中国宝宝体质”一句话的事 而是杀手级资源匹配&#xff1a; 飞鹤奶粉一年50万场线下活动 趣讲大白话&#xff1a;让别人无路可走 【安志强趣讲信息科技94期】 ********************************** 战略定位后&#xff0…

多重背包问题中的二进制状态压缩

1.多重背包问题 经典的多重背包问题和01背包问题的相似之处在于二者的一维遍历顺序都是从右侧往左侧遍历。 同时多重背包的一维写法不比二维写法降低时间复杂度。 2.多重背包标准写法:(平铺展开形式&#xff09; class Solution {public int maxValue(int N, int C, int[] s…

Raspbian镜像无头烧录

Raspbian镜像无头烧录1. 源由2. 需求3. 分析4. 步骤4.1 删除tf卡分区内容4.2 balena烧录镜像4.3 配置USB直接登录4.4 配置WiFi 2.4G网络登录4.5 修改登录账号密码4.6 数据同步和弹出tf卡5. 登录5.1 登录异常处理5.2 WiFi 2.4G网络登录5.3 USB直接登录6. 参考资料7. 补充资料这里…

HCIP-5OSPF域内域间外部路由学习笔记

1、OSPF区域 每个区域都维护一个独立的LSDB。 Area 0是骨干区域&#xff0c;其他区域都必须与此区域相连。 划分OSPF区域可以缩小路由器的LSDB规模&#xff0c;减少网络流量。 区域内的详细拓扑信息不向其他区域发送&#xff0c;区域间传递的是抽象的路由信息&#xff0c;而不…

【Flutter·学习实践·UI篇】基础且重要的UI知识

前言 参考学习官网&#xff1a;《Flutter实战第二版》 学习前先记住&#xff1a;Flutter 中万物皆为Widget&#xff0c;心中默念3次以上铭记于心。 这一点和开发语言Dart的变量一切皆是对象的概念&#xff0c;相互对应。 Widget 在前面的介绍中&#xff0c;我们知道在Flutt…

CSAPP第八章 异常控制流

目录 异常 异常处理 异常的类别 中断 陷阱和系统调用 故障 终止 ​编辑 Linux/x86-64 系统中的异常 进程 ​编辑 逻辑控制流 并发流 私有地址空间 用户模式和内核模式 上下文切换 ​编辑系统调用错误处理 进程控制 获取进程ID 创建和终止进程 回收子进程 …

汇编系列03-不借助操作系统输出Hello World

每天进步一点点&#xff0c;加油&#xff01; 上一节&#xff0c;我们通过汇编指令&#xff0c;借助操作系统的系统调用实现了向标准输出打印Hello world。这一节我们打算绕过操作系统&#xff0c;直接在显示屏幕上打印Hello world。 计算机的启动过程 当我们给计算机加电启…

AcWing1049.大盗阿福题解

前言如果想看状态机的详解&#xff0c;点机这里:dp模型——状态机模型C详解1049. 大盗阿福阿福是一名经验丰富的大盗。趁着月黑风高&#xff0c;阿福打算今晚洗劫一条街上的店铺。这条街上一共有 N家店铺&#xff0c;每家店中都有一些现金。阿福事先调查得知&#xff0c;只有当…

《算法分析与设计》笔记总结

《算法分析与设计》笔记总结第一章 算法引论1.1 算法与程序1.2 表达算法的抽象机制1.3 描述算法1.4 算法复杂性分析第二章 递归与分治策略2.1 递归的概念2.2 分治法的基本思想2.3 二分搜索技术2.4 大整数乘法2.5 Strassen矩阵乘法2.7 合并排序2.8 快速排序2.9 线性时间选择2.10…

深度学习算法训练和部署流程介绍--让初学者一篇文章彻底理解算法训练和部署流程

目录 1 什么是深度学习算法 2 算法训练 2.1 训练的原理 2.2 名词解释 3 算法C部署 3.1 嵌入式终端板子部署 3.3.1 tpu npu推理 3.3.2 cpu推理 3.2 服务器部署 3.2.1 智能推理 3.2.2 CPU推理 1 什么是深度学习算法 这里不去写复杂的概念&#xff0c;就用通俗的话说…

无头盔PICO-unity开发日记1(抓取、传送)

目录 可传送的地面 锚点传送 修改射线颜色&#xff08;可交互/不可交互&#xff09; 球、抓手组件 ||刚体&#xff08;重力&#xff09;组件 可传送的地面 1.地面添加组件 2.XR交互管理器添加传送提供者 3.地面设置传送提供者 4.XR交互管理器添加locomotion system 5.拖拽 完…

2020蓝桥杯真题日期格式 C语言/C++

问题描述 小蓝要处理非常多的数据, 其中有一些数据是日期。 在小蓝处理的日期中有两种常用的形式: 英文形式和数字形式。 英文形式采用每个月的英文的前三个宁母作为月份标识, 后面跟两位数字 表示日期, 月份标识第一个字母大写, 后两个字母小写, 日期小于 10 时要补 前导 0s…

汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

目录 前提知识 案例 c的插入排序 32位汇编代码 代码分析 效果展示 前提知识 常用指令add指令 sub指令 mul乘法指令 div除法指令 inc&#xff08;自增&#xff09;&#xff08;即&#xff09; dec&#xff08;自减&#xff09;&#xff08;即--&#xff09; cmp&#xf…

二叉树的最近公共祖先【Java实现】

题目描述 现有一棵n个结点的二叉树&#xff08;结点编号为从0到n-1&#xff0c;根结点为0号结点&#xff09;&#xff0c;求两个指定编号结点的最近公共祖先。 注&#xff1a;二叉树上两个结点A、B的最近公共祖先是指&#xff1a;二叉树上存在的一个结点P&#xff0c;使得P既是…

4万字数字政府建设总体规划方案WORD

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 我省“数字政府”架构 &#xff08;一&#xff09; 总体架构。 “数字政府”总体架构包括管理架构、业务架构、技术架构。其中&#xff0c;管理架构体现“管运分离”的建设运营模式…