MPI = Message Passing Interface
是一组由学术界和工业界联合发展的、面向主流并行计算机的、标准化
和可移植的消息传递接口标准。
- 定义了若干核心库函数的语法和涵义;
- 独立于编程语言,支持 C/C++、Fortran 语言的绑定;
- 独立于平台,学术界和厂商发展了若干高效、可靠的实现版;
- 支撑和推动了高性能计算软硬件生态的发展。
MPI的一个主要的实现版本:MPICH。
MPI 的主要理念
- 机器由若干可以相互传递消息的进程 (process) 构成;
- 每个进程拥有私有的存储空间,进程间无共享存储;
- 进程间的消息传递采用显式的发送/接受 (send/receive) 机制完成;
- 程序的运行模式主要有松散同步和完全异步两种;
- 程序往往采用 SPMD (single program multiple data) 方式编写。
MPI 程序的结构
常用的MPI函数
- MPI_Init 一般在主程序的开头,主要用于启动 MPI 环境;
- MPI_Finalize 一般在主程序末尾,主要用于终止 MPI 环境;
- MPI_Comm_size 函数用来获得目标通信器的总进程数;
- MPI_Comm_rank 函数用来获得当前进程在目标通信器的进程号;
- MPI_Send 函数用来发送消息;
- 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)变量
- 定义了所有参与通信的进程的集合;
- 几乎所有的 MPI 函数都需要指定该函数所作用的通信器;
- 通信器变量的数据类型是 MPI_Comm;
- 默认通信器是 MPI_COMM_WORLD (所有进程)。
MPI 数据类型
阻塞与非阻塞通信