收藏 分享(赏)

MPI程序进程间的通信.ppt

上传人:dzzj200808 文档编号:3349461 上传时间:2018-10-16 格式:PPT 页数:40 大小:1.24MB
下载 相关 举报
MPI程序进程间的通信.ppt_第1页
第1页 / 共40页
MPI程序进程间的通信.ppt_第2页
第2页 / 共40页
MPI程序进程间的通信.ppt_第3页
第3页 / 共40页
MPI程序进程间的通信.ppt_第4页
第4页 / 共40页
MPI程序进程间的通信.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、实验三 MPI程序进程间的通信,一 MPI进程间通信基本概念,MPI是一种消息传递模型,驻留在不同处理器上的进程通过传递消息相互通信,从而实现不同进程间的数据互访。 MPI是一种标准或规范,它的实现包括MPICH、LAM、IBM MPL等多个版本 MPI虽然很庞大,但是它的最终目的是实现进程间的通信,一 MPI进程间通信基本概念,消息的构成 MPI消息包括信封和数据两个部分 信封指出了发送或接收消息的对象及相关信息而 数据是本消息将要传递的内容 信封: 数据:数据类型,一 MPI进程间通信基本概念,通信域(Communicator): 一类进程的集合,且在该集合内,进程间可以相互通信; 任何M

2、PI通信函数均必须在某个通信域内发生;MPI缺省的通信域MPI_COMM_WORLD,所有启动的MPI进程通过调用函数MPI_Init(),包含在该通信域内; 各进程通过函数MPI_Comm_size()获取通信域包含的(初始启动)的MPI进程个数;,一 MPI进程间通信基本概念,基础函数 MPI初始化int MPI_Init(int *argc, char *argv)MPI_Init是MPI程序的第一个调用,它完成MPI程序所有的初始化工作,所有MPI程序 的第一条可执行语句都是这条语句。 MPI结束int MPI_Finalize(void)MPI_Finalize是MPI程序的最后一个

3、调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句。,一 MPI进程间通信基本概念,基础函数 当前进程标识int MPI_Comm_rank(MPI_Comm comm, int *rank)comm 进程通信域rank 返回进程在通信域中的标识这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号不同的进程就可以将自身和其它的进程区别开来,实现各进程的并行和协作。,一 MPI进程间通信基本概念,基础函数 通信域包含的进程数int MPI_Comm_size(MPI_Comm comm, int *size)comm 进程所在通信域size 返回通信域内进程数这一调用返

4、回给定的通信域中所包括的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。,一 MPI进程间通信基本概念,基础函数 消息发送int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)buf 发送缓冲区的起始地址count 将发送的数据的个数datatype 发送数据的数据类型dest 目的进程标识号tag 消息标志comm 通信域,一 MPI进程间通信基本概念,基础函数 消息接收int MPI_Recv(void* buf, int cou

5、nt, MPI_Datatype datatype, int source, int tag,MPI_Comm comm, MPI_Status *status)buf 接收缓冲区的起始地址count 最多可接收的数据的个数 datatype 接收数据的数据类型source 接收数据的来源即发送数据的进程的进程标识号 tag 消息标识与相应的发送操作的表示相匹配相同comm 本进程和发送进程所在的通信域status 返回状态,一 MPI进程间通信基本概念,基础函数 广播int MPI_Bcast(void* buffer,int count,MPI_Datatype datatype,int

6、root, MPI_Comm comm)buffer 通信消息缓冲区的起始地址 count 将广播出去/或接收的数据个数datatype 广播/接收数据的数据类型root 广播数据的根进程的标识号 comm 通信域,一 MPI进程间通信基本概念,基础函数MPI时间函数double MPI_Wtime(void)MPI_WTIME返回一个用浮点数表示的秒数, 它表示从过去某一时刻到调用时刻所经历的时间。一般为了测试某一段代码,可以在他前后加上一对 MPI_Wtime的调用,两次调用的返回值的差就是消耗的时间秒数 。,一 MPI进程间通信基本概念,基础函数 同步int MPI_Barrier(MP

7、I_Comm comm)comm 进程所在通信域MPI_BARRIER阻塞所有的调用者直到所有的组成员都调用了它,各个进程中这个调用才可以返回。,一 MPI进程间通信基础,预定义数据类型,一 MPI进程间通信基础,预定义数据类型,一 MPI进程间通信基础,程序设计模式 对等模式 对等模式中,各个进程的地位相同。功能和代码基本一致,只是处理的数据或对象不同 ,比如我们之前看到的helloworld程序 主从模式 有一个进程居于主导地位,由它控制、协调其他. 进程完成计算. 比如本实验要设计的程序。,二 进程间通信的程序设计,一 实验目的 1 理解MPI程序设计中进程的通信方式 2 运用MPI的计

