MPI = Message Passing Interface

是一组由学术界和工业界联合发展的、面向主流并行计算机的、标准化
和可移植的消息传递接口标准。

  1. 定义了若干核心库函数的语法和涵义;
  2. 独立于编程语言,支持 C/C++、Fortran 语言的绑定;
  3. 独立于平台,学术界和厂商发展了若干高效、可靠的实现版;
  4. 支撑和推动了高性能计算软硬件生态的发展。
    MPI的一个主要的实现版本:MPICH。

MPI 的主要理念

  1. 机器由若干可以相互传递消息的进程 (process) 构成;
  2. 每个进程拥有私有的存储空间,进程间无共享存储;
  3. 进程间的消息传递采用显式的发送/接受 (send/receive) 机制完成;
  4. 程序的运行模式主要有松散同步和完全异步两种;
  5. 程序往往采用 SPMD (single program multiple data) 方式编写。

MPI 程序的结构

在这里插入图片描述

常用的MPI函数

  1. MPI_Init 一般在主程序的开头,主要用于启动 MPI 环境;
  2. MPI_Finalize 一般在主程序末尾,主要用于终止 MPI 环境;
  3. MPI_Comm_size 函数用来获得目标通信器的总进程数;
  4. MPI_Comm_rank 函数用来获得当前进程在目标通信器的进程号;
  5. MPI_Send 函数用来发送消息;
  6. MPI_Recv 函数用来接收消息;

int MPI_Init(int *argc, char ***argv)
int MPI_Finalize()
int MPI_Comm_size(MPI_Comm comm, int *size)
int MPI_Comm_rank(MPI_Comm comm, int *rank)
int MPI_Send(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm)
int MPI_Recv(void *buf, int count, MPI_Datatype datatype,int source, int tag, MPI_Comm comm, MPI_Status *status)

tag 表示消息标签 (非负整数),最大不超过常量 MPI_TAG_UB; buf 表示发送和接收的消息所对应的本地内存位置;
count 表示发送和接收的消息长度;
datatype 表示发送和接收的消息的数据类型。
dest 和 source 分别表示接收端和发送端的进程号;
接收函数比发送函数多一个参数:status;
它保存了函数返回的通信状态,可置为 MPI_STATUS_IGNORE;
其类型 MPI_Status 是一个 MPI 预定义的结构体:

typedef struct MPI_Status {
int MPI_SOURCE;
int MPI_TAG;
int MPI_ERROR;

};

通信器 (communicator)变量

  1. 定义了所有参与通信的进程的集合;
  2. 几乎所有的 MPI 函数都需要指定该函数所作用的通信器;
  3. 通信器变量的数据类型是 MPI_Comm;
  4. 默认通信器是 MPI_COMM_WORLD (所有进程)。

MPI 数据类型

在这里插入图片描述

阻塞与非阻塞通信

在这里插入图片描述

Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