MPI数据通信常用函数:
int MPI_Init(int *argc, char **argv[]); 功能:用于并行环境初始化,其后面的代码到MPI_Finalize()函数之前的代码在每个进程中都会被执行一次。 除MPI_Initialized()外,其余MPI函数都应在其后被调用。 MPI系统将通过argc,argv得到命令行参数,即main函数必须带参数,否则会出错。int MPI_Finalize(void); 功能:退出MPI系统,所有进程正常退出都必须调用。它用于并行代码的结束,即结束除主进程外其它进程。 注意:串行代码仍可在主进程(rank=0)上运行,但不能再有MPI函数。int MPI_Comm_size(MPI_Comm comm, int *size); 功能:获取进程个数size。 参数:指定一个通信子,也指定了一组共享改空间的进程,这些进程组成该通信子的group(组)。获得通信子comm中规定的group包含的进程的数量。int MPI_Comm_rank(MPI_Comm comm, int *rank); 功能:得到本进程在通信空间中的rank值,即在组中的逻辑编号(该rank值为0到p-1间的整数,相当于进程的ID)int MPI_Send(void *buff, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); 功能:发送通信内容。 参数说明: buff:要发送的数据 count:发送消息的数据长度 datatype:发送的数据类型 dest:发送的目的进程号 tag:消息标签,接收方需要有相同的消息标签才能接收该消息 comm:通讯域,表明要向哪个组发送消息。int MPI_Recv(void *buff, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); 功能:接收通信内容。 参数说明: buff:接收消息要保存的变量 count:接收消息的数据长度 datatype:接收消息的数据类型 dest:接收端进程号 tag:消息标签,需要与发送方的tag值相同的消息标签才能接收该消息 comm:通讯域 status:消息状态。接收函数返回时,将在这个参数指示的变量中存放实际接收消息的状态信息,包括消息的源进程标识,消息标签,包含的数据项个数。MPI_Bcast 功能:从单个进程向同一个通信子中的所有其他进程发送消息。MPI_Scatter 功能:在各个进程间分配一个数组的元素。如果数组有n个元素,进程数量为p,则第一组的n/p个元素发送到进程0,第二组n/p个元素发送到进程1,以此类推。MPI_Gather 功能:是MPI_Scatter的逆操作。如果每个进程都存储了包含m个元素的子数组,那么MPI_Gather将收集这些元素到一个特定的进程中,先从进程0收集元素,然后是进程1,以此类推。MPI_Allgather 功能:类似MPI_Gather,它收集所有的元素并分发给所有进程。MPI_Barrier 功能:用于同步进程,在同一个通信子中的所有进程调用该函数前,所有调用MPI_Barrier的进程都不能返回。MPI中四个重要概念: 1) 消息数据类型 2) 通信子 3) 通信操作 4) 虚拟拓扑
SPMD形式的消息传递程序主要步骤: 1) 数据划分:尽量考虑负载平衡,存储空间的均衡使用以减少处理器之间的通信 2) 优化通信:尽量提高计算/通信比,数据就地使用,合并短消息成一个长消息进行传输 3) 全局操作:将各处理器的局部结果组合起来形成整个问题的解,这样的操作包括:全局同步、播送、规约、前缀运算、收集/散播等。