【并行计算5】MPI程序
程序员文章站
2022-06-22 16:33:39
...
Message-Passing Programming:MPI
一、MPI简介
1、WHAT IS MPI?
-
基础了解
MPI =M essage P assing I nterface
-MPI的library进行给出环境,对于programmer而言,MPI的API所以显得十分重要 -
MPI的好处
-
MPI的形成
MPI集合了很多的Solution,也不断演变进行了version的转变,一开始只是计算方法的应用,后面也运行了IO的操作,和一些沟通的方式去实现问题。
-
编程模型
最基础的model是communication的model
一开始的时候就要决定processor的数量,决定平行的程度。
每一个processor执行的都是相同的代码,通过launch到不同的branch之后,不同的branch的ID是对应不相等的。虽然做的是同样的事,但其实读的是不同数据的partition。
2、MPI的communication方式
-
宏观定义
-
沟通的关联性定义
同步通信及异步通信 -
从函数调用定义
blocking->函数做完return:等全部做完才能做其他事
non-blocking->立即return可以继续做其他的事
通常用blocking call模拟同步;而用non-blocking call模拟异步
-
沟通的关联性定义
- detail说明
实现异步的操作主要是由于buffer的存在具体实现对应的内容,sender端就不需要等待receiver端的数据;但是如果receiver端先发出详细,这时其中的值可能是错的,因为数据还没有过来
message buffer是通过library的api具体实现完成
library会去check具体的数据,看是否数据传送正确
3、MPI的相关API
- 首先导入头文件
#include "mpi.h"
-
MPI call
对应返回的值(通过指针的形式)放在参数中进行返回,所以有些参数是为了在function中进行使用,有些参数是为了return对应的值。
在进入MPI call前必须进行:
MPI_init();
紧接着执行MPI call的具体层级;
结束的时候要调用:
MPI_Finalize();
执行的data都会进行MPI call中的层次,调用的代码内容是完全相同的。
- communication and groups
rank的ID:确定是哪一个process,但是你要先定一个group,在group中进行沟通,但是要知道对应的ID
group决定processor交换信息的环境;同时每一个group对应的一个communicator。
当建立了communicator之后就会建立一个token,这个token会给group中的每一个成员新建一个ID进行对应的沟通传递。
MPI_COMM_WORLD//为预先进行定义的communitor
library建立了communicator之后就会给group中的成员建立ID,0开始,是不能修改的
-
environment management routines
//初始化MPI环境,必须在MPI编程中调用,且在其他MPI call之前
MPI_Init()
//结束MPI的执行环境,在这之后不能调用其他MPI函数
MPI_Finalize()
//确定group中的processes个数
MPI_Comm_size(comm,&size)
//在communicator中确定调用process的rank
//rank对应task ID
MPI_Comm_rank(comm.&rank)
Example展示:
#include "mpi.h"
int main(int args,char *arg[]){
int numtasks,rank,rc;
rc=MPI_Init(&args,&argv);//rc为return call代表返回是否正确的意思
if(rc!=MPI_SUCCESS){
printf("ERROR starting MPI program.Terminating.\n");
MPI_Abort(MPI_COMM_WORD,rc);//直接转入MPI_Finalize()
}
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
printf("Number of tasks =%d My rank=%d\n",numtasks,rank);
MPI_Finalize();
}