计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt

上传人:小飞机 文档编号:6343061 上传时间:2023-10-18 格式:PPT 页数:57 大小:2.66MB
返回 下载 相关 举报
计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt_第1页
第1页 / 共57页
计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt_第2页
第2页 / 共57页
计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt_第3页
第3页 / 共57页
计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt_第4页
第4页 / 共57页
计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt》由会员分享,可在线阅读,更多相关《计算流体力学中科院力学所第5讲-MPI并行程序设计初步.ppt(57页珍藏版)》请在三一办公上搜索。

1、计算流体力学讲义 第五讲 MPI并行程序设计(1)李新亮;力学所主楼219;82543801,知识点:MPI程序的运行机制 拷贝N份,给每个进程一份 MPI的基本库函数6个库函数“对等式”编程方法 站在单个进程的角度思考,1,讲义、课件上传至(流体中文网)-“流体论坛”-“CFD基础理论”,Copyright by Li Xinliang,Copyright by Li Xinliang,2,Part 1:基本概念及MPI并行编程入门,并行计算基本概念 MPI并行编程入门 1)MPI 简介 2)MPI 的基本函数及消息传递 3)MPI的常用函数 4)对等式编程思想的举例说明 全收集、矩阵相乘,

2、一、基本概念,并行计算机简介大规模并行计算超级计算(Supercomputing)/高性能计算(HPC)为何需要超级计算?应用领域的巨大计算需求单CPU的计算能力有限,应用对计算资源的需求,3,Copyright by Li Xinliang,CFD的计算资源依赖性 计算量大流动的多尺度性(湍流)大飞机全部流动细节完全分辨:最小尺度:mm mm 量级;计算网格:1012-1016;需计算量:1020-30;工程需求:8个小时之内完成计算 预计:LES:2045年;DNS:2080年,最大尺度 m,mm,几种我们常见的并行计算机,并行计算机体系结构,5,Copyright by Li Xinli

3、ang,内存带宽瓶颈,访存冲突机制控制复杂,虚拟共享存储“NUMA”访存冲突机制控制复杂,克服了访存冲突及内存瓶颈,访存的局部性 对网络要求不严,6,Copyright by Li Xinliang,低价格可扩展,自行搭建的简易机群,7,Copyright by Li Xinliang,并行机群:搭建简单 简单的局域网,并行机群=局域网,早期 作者搭建的简易机群,机群软件:Linux/Windows;套件OSCAR;MPICH.NT,,我国最早搭建的机群:LSEC 张林波 搭建的32节点机,Copyright by Li Xinliang,8,美洲虎/1700万亿次,曙光5000A/160万亿

4、次,天河1号 560万亿次CPU+GPU混合系统,联想深腾7000/106万亿次,单精度千万亿次的GPU系统 Mole-xx,顶级的超级计算机,目标:每秒 1摩尔次浮点运算(1 mole=6.02*1023),Copyright by Li Xinliang,9,Top5 超级计算机(2009-11),美洲虎半年间性能猛增69的秘密在于处理器核心数量的暴涨:在配备AMD刚刚发布的六核心“伊斯坦布尔”Opteron 2435 2.6GHz(单颗浮点性能10.4GFlops)后,美洲虎的核心数从129600个增至224162个(+73),且每核心搭配2GB内存,每个完整的计算节点由12个处理核心和

