中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1.ppt

上传人:豆**** 文档编号:57169124 上传时间:2022-11-04 格式:PPT 页数:56 大小:4.77MB
返回 下载 相关 举报
中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1.ppt_第1页
第1页 / 共56页
中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1.ppt_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1.ppt》由会员分享,可在线阅读,更多相关《中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、中科院计算流体力学最新讲义CFD1113讲MPI并行程序设计初步1 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望Copyright by Li Xinliang2Part 1:基本概念及基本概念及MPI并行编程入门并行编程入门 1.并行计算基本概念并行计算基本概念2.MPI并行编程入门并行编程入门 1)MPI 简介简介 2)MPI 的基本函数及消息传递的基本函数及消息传递 3)MPI的常用函数的常用函数 4)对等式编程思想的举例说明)对等式编程思想的举例说明 全

2、收集、矩阵相乘全收集、矩阵相乘一、一、基本概念基本概念1.并行计算机简介并行计算机简介大规模并行计算大规模并行计算超级计算超级计算(Supercomputing)/高性能高性能计算计算(HPC)为何需要超级计算?为何需要超级计算?应用领域的巨大计算需求应用领域的巨大计算需求单单CPU的计算能力有限的计算能力有限 应用对计算资源的需求应用对计算资源的需求3Copyright by Li Xinliang CFD的计算资源依赖性的计算资源依赖性 计算量大计算量大流动的多尺度性流动的多尺度性(湍流)(湍流)大飞机全部流动细节完全分辨:大飞机全部流动细节完全分辨:最小尺度:最小尺度:m mm mm 量

3、级;量级;计算网格:计算网格:1012-1016;需计算量:需计算量:1020-30;工程需求:工程需求:8个小时之内完成计算个小时之内完成计算 预计:预计:LES:2045年;年;DNS:2080年年最大尺度最大尺度 mmm几种我们常见的并行计算机几种我们常见的并行计算机CPUCPUCPU总线或交叉开关总线或交叉开关Memory(a)SMP,a)SMP,物理上单一地址空间物理上单一地址空间物理上单一地址空间物理上单一地址空间CPUCPUCPU定制网络定制网络LMLMLM虚拟分布共享存储虚拟分布共享存储(DSM)(b)DSM,b)DSM,逻辑上单一地址空间逻辑上单一地址空间逻辑上单一地址空间逻

4、辑上单一地址空间P/CP/CP/C定制定制/标准网络标准网络LMLMLM(c)Cluster/COW,c)Cluster/COW,物理物理物理物理/逻辑上多地址空间逻辑上多地址空间逻辑上多地址空间逻辑上多地址空间SMPMPPMPPWANLMDSMSM(d)Grid(Cluster of Clusters)d)Grid(Cluster of Clusters)d)Grid(Cluster of Clusters)d)Grid(Cluster of Clusters)并行计算机体系结构并行计算机体系结构5Copyright by Li Xinliang内存带宽内存带宽瓶颈瓶颈访存冲突机制访存冲突机

5、制控制复杂控制复杂虚拟共享存虚拟共享存储储“NUMA”访存冲突机访存冲突机制控制复杂制控制复杂克服了访存克服了访存冲突及内存冲突及内存瓶颈瓶颈访存的局部访存的局部性性 对网对网络要求不严络要求不严各系统的性能各系统的性能210021002100210021002100210021002100单处理器单处理器共享存储共享存储局域并行机群局域并行机群广域并行机群广域并行机群GFLOPS6Copyright by Li Xinliang低价格低价格可扩展可扩展自行搭建的简易机群自行搭建的简易机群7Copyright by Li Xinliang并行机群:并行机群:搭建简单搭建简单 简单的局域网简单的

6、局域网并行机群并行机群=局域网局域网早期早期 作者搭建的简易机群作者搭建的简易机群机群软件:Linux/Windows;套件OSCAR;MPICH.NT,我国最早搭建的机群:我国最早搭建的机群:LSEC 张林波张林波 搭建的搭建的32节点机节点机Copyright by Li Xinliang8美洲虎美洲虎/1700万亿次万亿次曙光曙光5000A/160万亿次万亿次天河天河1号号 千万亿次千万亿次CPU+GPU混合系统混合系统联想深腾联想深腾7000/106万亿次万亿次单精度千万亿次的单精度千万亿次的GPU系统系统 Mole-xx顶级的超级计算机顶级的超级计算机目标:目标:每秒每秒 1摩尔摩尔

