并行计算之MPI简介以及基本通信案例(阻塞,非阻塞)

MPI是什么

Message Passing Interface 是一种消息传递编程模型,是这种模型的代表和事实上的标准,用于编写并行程序。主要思想是将一个程序分解为多个进程,这些进程相互通信并协作完成任务。MPI可以在多台计算机或者多个计算节点上执行,还可以利用不同的通信机制进行进程间的通信。

由2022年图灵将获得者----Jack j.dongarra发起。

是一种新的库描述,不是一种语言,共有上百个函数调用接口,提供C和Fortran语言;

MPI是一种标准,规范的代表,而不是具体实现,当前所有的并行计算机制造商都提供对MPI的支持:

  1. Intel MPI
  2. Open MPI
  3. mpich

MPI应用场景

主要应用于高性能计算和分布式计算领域,如

  • 科学计算,如天体物理学,量子化学,材料科学,加速复杂的计算和模拟;
  • 海量数据处理,并行加速处理大规模数据集的过程,如图像处理,信号处理,机器学习和深度学习;
  • 工程模拟,如用于工程领域的模拟和优化,例如计算流体力学,有限元分析,结构学力学等,用来加速数值计算和仿真。

Linux环境准备

我的是ubuntu20.04,以下是OpenMPI环境安装过程:

sudo apt-get install openmpi-bin libopenmpi-dev

编写Hello World程序

#include "mpi.h"
#include <iostream>

int main(int argc, char *argv[])
{
   
    int err = MPI_Init(&argc,&argv);
    std::cout << "MPI Hello World" << std::endl;
    err = MPI_Finalize();
    return 0;
}

编译程序,需要使用MPI自带的编译器,而不是GCC/G++,使用起来和GCC/G++差不多,底层调用的还是这些编译器。

mpic++ main.cpp -o a.out

运行程序,需要依赖可执行程序mpirun

mpirun -np 2 a.out

其中 -np 指定启动进程(一般为后台进程)的个数,该数字和你机器配置相关,建议小于CPU数量或物理核心数。

这里将打印出2个 "MPI Hello World"

MPI常用接口

  1. 消息传递接口, 如MPI_Send 和 MPI_Receive 等,用于实现进程之间的点对点通;
  2. 阻塞与非阻塞接口,上述MPI_Send 和 MPI_Receive是阻塞接口,MPI提供了MPI_Isend 和 MPI_Irecv 等接口,提供非阻塞的通信方式;
  3. 广播和全局操作接口:MPI_Bcast 和 MPI_Scatter 接口用于广播和分发数据,而 MPI_Reduce 和 MPI_Allreduce 接口则用于执行聚合操作;
  4. 数据类型接口,提供了一些用于定义各种数据类型的接口,如 MPI_Datatype 和 MPI_Type_contiguous,用于支持更复杂的数据通信和操作;
  5. 包括上述代码示例中,用于进程管理和性能调试的接口,如 MPI_Init 环境初始化 和 MPI_Finalize 环境结束等。
  6. MPI_Comm_rank,获取当前进程在指定通信域中的进程标识符;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  1. MPI_Comm_size:获取指定通信域(包括 MPI_COMM_WORLD 和自定义的通信域)中进程的总数;
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
  1. MPI_Comm_split:根据指定的颜色信息,将指定通信域中的进程分隔成多个子通信域,并返回分隔后的新通信域;
  2. MPI_Comm_dup:复制指定通信域,返回一个新的通信域;
  3. MPI_Comm_free:释放指定通信域的内存资源,并将通信域设为 MPI_COMM_NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值