欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【并行计算5】MPI程序

程序员文章站 2022-06-22 16:33:39
...

Message-Passing Programming:MPI

一、MPI简介

1、WHAT IS MPI?

  • 基础了解
    MPI =M essage P assing I nterface
    【并行计算5】MPI程序
    -MPI的library进行给出环境,对于programmer而言,MPI的API所以显得十分重要
  • MPI的好处
    【并行计算5】MPI程序
  • MPI的形成
    MPI集合了很多的Solution,也不断演变进行了version的转变,一开始只是计算方法的应用,后面也运行了IO的操作,和一些沟通的方式去实现问题。
    【并行计算5】MPI程序
  • 编程模型
    最基础的model是communication的model
    【并行计算5】MPI程序
    一开始的时候就要决定processor的数量,决定平行的程度。
    【并行计算5】MPI程序
    每一个processor执行的都是相同的代码,通过launch到不同的branch之后,不同的branch的ID是对应不相等的。虽然做的是同样的事,但其实读的是不同数据的partition。
    【并行计算5】MPI程序
    【并行计算5】MPI程序

2、MPI的communication方式

  • 宏观定义
    • 沟通的关联性定义
      【并行计算5】MPI程序
      同步通信及异步通信
    • 从函数调用定义
      【并行计算5】MPI程序
      blocking->函数做完return:等全部做完才能做其他事
      non-blocking->立即return可以继续做其他的事
      通常用blocking call模拟同步;而用non-blocking call模拟异步
      【并行计算5】MPI程序
  • detail说明
    【并行计算5】MPI程序
    【并行计算5】MPI程序
    实现异步的操作主要是由于buffer的存在具体实现对应的内容,sender端就不需要等待receiver端的数据;但是如果receiver端先发出详细,这时其中的值可能是错的,因为数据还没有过来
    message buffer是通过library的api具体实现完成
    library会去check具体的数据,看是否数据传送正确

3、MPI的相关API

  • 首先导入头文件
#include "mpi.h"
  • MPI call
    【并行计算5】MPI程序
    对应返回的值(通过指针的形式)放在参数中进行返回,所以有些参数是为了在function中进行使用,有些参数是为了return对应的值。

在进入MPI call前必须进行:

 MPI_init();

紧接着执行MPI call的具体层级;
结束的时候要调用:

MPI_Finalize();

执行的data都会进行MPI call中的层次,调用的代码内容是完全相同的。

  • communication and groups

rank的ID:确定是哪一个process,但是你要先定一个group,在group中进行沟通,但是要知道对应的ID
【并行计算5】MPI程序
group决定processor交换信息的环境;同时每一个group对应的一个communicator。
当建立了communicator之后就会建立一个token,这个token会给group中的每一个成员新建一个ID进行对应的沟通传递。

MPI_COMM_WORLD//为预先进行定义的communitor

library建立了communicator之后就会给group中的成员建立ID,0开始,是不能修改的

  • environment management routines
    【并行计算5】MPI程序
//初始化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();
}