7、次浮点运算次浮点运算(1 mole=6.02*1023)Copyright by Li Xinliang91National Supercomputing Center in TianjinChinaTianhe-1A-NUDT TH MPP,X5670 2.93Ghz 6C,NVIDIA GPU,FT-1000 8C/2010NUDT1863682566.004701.004040.002DOE/SC/Oak Ridge National LaboratoryUnited StatesJaguar-Cray XT5-HE Opteron 6-core 2.6 GHz/2009Cray Inc

8、.2241621759.002331.006950.603National Supercomputing Centre in Shenzhen(NSCS)ChinaNebulae-Dawning TC3600 Blade,Intel X5650,NVidia Tesla C2050 GPU/2010Dawning1206401271.002984.302580.004GSIC Center,Tokyo Institute of TechnologyJapanTSUBAME 2.0-HP ProLiant SL390s G7 Xeon 6C X5670,Nvidia GPU,Linux/Wind

9、ows/2010NEC/HP732781192.002287.631398.615DOE/SC/LBNL/NERSCUnited StatesHopper-Cray XE6 12-core 2.1 GHz/2010Cray Inc.1534081054.001288.632910.00排排名名SiteComputer计算机描述计算机描述cores核心数核心数实测速度实测速度/峰值速度峰值速度(Tflops);耗电量耗电量(KW)Top5 超级计算机超级计算机(2010-11)2.并行程序设计工具并行程序设计工具1)共享存储式共享存储式 自动并行(并行编译器)自动并行(并行编译器)Intel F

10、ortran/C 编译器 ifc aa.for-parallel 编译目标:编译目标:多线程程序多线程程序 OpenMP内 存CPU编译指示符:编译指示符:!omp parallel 10Copyright by Li Xinliang局域网络 计算机Cluster 系统2)分布存储式分布存储式 HPF (High-Performance Fortran)基于数据并行,程序改动较小基于数据并行,程序改动较小 效率较低效率较低 PVM(Parallel Virtual Machine)MPI(Message Passing Interface)基于消息传递基于消息传递 效率较高效率较高11Cop

11、yright 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,XP)编译环境:编译环境:Visual Fortran/MS Develop Studio 设置:头文件路径、连接路径设置:头文件路径、连接路径 运行:运行

12、:mpirun二、二、MPI并行编程入门并行编程入门1.简介简介12Copyright by Li XinliangCopyright by Li Xinliang13设置设置Windows下的下的MPI环境环境 Step 1:下载并安装下载并安装mpich.nt.1.2.5安装包;安装包;Step 2:更改更改Visual Fortran的环境设置,添加的环境设置,添加MPICH的的 include 及及lib 路径路径 1)Tools-options-Directories;在在“show directories for:”栏目选择栏目选择“include files”;在在“Direct

13、ories:”下的对话框里面添加下的对话框里面添加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 添加在链接库里。添加在链接库里。proj

14、ect-settings-link;在在 objcet/Library modules 下的对话框里面添加下的对话框里面添加 mpich.lib (例如(例如“kernel32.lib”变更为变更为 “kernel32.lib;mpich.lib”)Step3:编译程序,生成可执行文件编译程序,生成可执行文件Copyright by Li Xinliang14Step 4:利用利用mpirun 运行程序。运行程序。(该工具在(该工具在Windows桌面的桌面的“开始开始-程序程序-mpich-mpd-MPIRun”)在在“Application:”对话框里面选择刚编译生成的可执行文件。对话框里

15、面选择刚编译生成的可执行文件。在在“Number of Processes”对话框里面选择运行运行的进程数对话框里面选择运行运行的进程数(即所谓(即所谓“CPU个数个数”)。)。在在“Advanced options”对话框里面选择对话框里面选择“Always prompt for password”。MPIRun 运行时会要求用户输入计算机的用运行时会要求用户输入计算机的用户名和密码。户名和密码。点击点击“Run”即可运行即可运行(需要输入计算机的用户名和需要输入计算机的用户名和密码)。密码)。注意:注意:如果程序为如果程序为f90 程序,请修改程序,请修改mpif.h。将行首的注释符。将行

16、首的注释符“C”替换为替换为“!”,否则编否则编译会出错。(译会出错。(mpif.h 在安装路径的在安装路径的include 目录下,通常在目录下,通常在 C:/Porgram files/mpich/SDK/include里面)里面)通常通常MPIRun需要以计算机管理员的身份运行,需要对计算机设置用户名和密需要以计算机管理员的身份运行,需要对计算机设置用户名和密码。如果计算机没有设置密码,则需要在控制面板中设置。码。如果计算机没有设置密码,则需要在控制面板中设置。些防火墙及杀毒软件会阻止些防火墙及杀毒软件会阻止MPIRun的运行,如出现问题需要关闭这些防火墙的运行,如出现问题需要关闭这些防

17、火墙及杀毒软件。及杀毒软件。服务器服务器/前端机前端机计算节点计算节点a.exea.exea.exeMPI 程序的运行原理:程序的运行原理:服务器(前端机)编译服务器(前端机)编译 可执行代码可执行代码复制复制 N 份,份,每个节点运行一份每个节点运行一份 调用调用MPI库函数库函数 得到每个节点号得到每个节点号 my_id 根据根据my_id 不同,程序执行情况不同不同,程序执行情况不同 调用调用MPI 库函数进行通讯库函数进行通讯MPI 编程的基本思想:编程的基本思想:主从式,主从式,对等式对等式重要!重要!15Copyright by Li Xinliang重点:对等式程序设计重点:对等

18、式程序设计Copyright by Li Xinliang16计算节点计算节点a.exea.exea.exea.exe对等式对等式设计设计“对等式对等式”程序设计思想程序设计思想如果我是其中一个进程;如果我是其中一个进程;我应当做我应当做完成我需要完成的任务完成我需要完成的任务站在其中一个进程的角度思考站在其中一个进程的角度思考 一个简单的一个简单的MPI程序程序 hello.f90 include mpif.h integer myid,numprocs,ierr call MPI_Init(ierr)callMPI_Comm_rank(MPI_COMM_WORLD,myidmyid,ier

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

20、)Integer:ierr19Copyright 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)Int

