-
MPI
程序中一个独立参与通信的个体称为一个进程
。一个MPI
程序中由部分或者全部进程构成的一个有序集合称为一个进程组
。进程组中 每个进程被赋予一个该组中的序号, 用于在该组张标识该进程,称为进程号, 进程号的取值范围从 0 开始. -
通信器,也叫通信子,是用来进程间的通通信.
MPI
的通信器有域内通信器,域外通信器,前者属于同一进程组的进程间通信,后者分属两个不同进程组间的通信。
特殊的 API
函数
通信器
MPI_COMM_WORLD 包含程序中所有进程
MPI_COMM_SELF 每个进程独自构成,仅包含自己的通信器
``
进程号是通信被创建时赋予的,`MPI` 系统提供了一个特殊的进程号,
MPI_PROC_NULL 空进程不存在的进程,与 MPI_PORC_NULL 进行通信相当于一个空操作,对程序没有影响.
进程间的通信通过消息的收发或者同步操作完成,一个消息指在进程间进行的一次数据交换。一个消息由通信器、源地址、目的地址、消息标签和数据构成。
MPI
程序的基本结构
MPI C 预言接口中所有函数名均采用 MPI_Xxxx 的形式
如
MPI_Send
MPI_Type_commit
MPI_COMM_WORLD
MPI_INT
MPI_Finalize
MPI_Status
MPI_Datatype
MPI 的 C 接口函数通常返回一个整数值,表示操作成功与否,返回值为 MPI_SUCCESS(0) 表示操作成功,否则表示操作的错误码.
一个 MPI
程序包含以下几个基本步骤
- 必须包含头文件
mpi.h
MPI_Init
函数用于初始化MPI
系统, 第一个进程通过MPI_Init
来启动其他进程。注意要将命令行参数
的地址 ( 指针 )&argc
和&argv
传递给MPI_Init
MPI_Comm_size
与MPI_Comm_rank
通信器中进程额数目,本进程的进程号MPI_Finalize
函数用于退出MPI
系统
MPI
的原始数据类型
MPI 系统中数据的发送与接收操作都必须指定数据类型。数据类型可以是 `MPI` 系统预定义的,称为
原始数据类型,也可以是用户在原始数据类型的基础上自己定义的数据类型。
点到点通信
MPI 最基本的通信模式是在一对进程之间进行的消息收发操作:
一个进程发送消息,另一个进程接收消息。这种通信方式称为点对点通信
MPI 数据类型 | C 类型 |
---|---|
MPI_INT | int |
MPI_FLOAT | float |
MPI_DOUBLE | double |
MPI_SHORT | short |
MPI_LONG | long |
MPI_UNSIGNED_CHAR | unsigned char |
MPI_CHAR | char |
MPI_UNSIGNED_SHORT | unsigned short |
MPI_UNSIGNED | unsigned |
MPI_UNSIGNED_LONG | unsigned long |
MPI_LONG_DOUBLE | long double |
MPI_BYTE | unsigned char |
MPI_PACKED | 无 |
MPI
点对点通信函数
- 阻塞型
- 非阻塞型
阻塞型函数需要等待指定操作的实际完成,或者至少所涉及的数据已被 MPI 系统安全的备份后才返回。
MPI_Send
MPI_Recv
MPI_Send
函数返回时表明数据已经发出或已被 MPI
系统复制,随后对发送缓冲区的修改不会影响所发送的数据。而
MPI_Recv
返回时, 则表明数据已经接收到并且可以立即使用。阻
塞型函数的操作是非局部的,它的完成可能需要与其他进程进行通
信。
非阻塞型函数调用总是立即返回
MPI_Isend
和 MPI_Irecv
在调用了一个非阻塞型通信函数后,用户必须随后调用其他函数,如
MPI_Wait
或 MPI_Test
等,来等待操作完成或查询操作的完成情况
- 标准模式
- 缓冲模式
- 同步模式
- 就绪模式
后续继续 …