5、16GB共享内存组成,整套系统300TB内存、10PB(10000TB)硬盘。,Copyright by Li Xinliang,10,Top5 超级计算机(2009-11),天河1号:我国最快的计算机;CPU+GPU的混合系统,GPU计算 最先进的高性能计算,2.并行程序设计工具,1)共享存储式 自动并行(并行编译器)Intel Fortran/C 编译器 ifc aa.for-parallel 编译目标:多线程程序 OpenMP,编译指示符:!omp parallel,11,Copyright by Li Xinliang,Cluster 系统,2)分布存储式 HPF(High-Perfo

6、rmance Fortran)基于数据并行,程序改动较小 效率较低 PVM(Parallel Virtual Machine)MPI(Message Passing Interface)基于消息传递 效率较高,12,Copyright by Li Xinliang,MPI 的编译、运行环境 1)并行计算机(力学所机群、深腾7000,曙光5000A)编译:mpif90/mpif77/mpicc f90/f77-I/usr/local/mpi/include-L/usr/local/mpi/lib-lm-lmpi 运行:mpirun/bsub 2)MPI for NT(Windows 2000,X

7、P)编译环境:Visual Fortran/MS Develop Studio 设置:头文件路径、连接路径 运行:mpirun,二、MPI并行编程入门1.简介,13,Copyright by Li Xinliang,Copyright by Li Xinliang,14,设置Windows下的MPI环境,Step 1:下载并安装安装包;Step 2:更改Visual Fortran的环境设置,添加MPICH的 include 及lib 路径 1)Tools-options-Build;在“show directories for:”栏目选择“include files”;在“Directori

8、es:”下的对话框里面添加MPICH include 的路径,例如“C:/Porgram files/mpich/SDK/include”(根据安装的具体位置而定)在“show directories for:”的栏目选择“Library files”,在“Directories:”下的对话框里面添加 MPICH Lib 的路径,例如“C:/Porgram files/mpich/SDK/lib”2)程序编译时,请把mpich.lib 添加在链接库里。project-settings-link;在 objcet/Library modules 下的对话框里面添加 mpich.lib(例如“ke

9、rnel32.lib”变更为“kernel32.lib;mpich.lib”)Step3:编译程序,生成可执行文件,Copyright by Li Xinliang,15,Step 4:利用mpirun 运行程序。(该工具在Windows桌面的“开始-程序-mpich-mpd-MPIRun”)在“Application:”对话框里面选择刚编译生成的可执行文件。在“Number of Processes”对话框里面选择运行运行的进程数(即所谓“CPU个数”)。在“Advanced options”对话框里面选择“Always prompt for password”。MPIRun 运行时会要求用

10、户输入计算机的用户名和密码。点击“Run”即可运行(需要输入计算机的用户名和密码)。,注意:如果程序为f90 程序,请修改mpif.h。将行首的注释符“C”替换为“!”,否则编译会出错。(mpif.h 在安装路径的include 目录下,通常在 C:/Porgram files/mpich/SDK/include里面)通常MPIRun需要以计算机管理员的身份运行,需要对计算机设置用户名和密码。如果计算机没有设置密码,则需要在控制面板中设置。些防火墙及杀毒软件会阻止MPIRun的运行,如出现问题需要关闭这些防火墙及杀毒软件。,MPI 程序的运行原理:服务器(前端机)编译 可执行代码复制 N 份,

11、每个节点运行一份 调用MPI库函数 得到每个节点号 my_id 根据my_id 不同,程序执行情况不同 调用MPI 库函数进行通讯,MPI 编程的基本思想:主从式,对等式,重要!,16,Copyright by Li Xinliang,重点:对等式程序设计,Copyright by Li Xinliang,17,a.exe,对等式设计,“对等式”程序设计思想,如果我是其中一个进程;我应当做完成我需要完成的任务,站在其中一个进程的角度思考,一个简单的MPI程序 hello.f90 include mpif.h integer myid,numprocs,ierr call MPI_Init(ie

12、rr)callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)Print*,Hello World!my id is:,myid!添加自己的程序!call MPI_Finalize(ierr)end,18,Copyright by Li Xinliang,运行结果:,19,Copyright by Li Xinliang,基本MPI函数(MPI 子集)1)MPI初始化 call MPI_Init(ierr)(out)Integer:ierr 2)MPI结束 call M

13、PI_Finalize(ierr)(out)Integer:ierr,20,Copyright by Li Xinliang,(in):输入参数;(out):输出参数;,整数,返回值非0表示出错,3)得到当前进程标识callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)(In)Integer:MPI_COMM_WORLD 为进程所在的通信域(Out)Integer:myid,ierr 4)得到通信域包含的进程数CallMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)(In)Integer:MPI_COMM_WORLD(Out

14、)Integer:numprocs,ierr,21,Copyright by Li Xinliang,进程的ID号(从0开始)最重要的参数!,MPI_COMM_WORLD:MPI预定义的通信域;可换成创建的通信域Comm,基本概念:通信域(通信子),0,1,2,3,4,5,6,7,8,9,10,11,0,1,2,3,4,5,0,1,2,3,4,5,MPI_COMM_WORLD,MPI_Comm_1,MPI_Comm_2,22,Copyright by Li Xinliang,把全班分成几个组,执行任务更方便,“班名”,包含全班同学 MPI 预定义,my_id“学号”,组的名字(编号),组内编号