21、eger:MPI_COMM_WORLD(Out)Integer:numprocs,ierr20Copyright by Li Xinliang进程的进程的ID号号(从(从0开始)开始)最重要的参数!最重要的参数!MPI_COMM_WORLD:MPI预定义的通信域;预定义的通信域;可换成创建的可换成创建的通信域通信域Comm基本概念:基本概念:通信域(通信子)通信域(通信子)01234567891011012345012345MPI_COMM_WORLDMPI_Comm_1MPI_Comm_221Copyright by Li Xinliang把全班分成几把全班分成几个组,执行任个组,执行任务更

22、方便务更方便“班名班名”,包含全班同学包含全班同学 MPI 预定义预定义my_id “学号学号”组的名字组的名字(编号)(编号)组内编号组内编号 MPI 消息传递函数消息传递函数 消息发送消息发送 MPI_Send(buf,count,datatype,dest,tag,comm,ierr)MPI消息:数据描述消息:数据描述+信封信封 数据描述:数据描述:起始地址,数据个数,数据类型起始地址,数据个数,数据类型 信封:信封:源源/目,标签,通信域目,标签,通信域22Copyright by Li Xinliang buf:数据起始地址数据起始地址 (Fortran:变量名变量名,C:变量地址变

23、量地址/指针指针)count:数据数目数据数目 (以以datatype为单位,必须连续为单位,必须连续)MPI_Send(buf,count,datatype,dest,tag,comm,ierr)23Copyright by Li XinliangDatatype:数据类型数据类型 MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER,MPI_BYTE,MPI_PACKEDReal*8 x(10)(给(给x 赋值)赋值)Call MPI_send(x(1),10,MPI_double_p

24、recision,.)数据的首地址数据的首地址 (不是变量的值)(不是变量的值)10 个数据(不是个数据(不是10个字节)个字节)Fortran:按地址传送按地址传送:x(1)或或 xC:按值传送:按值传送:&(x0)或或x dest:发送目标的发送目标的ID(integer)Tag:消息标签消息标签 (integer)Comm:通信域通信域 (integer),例:例:MPI_COMM_WORLD ierr:整数,如果成功返回整数,如果成功返回0例:例:real A .if(my_id.eq.0)Call MPI_Send(A,1,MPI_REAL,1,27,MPI_COMM_WORLD,i

25、err)标签标签 tag 的作用:的作用:区别不同的消息区别不同的消息MPI_Send(buf,count,datatype,dest,tag,comm,ierr)24Copyright by Li Xinliang标签。标签。举例:举例:0号同学向号同学向1号同学发出号同学发出3封封信,内容分别为信,内容分别为3科考试成绩,科考试成绩,为了防止为了防止弄混,必须用约定的数做标签。弄混,必须用约定的数做标签。目的目的ID消息接收消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)参数:参数:数据起始地址,数据,类型,源地址,标

