[MPI] MPI 编程指南 -- MPI消息
学习笔记
一个消息好比一个信封,
消息的内容即信的内容, 在MPI中称为 消息缓冲(Message Buffer), 消息缓冲由三元组 <起始地址,数据个数,数据类型> 标识。
消息接收/发送者即信的地址,在MPI中称为 消息信封(Message Envelop),消息信封由三元组 <源/目标进程,消息标签,通信域> 标识。
MPI_Send( buf, count, datatype, dest, tag, comm )
MPI消息类型
预定义数据类型,MPI通过提供预定义数据类型来解决异构计算中的互操作问题,建立它与具体语言的对应关系。
派生数据类型,引入派生数据类型定义由数据类型不同且地址空间不连续的数据项组成的消息。
MPI消息(通信域)
通信域(Communicator)包括进程组(Process Group)和通信上下文(Communication Contex)等内容,用于描述通信进程间的通信关系。
进程组是进程的有限、有序集。一个进程用它在一个通信域(组)中的编号进行标识。组的大小和进程编号可以通过调用以下MPI函数获得:
MPI_Comm_size(communicator, &group_size)
MPI_Comm_rank(communicator, &my_rank)
通信上下文:安全的区别不同的通信以免相互干扰。
进程组合通信上下文结合形成了通信域。MPI_COMM_WORLD 是所有进程的集合。
MPI管理通信域函数:
MPI_Comm_size, 获取指定通信域中进程的个数;
MPI_Comm_rank, 获取当前进程在指定通信域中的编号;
MPI_Comm_compare, 对给定的两个通信域进行比较;
MPI_Comm_dup, 复制一个已有的通信域生成一个新的通信域,两者除通信上下文不同外,其它都一样。
MPI_Comm_create, 根据给定的进程组创建一个新的通信域;
MPI_Comm_split, 从一个指定的通信域分裂出多个子通信域,每个字通信域中的进程都是原通信域中的进程;
MPI_Comm_free, 释放一个通信域。
MPI 消息(消息状态)
消息状态(MPI_Status类型)存放接收消息的状态信息,是接收函数MPI_Recv最后一个参数,包括:
-> 消息的源进程标识---MPI_SOURCE;
-> 消息标签 --- MPI_TAG;
-> 错误状态 ---- MPI_ERROR;
-> 其它 --- 包括数据项个数等,但多为系统保留。
假设多个客户进程发送消息给服务进程请求服务,通过消息标签来标识客户进程,从而服务进程采取不同的服务。
while (true){
MPI_Recv(received_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,comm,&Status);
switch (Status.MPI_Tag) {
case tag_0: perform service type0;
case tag_1: perform service type1;
case tag_2: perform service type2;
}
}
学习感想