15、,MPI 消息传递函数 消息发送 MPI_Send(buf,count,datatype,dest,tag,comm,ierr)MPI消息:数据描述+信封 数据描述:起始地址,数据个数,数据类型 信封:源/目,标签,通信域,23,Copyright by Li Xinliang,buf:数据起始地址(Fortran:变量名,C:变量地址/指针)count:数据数目(以datatype为单位,必须连续),MPI_Send(buf,count,datatype,dest,tag,comm,ierr),24,Copyright by Li Xinliang,Datatype:数据类型 MPI_INT

16、EGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER,MPI_BYTE,MPI_PACKED,Real*8 x(10)(给x 赋值)Call MPI_send(x(1),10,MPI_double_precision,.),数据的首地址(不是变量的值),10 个数据(不是10个字节),Fortran:按地址传送:x(1)或 xC:按值传送:&(x0)或x,dest:发送目标的ID(integer)Tag:消息标签(integer)Comm:通信域(integer),例:MPI_COMM_WORLD ie

17、rr:整数,如果成功返回0例:real A.if(my_id.eq.0)Call MPI_Send(A,1,MPI_REAL,1,27,MPI_COMM_WORLD,ierr)标签 tag 的作用:区别不同的消息,MPI_Send(buf,count,datatype,dest,tag,comm,ierr),25,Copyright by Li Xinliang,标签。举例:0号同学向1号同学发出3封信,内容分别为3科考试成绩,为了防止弄混,必须用约定的数做标签。,目的ID,消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)

18、参数:数据起始地址,数据,类型,源地址,标签,通信域,返回状态 integer status(MPI_STATUS_SIZE)MPI接收匹配:数据类型、源地址、标签要一致;否则不接收,26,Copyright by Li Xinliang,返回状态和调试信息,MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)源地址,标签,27,Copyright by Li Xinliang,integer status(MPI_STATUS_SIZE),任意源地址:MPI_ANY_SOURCE任意标签:MPI_ANY_TAG,包含必要信息,MPI

19、预定义的常量可匹配任意源、任意标签“无论谁来的信都接收”,status(MPI_SOURCE):消息的源地址status(MPI_TAT):消息的标签status(MPI_ERROR):错误码,MPI的消息发送机制 两步进行MPI_Send(A,)发送MPI_Recv(B,)接收,发送 变量A,接收 到变量B,配合使用,发/收 两步机制;避免直接读写对方内存;保证安全性,!sum from 1 to 100!Run only for np=2!include mpif.h integer myid,sum_local,sum_local1,sum_global,ierr,status(MPI_

20、STATUS_SIZE)call MPI_Init(ierr)call MPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr)sum_local=0 do i=myid+1,100,2 sum_local=sum_local+i enddo print*,myid=,myid,sum_local=,sum_local if(myid.eq.1)call MPI_SEND(sum_local,1,MPI_INTEGER,0,99,MPI_COMM_WORLD,ierr)if(myid.eq.0)then call MPI_RECV(sum_local1,1,MPI_INT

21、EGER,1,99,MPI_COMM_WORLD,status,ierr)sum_global=sum_local+sum_local1 print*,sum_global=,sum_global endif call MPI_Finalize(ierr)end,例:计算 1+2+3+100,采用2个CPU并行,CPU 0:1+3+5+7+99CPU 1:2+4+6+8+100,“对等式”编程思路:站在每个进程的角度思考,29,Copyright by Li Xinliang,结果显示,30,Copyright by Li Xinliang,消息传递时要注意防止死锁,缓冲区(“信箱”),MPI