26、签,数据起始地址,数据,类型,源地址,标签,通信域,返回状态通信域,返回状态 integer status(MPI_STATUS_SIZE)MPI接收匹配:接收匹配:数据类型、源地址、标签数据类型、源地址、标签要一致;否则不接收要一致;否则不接收数据发送缓冲区数据发送缓冲区消息装配消息装配消息传递消息传递消息拆卸消息拆卸数据接收缓冲区数据接收缓冲区25Copyright by Li Xinliang返回状态和调试信息返回状态和调试信息MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)源地址,标签源地址,标签 26Copyright

27、by Li Xinliang integer status(MPI_STATUS_SIZE)任意源地址任意源地址:MPI_ANY_SOURCE任意标签任意标签 :MPI_ANY_TAG包含必要信息包含必要信息MPI预定义的常量预定义的常量可匹配任意源、任意标签可匹配任意源、任意标签“无论谁来的信都接收无论谁来的信都接收”status(MPI_SOURCE):消息的源地址消息的源地址status(MPI_TAT):消息的标签消息的标签status(MPI_ERROR):错误码错误码MPI的消息发送机制的消息发送机制 两步进行两步进行MPI_Send(A,)发送发送MPI_Recv(B,)接收接收

28、 发送发送 变量变量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_STATUS_SIZE)call MPI_Init(ierr)call MPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr)sum_local=0 do i=myid+1,100,2 su

29、m_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_INTEGER,1,99,MPI_COMM_WORLD,status,ierr)sum_global=sum_local+sum_local1 print*,sum_global=,sum_global endif ca

30、ll MPI_Finalize(ierr)end例:例:计算计算 1+2+3+100,采用采用2个个CPU并行并行CPU 0:1+3+5+7+99CPU 1:2+4+6+8+100“对等式对等式对等式对等式”编程思路:编程思路:编程思路:编程思路:站在每个进程的角度思考站在每个进程的角度思考站在每个进程的角度思考站在每个进程的角度思考28Copyright by Li Xinliang结果显示29Copyright by Li Xinliang消息传递时要注意防止消息传递时要注意防止死锁死锁缓冲区缓冲区(“信箱信箱”)MPI_SendMPI_RecvMPI_Send,MPI_Recv 属于属于

31、阻塞式阻塞式发送发送/接收接收 发送成功发送成功 接收成功接收成功发送和接收是两个发送和接收是两个独立独立过程过程 子程序返回子程序返回Send 与与 Recv 一定要配合好一定要配合好发送到发送到“信箱信箱”即为成功即为成功30Copyright by Li Xinliang重要!重要!缓冲区缓冲区发生发生死锁死锁的情况的情况只发送,不接收只发送,不接收只接收,不发送只接收,不发送缓冲区缓冲区?31Copyright by Li Xinliang例,任务:例,任务:进程进程0 发送变量发送变量 A给进程给进程1 进程进程1发送变量发送变量 B给进程给进程0 if(myid.eq.0)then

32、 call MPI_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_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 1Step 2Step 1Step 2不会死锁不会死锁32Copyright by Li Xinliang死锁死锁

33、的例子的例子 if(myid.eq.0)then call MPI_recv(B,1,MPI_real,1,99,MPI_Comm_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 1Step 1Step 2不会死锁不会死锁?Step 233Cop

34、yright by Li Xinliang有可能死锁有可能死锁的例子的例子 if(myid.eq.0)then call MPI_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 2S

35、tep 2Step 134Copyright by Li Xinliang使用使用MPI_Sendrecv()函数来避免死锁函数来避免死锁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)次序由系统决定次序由系统决定35Copyri

36、ght by Li Xinliang基本的基本的MPI函数(函数(6个)个)MPI的子集的子集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,coun

37、t,datatype,source,tag,comm,status,ierr)MPI 只能点到点通信,其他函数是用这只能点到点通信,其他函数是用这6个函数开发的;个函数开发的;使用这使用这6个函数,可以实现个函数,可以实现MPI的全部功能。的全部功能。Copyright by Li Xinliang37系统时间(墙钟)函数系统时间(墙钟)函数:MPI_Wtime()real*8:time time=MPI_Wtime()返回当前墙钟时间返回当前墙钟时间(单位:秒)(单位:秒)(Wall time 与CPU time不同,Wall time更可靠)CPU分时为所有进程服务分时为所有进程服务Rea

