《计算流体力学中科院力学所第5讲-MPI并行程序设计初步课件》由会员分享,可在线阅读,更多相关《计算流体力学中科院力学所第5讲-MPI并行程序设计初步课件(57页珍藏版)》请在金锄头文库上搜索。
1、计算流体力学讲义计算流体力学讲义 第五讲第五讲 MPI并行程序设计并行程序设计 (1)李新亮李新亮 ;力学所主楼;力学所主楼219; 82543801 知识点:知识点: MPIMPI程序的运行机制程序的运行机制 拷贝拷贝N N份,给每个进程一份份,给每个进程一份 MPI MPI的基本库函数的基本库函数66个库函数个库函数 “对等式对等式”编程方法编程方法 站在单个进程的角度思考站在单个进程的角度思考1讲义、课件上传至讲义、课件上传至 (流体中文网)流体中文网) - “流体论坛流体论坛” -“ CFD基础理论基础理论 ”Copyright by Li XinliangCopyright by L
2、i Xinliang2Part 1: 基本概念及基本概念及MPI并行编程入门并行编程入门 1.并行计算基本概念并行计算基本概念2. MPI并行编程入门并行编程入门 1)MPI 简介简介 2)MPI 的基本函数及消息传递的基本函数及消息传递 3)MPI的常用函数的常用函数 4)对等式编程思想的举例说明)对等式编程思想的举例说明 全收集、矩阵相乘全收集、矩阵相乘一、一、 基本概念基本概念1.并行计算机简介并行计算机简介大规模并行计算大规模并行计算超级计算超级计算(Supercomputing)/高性能高性能计算计算 (HPC)为何需要超级计算?为何需要超级计算? 应用领域的巨大计算需求应用领域的巨
3、大计算需求单单CPU的计算能力有限的计算能力有限 应用对计算资源的需求应用对计算资源的需求3Copyright by Li Xinliang CFD的计算资源依赖性的计算资源依赖性 计算量大计算量大流动的多尺度性流动的多尺度性 (湍流)(湍流) 大飞机全部流动细节完全分辨:大飞机全部流动细节完全分辨: 最小尺度:最小尺度:m mm mm 量级;量级; 计算网格:计算网格: 1012-1016 ; 需计算量:需计算量: 1020-30 ; 工程需求:工程需求: 8个小时之内完成计算个小时之内完成计算 预计:预计: LES: 2045年;年; DNS: 2080年年最大尺度最大尺度 mmm几种我们
4、常见的并行计算机几种我们常见的并行计算机CPUCPUCPU总线或交叉开关总线或交叉开关Memory( (a) SMP, a) SMP, 物理上单一地址空间物理上单一地址空间物理上单一地址空间物理上单一地址空间CPUCPUCPU定制网络定制网络LMLMLM虚拟分布共享存储虚拟分布共享存储(DSM) ( (b) DSM, b) DSM, 逻辑上单一地址空间逻辑上单一地址空间逻辑上单一地址空间逻辑上单一地址空间P/CP/CP/C定制定制/标准网络标准网络LMLMLM( (c) Cluster/COW, c) Cluster/COW, 物理物理物理物理/ /逻辑上多地址空间逻辑上多地址空间逻辑上多地址
5、空间逻辑上多地址空间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内存带宽内存带宽瓶颈瓶颈访存冲突机制访存冲突机制控制复杂控制复杂虚拟共享存虚拟共享存储储“NUMA”访存冲突机访存冲突机制控制复杂制控制复杂克服了访存克服了访存冲突及内存冲突及内存瓶颈瓶颈访存的局部访存的局部性
6、性 对网对网络要求不严络要求不严各系统的性能各系统的性能210021002100210021002100210021002100单处理器单处理器共享存储共享存储局域并行机群局域并行机群广域并行机群广域并行机群GFLOPS6Copyright by Li Xinliang低价格低价格可扩展可扩展自行搭建的简易机群自行搭建的简易机群7Copyright by Li Xinliang并行机群:并行机群: 搭建简单搭建简单 简单的局域网简单的局域网并行机群并行机群 = 局域网局域网早期早期 作者搭建的简易机群作者搭建的简易机群机群软件:Linux/Windows; 套件OSCAR; MPICH.NT,
7、 我国最早搭建的机群:我国最早搭建的机群: LSEC 张林波张林波 搭建的搭建的32节点机节点机Copyright by Li Xinliang8美洲虎美洲虎/1700万亿次万亿次曙光曙光5000A/160万亿次万亿次天河天河1号号 560万亿次万亿次CPU+GPU混合系统混合系统联想深腾联想深腾7000/106万亿次万亿次单精度千万亿次的单精度千万亿次的GPU系统系统 Mole-xx顶级的超级计算机顶级的超级计算机目标:目标: 每秒每秒 1摩尔摩尔次浮点运算次浮点运算 (1 mole=6.02*1023)Copyright by Li Xinliang9排排名名SiteComputer计算机
8、描述计算机描述cores核心数核心数实测速度实测速度/峰值速峰值速度度 (Tflops); 耗耗电量电量 (KW)1Oak Ridge National LaboratoryUnited StatesJaguar - Cray XT5-HE Opteron Six Core 2.6 GHz / 2009 Cray Inc.2241621759/2331 ;6950.62DOE/NNSA/LANL United StatesRoadrunner - BladeCenter QS22/LS21 Cluster, PowerXCell 8i 3.2 Ghz / Opteron DC 1.8 GHz,
9、 Voltaire Infiniband / 2009 ;IBM1224001042/1375.78;2345.503National Institute for Computational Sciences/University of TennesseeUnited StatesKraken XT5 - Cray XT5-HE Opteron Six Core 2.6 GHz / 2009 Cray Inc.98928831.70/1028.85Top5 超级计算机超级计算机 (2009-11)美洲虎半年间性能猛增69的秘密在于处理器核心数量的暴涨:在配备AMD刚刚发布的六核心“伊斯坦布尔”
10、Opteron 2435 2.6GHz(单颗浮点性能10.4GFlops)后,美洲虎的核心数从129600个增至224162个(+73),且每核心搭配2GB内存,每个完整的计算节点由12个处理核心和16GB共享内存组成,整套系统300TB内存、10PB(10000TB)硬盘。Copyright by Li Xinliang10排排名名SiteComputer计算机描述计算机描述cores核心数核心数实测速度实测速度/峰值速峰值速度度 (万亿次)(万亿次); 耗电量耗电量 (千瓦)(千瓦)4Forschungszentrum Juelich (FZJ)GermanyJUGENE - Blue G
11、ene/P Solution / 2009 IBM294912825.50/1002.7;22685National SuperComputer Center in Tianjin/NUDTChinaTianhe-1 - NUDT TH-1 Cluster, Xeon E5540/E5450, ATI Radeon HD 4870 2, Infiniband / 2009 NUDT71680563.10/1206.19Top5 超级计算机超级计算机 (2009-11)天河天河1号:我国最快的计号:我国最快的计算机算机; CPU + GPU的混的混合系统合系统GPU计算计算 最先进的高性能计算最
12、先进的高性能计算2. 并行程序设计工具并行程序设计工具1) 共享存储式共享存储式 自动并行(并行编译器)自动并行(并行编译器) Intel Fortran/C 编译器 ifc aa.for -parallel 编译目标:编译目标: 多线程程序多线程程序 OpenMP内 存CPU编译指示符:编译指示符: !omp parallel 11Copyright by Li Xinliang局域网络 计算机Cluster 系统2) 分布存储式分布存储式 HPF (High-Performance Fortran) 基于数据并行,程序改动较小基于数据并行,程序改动较小 效率较低效率较低 PVM (Para
13、llel Virtual Machine) MPI (Message Passing Interface) 基于消息传递基于消息传递 效率较高效率较高12Copyright 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 (
14、Windows 2000,XP) 编译环境:编译环境:Visual Fortran/ MS Develop Studio 设置:头文件路径、连接路径设置:头文件路径、连接路径 运行:运行: mpirun二、二、MPI并行编程入门并行编程入门1. 简介简介13Copyright by Li XinliangCopyright by Li Xinliang14设置设置Windows下的下的MPI环境环境 Step 1: 下载并安装下载并安装mpich.nt.1.2.5安装包;安装包;Step 2: 更改更改Visual Fortran的环境设置,添加的环境设置,添加MPICH的的 include
15、及及lib 路径路径 1) Tools-options- Build; 在在“show directories for:” 栏目选择栏目选择 “include files”; 在在“Directories:” 下的对话框里面添加下的对话框里面添加MPICH include 的路径,例如的路径,例如“C:/Porgram ” (根据安装的具体位置而定)根据安装的具体位置而定) 在在“show directories for:” 的栏目选择的栏目选择“Library files”, 在在 “Directories:”下的对话框里面添加下的对话框里面添加 MPICH Lib 的路径,的路径, 例如例
16、如 “C:/Porgram ” 2) 程序编译时,请把程序编译时,请把mpich.lib 添加在链接库里。添加在链接库里。 project-settings-link ; 在在 objcet/Library modules 下的对话框里面添加下的对话框里面添加 mpich.lib (例如(例如 “kernel32.lib” 变更为变更为 “kernel32.lib ; mpich.lib”)Step3: 编译程序,生成可执行文件编译程序,生成可执行文件Copyright by Li Xinliang15Step 4: 利用利用mpirun 运行程序。运行程序。 (该工具在(该工具在Window
17、s桌面的桌面的 “开始开始- 程序程序- mpich - mpd - MPIRun”) 在在“Application:”对话框里面选择刚编译生成的可执行文件。对话框里面选择刚编译生成的可执行文件。 在在“Number of Processes” 对话框里面选择运行运行的进程数对话框里面选择运行运行的进程数 (即所谓(即所谓“CPU个数个数”)。)。 在在“Advanced options ” 对话框里面选择对话框里面选择 “Always prompt for password ”。 MPIRun 运行时会要求用户输入计算机的用运行时会要求用户输入计算机的用户名和密码。户名和密码。 点击点击“R
18、un”即可运行即可运行 (需要输入计算机的用户名和需要输入计算机的用户名和密码)。密码)。注意:注意: 如果程序为如果程序为f90 程序,请修改程序,请修改mpif.h 。将行首的注释符。将行首的注释符 “C” 替换为替换为“!”, 否则编否则编译会出错。(译会出错。(mpif.h 在安装路径的在安装路径的include 目录下,通常在目录下,通常在 C:/Porgram 里面)里面) 通常通常MPIRun需要以计算机管理员的身份运行,需要对计算机设置用户名和密需要以计算机管理员的身份运行,需要对计算机设置用户名和密码。如果计算机没有设置密码,则需要在控制面板中设置。码。如果计算机没有设置密码
19、,则需要在控制面板中设置。 些防火墙及杀毒软件会阻止些防火墙及杀毒软件会阻止MPIRun的运行,如出现问题需要关闭这些防火墙的运行,如出现问题需要关闭这些防火墙及杀毒软件。及杀毒软件。服务器服务器/前端机前端机计算节点计算节点a.exea.exea.exeMPI 程序的运行原理:程序的运行原理: 服务器(前端机)编译服务器(前端机)编译 可执行代码可执行代码复制复制 N 份,份,每个节点运行一份每个节点运行一份 调用调用MPI库函数库函数 得到每个节点号得到每个节点号 my_id 根据根据my_id 不同,程序执行情况不同不同,程序执行情况不同 调用调用MPI 库函数进行通讯库函数进行通讯MP
20、I 编程的基本思想:编程的基本思想: 主从式,主从式,对等式对等式重要!重要!16Copyright by Li Xinliang重点:对等式程序设计重点:对等式程序设计Copyright by Li Xinliang17计算节点计算节点a.exea.exea.exea.exe对等式对等式设计设计“对等式对等式”程序设计思想程序设计思想如果我是其中一个进程;如果我是其中一个进程;我应当做我应当做完成我需要完成的任务完成我需要完成的任务站在其中一个进程的角度思考站在其中一个进程的角度思考 一个简单的一个简单的MPI程序程序 hello.f90 include mpif.h integer myi
21、d,numprocs,ierr call MPI_Init(ierr) callMPI_Comm_rank(MPI_COMM_WORLD,myidmyid,ierr) call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) Print*, Hello World! my id is :,myid ! 添加自己的程序添加自己的程序 ! call MPI_Finalize(ierr) end18Copyright by Li Xinliang运行结果:运行结果: 19Copyright by Li Xinliang2.基本基本MPI函数函数 (MPI 子集
22、)子集) 1) MPI初始化初始化 call MPI_Init(ierr) (out) Integer: ierr 2) MPI结束结束 call MPI_Finalize(ierr) (out) Integer: ierr20Copyright by Li Xinliang(in) : 输入参数;输入参数;(out) : 输出参数;输出参数; 整数,返回值非整数,返回值非0表示出错表示出错3) 得到当前进程标识得到当前进程标识callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)(In) Integer: MPI_COMM_WORLD 为进程所在的通信域为进程
23、所在的通信域(Out) Integer: myid, ierr 4) 得到通信域包含的进程数得到通信域包含的进程数CallMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)(In) Integer: MPI_COMM_WORLD(Out) Integer: numprocs,ierr21Copyright by Li Xinliang进程的进程的ID号号 (从(从0开始)开始)最重要的参数!最重要的参数!MPI_COMM_WORLD: MPI预定义的通信域;预定义的通信域; 可换成创建的可换成创建的通信域通信域Comm基本概念:基本概念: 通信域(通信子)通
24、信域(通信子)01234567891011012345012345MPI_COMM_WORLDMPI_Comm_1MPI_Comm_222Copyright by Li Xinliang把全班分成几把全班分成几个组,执行任个组,执行任务更方便务更方便“班名班名”, 包含全班同学包含全班同学 MPI 预定义预定义my_id “学号学号”组的名字组的名字(编号)(编号)组内编号组内编号 MPI 消息传递函数消息传递函数 消息发送消息发送 MPI_Send(buf,count,datatype,dest,tag,comm, ierr) MPI消息:数据描述消息:数据描述+信封信封 数据描述:数据描述
25、:起始地址,数据个数,数据类型起始地址,数据个数,数据类型 信封:信封: 源源/目,标签,通信域目,标签,通信域23Copyright by Li Xinliang buf: 数据起始地址数据起始地址 (Fortran : 变量名变量名, C: 变量地址变量地址/指针指针) count: 数据数目数据数目 (以以datatype为单位,必须连续为单位,必须连续) MPI_Send(buf,count,datatype,dest,tag,comm,ierr)24Copyright by Li XinliangDatatype: 数据类型数据类型 MPI_INTEGER, MPI_REAL, MP
26、I_DOUBLE_PRECISION, MPI_COMPLEX, MPI_LOGICAL, MPI_CHARACTER, MPI_BYTE, MPI_PACKEDReal*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:
27、消息标签消息标签 (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,ierr) 标签标签 tag 的作用:的作用: 区别不同的消息区别不同的消息MPI_Send(buf,count,datatype,dest,tag,comm,ierr)25Copyright by Li Xinliang标签。标签。 举例:举例:0号同学向号同学向1
28、号同学发出号同学发出3封封信,内容分别为信,内容分别为3科考试成绩,科考试成绩, 为了防止为了防止弄混,必须用约定的数做标签。弄混,必须用约定的数做标签。目的目的ID消息接收消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr) 参数:参数: 数据起始地址,数据,类型,源地址,标签,数据起始地址,数据,类型,源地址,标签, 通信域,返回状态通信域,返回状态 integer status(MPI_STATUS_SIZE) MPI接收匹配:接收匹配:数据类型、源地址、标签数据类型、源地址、标签要一致;否则不接收要一致;否则不接收数据
29、发送缓冲区数据发送缓冲区消息装配消息装配消息传递消息传递消息拆卸消息拆卸数据接收缓冲区数据接收缓冲区26Copyright by Li Xinliang返回状态和调试信息返回状态和调试信息MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr) 源地址,标签源地址,标签 27Copyright by Li Xinliang integer status(MPI_STATUS_SIZE) 任意源地址任意源地址: MPI_ANY_SOURCE任意标签任意标签 :MPI_ANY_TAG包含必要信息包含必要信息MPI预定义的常量预定义的常量可匹配
30、任意源、任意标签可匹配任意源、任意标签“无论谁来的信都接收无论谁来的信都接收”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
31、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 sum_local=sum_local+i enddo print*, myid=,myid, sum_local=,sum_local if(myid .eq. 1) call MPI_SEND(sum_lo
32、cal,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 call MPI_Finalize(ierr) end例:例: 计算计算 1+2+3 +100, 采用采用2个个CPU并行并行CPU 0: 1+3+5+7 +99CPU 1: 2+4+6
33、+8 +100“ “对等式对等式对等式对等式” ”编程思路:编程思路:编程思路:编程思路: 站在每个进程的角度思考站在每个进程的角度思考站在每个进程的角度思考站在每个进程的角度思考29Copyright by Li Xinliang结果显示30Copyright by Li Xinliang消息传递时要注意防止消息传递时要注意防止死锁死锁缓冲区缓冲区(“信箱信箱”)MPI_SendMPI_RecvMPI_Send, MPI_Recv 属于属于阻塞式阻塞式发送发送/接收接收 发送成功发送成功 接收成功接收成功发送和接收是两个发送和接收是两个独立独立过程过程 子程序返回子程序返回Send 与与 R
34、ecv 一定要配合好一定要配合好发送到发送到“信箱信箱”即为成功即为成功31Copyright by Li Xinliang重要!重要!缓冲区缓冲区发生发生死锁死锁的情况的情况只发送,不接收只发送,不接收只接收,不发送只接收,不发送缓冲区缓冲区?32Copyright 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_recv(B,
35、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不会死锁不会死锁33Copyright by Li Xinliang死锁死锁的例子的例子 if (myid .eq. 0) then call MPI_recv(B,1,MPI_real, 1
36、, 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 234Copyright by Li Xinliang有可能死锁有可能死锁的例子的例子 if
37、 (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 2Step 2Step 135Copyrigh
38、t 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)次序由系统决定次序由系统决定36Copyright by Li Xinlia
39、ng基本的基本的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,count,datatype
40、,source,tag,comm,status,ierr) MPI 只能点到点通信,其他函数是用这只能点到点通信,其他函数是用这6个函数开发的;个函数开发的;使用这使用这6个函数,可以实现个函数,可以实现MPI的全部功能。的全部功能。Copyright by Li Xinliang38系统时间(墙钟)函数系统时间(墙钟)函数: MPI_Wtime( ) real*8: time time=MPI_Wtime( )返回当前墙钟时间返回当前墙钟时间 (单位:秒)(单位:秒)(Wall time 与CPU time不同,Wall time更可靠)CPU分时为所有进程服务分时为所有进程服务Real *
41、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软件加速比测试软件加速比测
42、试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_R
43、EAL,0,MPI_COMM_WORLD,ierr)广播:广播: 树状传播,效率较高树状传播,效率较高广播的逻辑图广播的逻辑图广播的实际实现方式广播的实际实现方式树状传播树状传播MPI的消息:的消息: 只能点到点传递;只能点到点传递;不能真正不能真正“广播广播”392) 规约规约 (求和,求最大值,求最小值,(求和,求最大值,求最小值,) MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm,ierr)发送缓冲区,接收缓冲区,数目,数据类型,规约操作,通讯域发送缓冲区,接收缓冲区,数目,数据类型,规约操作,通讯域! sum from 1
44、to 100 ! Run only for np=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*,
45、sum_global= ,sum_global call MPI_Finalize(ierr) end40Copyright 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 安位或41Copyright by Li Xinliang3)同步同步 MPI_Barrier
46、 ( comm, ierr) Comm: 通讯域,通讯域, ierr: 返回值返回值 等待所有进程都调用等待所有进程都调用MPI_Barrier(), 函数才能返回函数才能返回Call MPI_barrier(MPI_COMM_WORLD, ierr)42Copyright by Li XinliangCopyright by Li Xinliang434. “对等式对等式”编程示例编程示例例例1:全收集的实现:全收集的实现 MPI_Allgather( )题目:题目: N个进程,个进程, 每个进程有一个数每个进程有一个数A; 把所有进程把所有进程的数收集起来,按进程号的次序形成数组的数收集起
47、来,按进程号的次序形成数组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,id,99,MPI_Comm_World,status,ierr) endd
48、o 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,) endif44Copyright by Li Xinliang“班长班长”依次与所有同依次与所有同学通信,收集信息;学通信,收集信息;收集后依次通信,发放收集后依次通信,发放信息信息负载不均衡负载不均衡效率最低效率最低可能会死锁可能会死锁方式方式2: 根进程收集所有
49、数据根进程收集所有数据; 根进程广播到所有进程根进程广播到所有进程 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( )的的原有的原有的标准方式标准方式45C
50、opyright by Li Xinliang广播的实现方式广播的实现方式“班长班长”依次收集信息后,依次收集信息后,“广播广播”给全班给全班Copyright by Li Xinliang461A 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: 循环通信循环通信Copyr
51、ight by Li Xinliang472A send to ID 1 0 1 2 3 N-12B 0 1 2 3 N-1Step 2: “我我”向向 my_id+2 进程发数据进程发数据; “我我”收收 my_id-2进程发来的数据;进程发来的数据;该步完成后:该步完成后: “我我”得到了得到了my_id-1, my_id-2进程的数据进程的数据Step 3 :我向:我向my_id+3发数据,发数据, 我收我收my_id-3发来的数据发来的数据Step N-1 完成后,完成后, 我得到了全部数据;我得到了全部数据; 全体进程也得到了全部数据全体进程也得到了全部数据对等式编程思想:每个对等式
52、编程思想:每个人做好人做好自己的自己的工作,全工作,全部工作就做好了部工作就做好了不设班长,所有人不设班长,所有人工作量相同工作量相同循环通讯循环通讯: 由张林波研究员首次提出由张林波研究员首次提出 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_Recv(A0(id_recv),1,MPI_Real,id_recv,99, & MPI_Comm_Wo
53、rld,status,ierr) enddo 效率高于效率高于 (1) (2) 是是MPI_Allgather( )的的现有的现有的标准方式标准方式48Copyright by Li Xinliang 计算矩阵计算矩阵 A*B=C , A,B,C: N*N 矩阵矩阵 采用采用P个进程计算个进程计算 (N能被能被P整除)整除) 存储方式:分布存储,存储方式:分布存储, A, C 按行分割,按行分割, B 按列分割按列分割矩阵 A B C49Copyright by Li Xinliang例例2. 计算矩阵乘积计算矩阵乘积“对等式对等式”程序设计思想:程序设计思想: 站在每个进程角度思考站在每个进
54、程角度思考 “我我”的数据的数据: dimension A1(N/P,N), B1(N,N/P), C1(N/P,N) “我我”的任务的任务: 计算计算 C10, K KP-1ACBA1B1C150Copyright 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 只索取数据,何人提供?只索取数据,何人提供? “命令命令”他人提供数据?他人提
55、供数据? 不符合不符合“对等式对等式”程序设计思想程序设计思想 0, K KP-1ACB如何完成任务?如何完成任务?B_tmp(N,N/P,P)C1(0)C1(1)C151Copyright by Li XinliangB顺次发送数据顺次发送数据 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
56、) enddo 问题:问题: 负载不均衡负载不均衡 实际上是实际上是 串行串行 52Copyright by Li Xinliang一窝蜂地涌向同一个进程,负载不均衡,容易阻塞B按节拍循环发送数据按节拍循环发送数据 (同(同“全收集全收集”) do step=0,P-1 id_send=mod(myid+step,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
57、(id_recv)=A1*B_tmp) enddo 53Copyright by Li Xinliang send to ID 0 0 1 2 3 N-1工作数组,存放接受来的矩阵Bk服务器服务器/前端机前端机计算节点计算节点a.exea.exea.exe 回顾回顾 MPI 程序的运行原理:程序的运行原理: 服务器(前端机)编译服务器(前端机)编译 可执行代码复制可执行代码复制 N 份,每个节点运行一份份,每个节点运行一份 调用调用MPI库函数库函数 得到每个节点号得到每个节点号 myid 根据根据myid 不同,程序不同不同,程序不同 调用调用MPI 库函数进行通讯库函数进行通讯MPI 编程
58、的基本思想:编程的基本思想: 主从式,主从式,对等式对等式推荐采用对等式编程思想推荐采用对等式编程思想 基本的基本的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,
59、ierr)消息接收消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr) Copyright by Li Xinliang56作业作业1.熟悉熟悉MPI环境及基本编程环境及基本编程 1) 建立建立MPI运行环境运行环境 (有并行机账户或在微机上安装(有并行机账户或在微机上安装MPI环境)。环境)。 2) 编制如下基本的编制如下基本的MPI程序程序 计算计算S=1+2+3+1000 要求程序可以实现要求程序可以实现N个进程的并行运行且负载尽量均个进程的并行运行且负载尽量均衡。衡。 N可变,程序中使用可变,程序中使用MPI_Comm
60、_Size()函数读入函数读入N。由由0号进程打印计算结果。号进程打印计算结果。 3)在并行环境上运行,输出结果。)在并行环境上运行,输出结果。 要求:要求: 提交源程序及运行情况的屏幕截图提交源程序及运行情况的屏幕截图Copyright by Li Xinliang572. 实现矩阵相乘的并行计算实现矩阵相乘的并行计算矩阵矩阵A, B 均为均为N*N的方阵,试计算矩阵的方阵,试计算矩阵C=AB;使用使用P个进程并行计算(个进程并行计算(N可以被可以被P整除);整除);矩阵矩阵A,B及及C均采用分布式存储;均采用分布式存储;A, C按行分割,按行分割, B按列分割存储(见本稿按列分割存储(见本
61、稿 47页)。页)。要求编写计算要求编写计算C矩阵的矩阵的MPI程序,并进行计算。程序,并进行计算。实际计算时,矩阵实际计算时,矩阵A, B请采用如下值,请采用如下值, N设为设为100计算出计算出C矩阵后,请计算矩阵后,请计算 ,并由根节点打印出来。,并由根节点打印出来。将将S值与串行程序的结果进行对比,校验程序的正确性;值与串行程序的结果进行对比,校验程序的正确性;使用使用1,2,4,10个进程进行计算,并利用个进程进行计算,并利用MPI_Wtime( )函数计算程函数计算程序的运行时间;考核加速比及计算效率。序的运行时间;考核加速比及计算效率。要求:要求: 1)提交计算程序;)提交计算程序; 2)使用)使用1,2,4,10个进程计算,提交计个进程计算,提交计算结果(算结果(S值及计算时间)、计算效率及加速比。值及计算时间)、计算效率及加速比。