22、_Send,MPI_Recv,MPI_Send,MPI_Recv 属于阻塞式发送/接收 发送成功 接收成功,发送和接收是两个独立过程,子程序返回,Send 与 Recv 一定要配合好,发送到“信箱”即为成功,31,Copyright by Li Xinliang,重要!,发生死锁的情况,只发送,不接收,只接收,不发送,32,Copyright by Li Xinliang,例,任务:进程0 发送变量 A给进程1 进程1发送变量 B给进程0,if(myid.eq.0)then call MPI_send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)call MPI

23、_recv(B,1,MPI_real,1,99,MPI_Comm_World,ierr)Else if(myid.eq.1)then call MPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)call MPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)endif,Step 1,Step 2,Step 1,Step 2,不会死锁,33,Copyright by Li Xinliang,死锁的例子,if(myid.eq.0)then call MPI_recv(B,1,MPI_real,1,99,MPI_Co

24、mm_World,ierr)call MPI_send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)Else if(myid.eq.1)then call MPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)call MPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)endif,Step 1,Step 1,Step 2,不会死锁,?,?,Step 2,34,Copyright by Li Xinliang,有可能死锁的例子,if(myid.eq.0)then call MPI_

25、send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)call MPI_recv(B,1,MPI_real,1,99,MPI_Comm_World,ierr)Else if(myid.eq.1)then call MPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)call MPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)endif,Step 2,Step 2,Step 1,35,Copyright by Li Xinliang,使用MPI_Sendrecv()函数来避免死锁

26、,MPI_SendRecv(buf1,count1,datatype1,dest,tag1,buf2,count2,datatype2,source,tag2,comm,status,ierr)=MPI_Send(buf1,count1,datatype1,dest,tag1,comm,ierr)+MPI_Recv(buf2,count2,datatype2,source,tag2,comm,status,ierr)次序由系统决定,36,Copyright by Li Xinliang,基本的MPI函数(6个)MPI的子集MPI初始化 MPI_Init(ierr);MPI结束 MPI_Fina

27、lize(ierr)得到当前进程标识 MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的进程数 MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)消息发送MPI_Send(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr),MPI 只能点到点通信,其他函数是用这6个函数开发的;使用这6个函数,可以实现MPI的全部功能。,Copyright by Li Xinliang,3

28、8,系统时间(墙钟)函数:MPI_Wtime(),real*8:time time=MPI_Wtime()返回当前墙钟时间(单位:秒)(Wall time 与CPU time不同,Wall time更可靠),CPU分时为所有进程服务,Real*8:Time_begin,Time_end(初始化)Time_begin=MPI_Wtime().(计算任务).Call MPI_Barrier(comm,ierr)Time_end=MPI_Wtime()Print*,“计算时间为:”,Time_end-Time_begin,可用来测量程序的执行速度测量加速比及并行效率,加速比=N个进程的执行速度/单个

29、进程的执行速度,并行效率=加速比/N,作者的Hoam-OpenCFD软件加速比测试,CPU Core number 1024-16384,并行效率 89.6%,通常要进行同步,然后测量时间,否则各进程报出的时间不同。,3.常用的MPI函数,1)广播 MPI_Bcast(buff,count,datatype,root,comm,ierr)参数:数据缓冲区,数目,数据类型,根进程,通讯域 例:real A if(myid.eq.0)then open(55,file=data.dat)read(55,*)A close(55)endif call MPI_Bcast(A,1,MPI_REAL,0

30、,MPI_COMM_WORLD,ierr)广播:树状传播,效率较高,39,广播的逻辑图,广播的实际实现方式树状传播,MPI的消息:只能点到点传递;不能真正“广播”,2)规约(求和,求最大值,求最小值,)MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm,ierr)发送缓冲区,接收缓冲区,数目,数据类型,规约操作,通讯域,!sum from 1 to 100!Run only for np=2!include mpif.h integer myid,sum_local,sum_global,ierr call MPI_Init(ierr)