8、时器功能测定程序运行时间 二 实验要求设计两个矩阵相乘的并行程序,通过对矩阵按行分解实现并行计算。,二 进程间通信的程序设计,矩阵乘法,=,M*N,N*1,M*1,三 实验原理,二 进程间通信的程序设计,=,=,=,=,a*a+b*b+.+cd,d*a+e*b+.+f*d,=,=,h*a+i*b+.+j*d,三 实验原理,矩阵乘法,二 进程间通信的程序设计,=,M*N,N*1,M*1,按行分解,三 实验原理,矩阵乘法,二 进程间通信的程序设计,矩阵乘法被分解为了M个任务,可以分别交给各个进程运算然后进行汇总,三 实验原理,. . .,. . .,二 进程间通信的程序设计,四 实验步骤 1 按照

9、主从式对其进行程序设计 主进程: 生成矩阵 将用于乘数的一维矩阵分发到每个从进程 按行分解被乘数矩阵 将各个行按次序向从进程发送 从进程: 计算所分到的行与一维矩阵的积 当从进程计算完成时如果矩阵还有行没有被分配继续向主进程提起分配请求,二 进程间通信的程序设计,四 实验步骤2 通过mpicc编译和链接生成可执行文件 $mpicc -o matvec.o -l m matvec1.c 3 通过mpirun运行matvec.o查看输出结果 $mpirun np 4 ./matvec.o,二 进程间通信的程序设计,五 进程间通信的示意图,MPI_Init,主进程,从进程,从进程,从进程,生成矩阵,

10、将用于相乘的一维矩 阵广播給各从进程,二 进程间通信的程序设计,主进程,从进程,从进程,. . . .,发送矩阵的一行,运算与一维矩阵的积并返回给主进程,是否还有未发送的行?,Y,N: 发送带完成标记的消息,MPI_Finalize(),打印结果,二 进程间通信的程序设计,六 参考程序简要说明: 132声明头文件及变量: double *a 声明矩阵 double *a_row 矩阵里面的一行 double ans 缓存被乘数矩阵一行与一维矩阵的积 double *x 声明一维矩阵 double *b 矩阵相乘的结果 int dest 发送消息的目的进程标识 int master = 0 主进