38、l*8:Time_begin,Time_end (初始化初始化)Time_begin=MPI_Wtime().(计算任务)(计算任务).Call MPI_Barrier(comm,ierr)Time_end=MPI_Wtime()()Print*,“计算时间为:计算时间为:”,Time_end-Time_begin可用来测量程序的执行速度可用来测量程序的执行速度测量加速比及并行效率测量加速比及并行效率加速比加速比=N个进程的执行速度个进程的执行速度/单个进单个进程的执行速度程的执行速度并行效率并行效率=加速比加速比/N作者的作者的Hoam-OpenCFD软件加速比测试软件加速比测试CPU Co

39、re 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,MPI_COMM_WOR

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

41、=2!include mpif.h integer myid,sum_local,sum_global,ierr 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 call MPI_Reduce(sum_local,sum_global,1,MPI_INTEGER,&MPI_SUM,0,MPI_COMM_WORLD,ierr)print*,sum_global=,sum_global call MPI_F

42、inalize(ierr)end39Copyright by Li Xinliang预定义的规约操作:预定义的规约操作:MPI_MAX 最大值 MPI_LXOR 逻辑异或 MPI_MIN 最小值 MPI_BXOR 按位异或 MPI_SUM 求和 MPI_MAXLOC 最大值及位置 MPI_PROD 求积 MPI_MINLOC 最小值及位置 MPI_LAND 逻辑与 MPI_BAKD 按位与 MPI_LOR 逻辑或 MPI_BOR 安位或40Copyright by Li Xinliang3)同步同步 MPI_Barrier(comm,ierr)Comm:通讯域,通讯域,ierr:返回值返回值

43、等待所有进程都调用等待所有进程都调用MPI_Barrier(),函数才能返回函数才能返回Call MPI_barrier(MPI_COMM_WORLD,ierr)41Copyright by Li XinliangCopyright by Li Xinliang424.“对等式对等式”编程示例编程示例例例1:全收集的实现:全收集的实现 MPI_Allgather()题目:题目:N个进程,个进程,每个进程有一个数每个进程有一个数A;把所有进程把所有进程的数收集起来,按进程号的次序形成数组的数收集起来,按进程号的次序形成数组A0(1:N),存放存放到所有进程中。到所有进程中。把每个同学的电话把每个

44、同学的电话号码收集起来,形号码收集起来,形成通讯录,发给全成通讯录,发给全班同学班同学也可以是数组,各进程的数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,id,99,MPI_Comm_World,status,ierr)enddo else call MPI_Send(A,1,MPI_Real,0,.)endif if(myid.eq.0)then

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

46、oc-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()的的原有的原有的标准方式标准方式44Copyright by Li Xinliang广播的实现方式广播的实现方式“班长班长”依次收集信息后,依次收集信息后,“广播广播”给全班给全班Copyright

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

48、据进程发数据;“我我”收收 my_id-2进程发来的数据;进程发来的数据;该步完成后:该步完成后:“我我”得到了得到了my_id-1,my_id-2进程的数据进程的数据Step 3:我向:我向my_id+3发数据,发数据,我收我收my_id-3发来的数据发来的数据Step N-1 完成后,完成后,我得到了全部数据;我得到了全部数据;全体进程也得到了全部数据全体进程也得到了全部数据对等式编程思想:每个对等式编程思想:每个人做好人做好自己的自己的工作,全工作,全部工作就做好了部工作就做好了不设班长,所有人不设班长,所有人工作量相同工作量相同循环通讯循环通讯:由张林波研究员首次提出由张林波研究员首次

49、提出 do step=1,Nproc-1 id_send=myid+step;if(id_send.ge.Nproc)id_send=id_send-Nproc id_recv=myid-step;if(id_recv.lt.0)id_recv=id_recv+Nproc call MPI_Send(A,1,MPI_Real,id_send,99,&MPI_Comm_World,ierr)call MPI_Recv(A0(id_recv),1,MPI_Real,id_recv,99,&MPI_Comm_World,status,ierr)enddo 效率高于效率高于(1)(2)是是MPI_Al

50、lgather()的的现有的现有的标准方式标准方式47Copyright by Li Xinliang 计算矩阵计算矩阵 A*B=C ,A,B,C:N*N 矩阵矩阵 采用采用P个进程计算个进程计算(N能被能被P整除)整除)存储方式:分布存储,存储方式:分布存储,A,C 按行分割,按行分割,B 按列分割按列分割矩阵 A B C48Copyright by Li Xinliang例例2.计算矩阵乘积计算矩阵乘积“对等式对等式”程序设计思想:程序设计思想:站在每个进程角度思考站在每个进程角度思考 “我我”的数据的数据:dimension A1(N/P,N),B1(N,N/P),C1(N/P,N)“我

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