31、call MPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr)sum_local=0 do i=myid+1,100,2 sum_local=sum_local+i enddo call MPI_Reduce(sum_local,sum_global,1,MPI_INTEGER,&MPI_SUM,0,MPI_COMM_WORLD,ierr)print*,sum_global=,sum_global call MPI_Finalize(ierr)end,40,Copyright by Li Xinliang,预定义的规约操作:MPI_MAX 最大值 MPI_LXOR 逻

32、辑异或 MPI_MIN 最小值 MPI_BXOR 按位异或 MPI_SUM 求和 MPI_MAXLOC 最大值及位置 MPI_PROD 求积 MPI_MINLOC 最小值及位置 MPI_LAND 逻辑与 MPI_BAKD 按位与 MPI_LOR 逻辑或 MPI_BOR 安位或,41,Copyright by Li Xinliang,同步 MPI_Barrier(comm,ierr)Comm:通讯域,ierr:返回值,等待所有进程都调用MPI_Barrier(),函数才能返回,Call MPI_barrier(MPI_COMM_WORLD,ierr),42,Copyright by Li Xin

33、liang,Copyright by Li Xinliang,43,4.“对等式”编程示例,例1:全收集的实现 MPI_Allgather(),题目:N个进程,每个进程有一个数A;把所有进程的数收集起来,按进程号的次序形成数组A0(1:N),存放到所有进程中。,把每个同学的电话号码收集起来,形成通讯录,发给全班同学,也可以是数组,各进程的数A可以不同,A0(1),A0(2),A0(3),A0(4),方式1:根进程收集所有数据;根进程发送到所有进程 if(myid.eq.0)then A0(0)=A do id=1,Nproc-1 call MPI_Recv(A0(id),1,MPI_Real,

34、id,99,MPI_Comm_World,status,ierr)enddo else call MPI_Send(A,1,MPI_Real,0,.)endif if(myid.eq.0)then do id=1,Nproc-1 call MPI_Send(A0,Nproc,MPI_Real,id,)enddo else call MPI_Recv(A0,Nproc,MPI_Real,0,)endif,44,Copyright by Li Xinliang,“班长”依次与所有同学通信,收集信息;收集后依次通信,发放信息,负载不均衡效率最低可能会死锁,方式2:根进程收集所有数据;根进程广播到所有

35、进程 if(myid.eq.0)then A0(0)=A do id=1,Nproc-1 call MPI_Recv(A0(id),1,MPI_Real,id,99,MPI_Comm_World,status,ierr)enddo else call MPI_Send(A,1,MPI_Real,0,.)endif call MPI_Bcast(A0,Nproc,MPI_Real,0,MPI_Comm_world,ierr)效率高于(1)是MPI_Allgather()的原有的标准方式,45,Copyright by Li Xinliang,广播的实现方式,“班长”依次收集信息后,“广播”给全班

36、,Copyright by Li Xinliang,46,1A,send to ID 0,0 1 2 3 N-1,1B,0 1 2 3 N-1,Step 1:“我”(my_id 进程)向my_id+1进程发数据;“我”收my_id-1进程发来的数据,该步完成后:“我”(my_id 进程)得到了my_id-1的数据,全收集的实现图解,方式3:循环通信,Copyright by Li Xinliang,47,2A,send to ID 1,0 1 2 3 N-1,2B,0 1 2 3 N-1,Step 2:“我”向 my_id+2 进程发数据;“我”收 my_id-2进程发来的数据;,该步完成后:

37、“我”得到了my_id-1,my_id-2进程的数据,Step 3:我向my_id+3发数据,我收my_id-3发来的数据Step N-1 完成后,我得到了全部数据;全体进程也得到了全部数据,对等式编程思想:每个人做好自己的工作,全部工作就做好了,不设班长,所有人工作量相同,循环通讯:由张林波研究员首次提出 do step=1,Nproc-1 id_send=mod(myid+step,Nproc)id_recv=mod(myid-step,Nproc)call MPI_Send(A,1,MPI_Real,id_send,99,&MPI_Comm_World,ierr)call MPI_Rec