11、程 MPI_Status status 声明MPI_status类型由于记录消息传递状态信息 Int tag 声明消息标记 int tag_done = 1000 将标记1000作为任务完成的标记,二 进程间通信的程序设计,3557MPI程序的初始化 35 MPI_Init ( 获取进程数,二 进程间通信的程序设计,52 if ( my_id = 0 ) 53 54 m = 100; 55 n = 50; 56 主进程确定矩阵的行数和列数57 ierr = MPI_Bcast ( 将矩阵的列数广播至每个进程便于以后计算方便 此后主进程与从进程开始”分道扬镳“ 主进程负责数据的初始化,及协调整个

12、程序 从进程负责分别计算矩阵行与一维矩阵的积,二 进程间通信的程序设计,主进程: 66 a = malloc ( m * n * sizeof ( double ) ); 67 x = malloc ( n * sizeof ( double ) ); 68 b = malloc ( m * sizeof ( double ) ); 主进程分配矩阵,及运算结果的内存空间,二 进程间通信的程序设计,主进程: 71 for ( i = 1; i = m; i+ ) 72 73 for ( j = 1; j = n; j+ ) 74 75 ak = sqrt ( 2.0 / ( double ) (

13、 n + 1 ) ) 77 * ( ( double ) ( i * j ) * pi / ( double ) ( n + 1 ) ); 79 fflush(stdout); 80 k = k + 1; 81 82 初始化矩阵的值,二 进程间通信的程序设计,主进程: 89 for ( i = 0; i n; i+ ) 90 91 xi = sqrt ( 2.0 / ( double ) ( n + 1 ) ) 92 * sin ( ( double ) ( ( i + 1 ) * j_one ) * pi / ( double ) ( n + 1 ) ); 93 初始化一维矩阵的值,二 进程

14、间通信的程序设计,从进程:111 a_row = malloc ( n * sizeof ( double ) );因为从进程每次计算矩阵的一行与一维矩阵的积所以从进程只要分配一行矩阵的空间就可以了 112 x = malloc ( n * sizeof ( double ) ); 分配一维矩阵的存储空间 主从进程运算前的准备工作完毕,之后主进程於从进程之间开始协同工作。,二 进程间通信的程序设计,主进程: 117 MPI_Bcast ( x, n, MPI_DOUBLE, master, MPI_COMM_WORLD ); 因为所有从进程用于矩阵相乘的一维矩阵都是X所以采用广播的方式传递数据

15、 123 for ( i = 1; i = num_procs-1; i+ ) 124 125 dest = i; 目标进程 126 tag = num_rows; 要发送的行的标识,二 进程间通信的程序设计,主进程: 127 k = num_rows * n ; 计算要发送数据在数组中的索引 129 MPI_Send ( a+k, n, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD ); 向每个从进程发送一个矩阵行, 131 num_rows = num_rows + 1; 下次应该发送的行数,二 进程间通信的程序设计,程序简要介绍如下: 主进程: 138 MP

16、I_Recv ( 将收到的运算值存入数组,二 进程间通信的程序设计,主进程: 144 if ( num_rows m ) 145 146 num_rows = num_rows + 1; 147 dest = status.MPI_SOURCE; 148 tag = num_rows; 149 k = num_rows * n; 150 151 ierr = MPI_Send ( a+k, n, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD ); 152 如果存在未传的行就继续将矩阵的行传给从进程,二 进程间通信的程序设计,主进程: 153 else 154 15

17、5 num_workers = num_workers - 1; 156 dummy = 0; 157 dest = status.MPI_SOURCE; 158 tag = tag_done; 160 ierr = MPI_Send ( 否则向从进程传送终止信号,二 进程间通信的程序设计,主进程: 162 if ( num_workers = 0 ) 163 164 break; 165 如果全部从进程都已经终止,则主进程跳出循环,二 进程间通信的程序设计,从进程: 182 ierr = MPI_Recv ( a_row, n, MPI_DOUBLE, master, MPI_ANY_TAG

18、, 183 MPI_COMM_WORLD, 190 从进程循环接收主进程发送的数据,直到接收到带有完成标识的消息,二 进程间通信的程序设计,从进程:192ans = 0.0;193 for ( i = 0; i n; i+ )194 195 ans = ans + a_rowi * xi;196 197 198 ierr = MPI_Send ( 从进程收到的是矩阵的数据而不是带有完成标识的消息,从进程就继续运算并向主进程发送运算结果,二 进程间通信的程序设计,主进程 208221主进程打印运算结果 225 ierr = MPI_Finalize ( ); 结束MPI程序 六 实验报告1 写出例程执行后的结果分析2 请同学们自己设计矩阵按列分解的并行程序,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报