38、v(A0(id_recv),1,MPI_Real,id_recv,99,&MPI_Comm_World,status,ierr)enddo 效率高于(1)(2)是MPI_Allgather()的现有的标准方式,48,Copyright by Li Xinliang,计算矩阵 A*B=C,A,B,C:N*N 矩阵 采用P个进程计算(N能被P整除)存储方式:分布存储,A,C 按行分割,B 按列分割,矩阵 A B C,49,Copyright by Li Xinliang,例2.计算矩阵乘积,“对等式”程序设计思想:站在每个进程角度思考“我”的数据:dimension A1(N/P,N),B1(N,

39、N/P),C1(N/P,N)“我”的任务:计算 C1,0,KP-1,A,C,B,A1,B1,C1,50,Copyright by Li Xinliang,需要得到整个矩阵 B 自己只有 Bk 向他人索取 do id=0,P-1 call MPI_Recv(B_tmp,N*N/P,MPI_REAL,id,.)计算出 C1(id)(C1(id)=A1*B_tmp)enddo 只索取数据,何人提供?“命令”他人提供数据?不符合“对等式”程序设计思想,0,KP-1,A,C,B,如何完成任务?,B_tmp(N,N/P,P),C1(0),C1(1),C1,51,Copyright by Li Xinlia

40、ng,B,顺次发送数据 do step=0,P-1 if(myid.eq.step)then do id=0,P-1 call MPI_Send(B1,N*N/P,MPI_REAL,id,)enddo endif call MPI_Recv(B_tmp,N*N/P,MPI_REAL,step,)计算出 C1(id)(C1(id)=A1*B_tmp)enddo,问题:负载不均衡 实际上是 串行,52,Copyright by Li Xinliang,一窝蜂地涌向同一个进程,负载不均衡,容易阻塞,B,按节拍循环发送数据(同“全收集”)do step=0,P-1 id_send=mod(myid+s

41、tep,P)id_recv=mod(myid-step,P)call MPI_Send(B1,N*N/P,MPI_REAL,id_send,)call MPI_Recv(B_tmp,N*N/P,MPI_REAL,id_recv,)计算出 C1(id_recv)(C1(id_recv)=A1*B_tmp)enddo,53,Copyright by Li Xinliang,send to ID 0,0 1 2 3 N-1,工作数组,存放接受来的矩阵Bk,回顾 MPI 程序的运行原理:服务器(前端机)编译 可执行代码复制 N 份,每个节点运行一份 调用MPI库函数 得到每个节点号 myid 根据my

42、id 不同,程序不同 调用MPI 库函数进行通讯,MPI 编程的基本思想:主从式,对等式,推荐采用对等式编程思想,基本的MPI函数(6个)MPI初始化 MPI_Init(ierr);MPI结束 MPI_Finalize(ierr)得到当前进程标识 MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)得到通信域包含的进程数 MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)消息发送MPI_Send(buf,count,datatype,dest,tag,comm,ierr)消息接收MPI_Recv(buf,count,datatype

43、,source,tag,comm,status,ierr),Copyright by Li Xinliang,56,作业,熟悉MPI环境及基本编程 1)建立MPI运行环境(有并行机账户或在微机上安装MPI环境)。2)编制如下基本的MPI程序 计算S=1+2+3+1000 要求程序可以实现N个进程的并行运行且负载尽量均衡。N可变,程序中使用MPI_Comm_Size()函数读入N。由0号进程打印计算结果。3)在并行环境上运行,输出结果。要求:提交源程序及运行情况的屏幕截图,Copyright by Li Xinliang,57,2.实现矩阵相乘的并行计算,矩阵A,B 均为N*N的方阵,试计算矩阵C=AB;使用P个进程并行计算(N可以被P整除);矩阵A,B及C均采用分布式存储;A,C按行分割,B按列分割存储(见本稿 47页)。要求编写计算C矩阵的MPI程序,并进行计算。,实际计算时,矩阵A,B请采用如下值,N设为100,计算出C矩阵后,请计算,并由根节点打印出来。,将S值与串行程序的结果进行对比,校验程序的正确性;使用1,2,4,10个进程进行计算,并利用MPI_Wtime()函数计算程序的运行时间;考核加速比及计算效率。,要求:1)提交计算程序;2)使用1,2,4,10个进程计算,提交计算结果(S值及计算时间)、计算效率及加速比。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号