
计算流体力学讲义CFD2013-第13讲-MPI并行程序设计初步1.ppt
56页计算流体力学讲义2013 第13讲 MPI并行程序设计 (1) 知识点: MPI程序的运行机制 拷贝N份,给每个进程一份 MPI的基本库函数6个库函数 “对等式”编程方法 站在单个进程的角度思考 1 2 Part 1: 基本概念及MPI并行编程入门 1. 并行计算基本概念 2. MPI并行编程入门 1)MPI 简介 2)MPI 的基本函数及消息传递 3)MPI的常用函数 4)对等式编程思想的举例说明 全收集、矩阵相乘 一、 基本概念 1. 并行计算机简介 大规模并行计算超级计算 (Supercomputing)/高性能 计算 (HPC) 为何需要超级计算? 应用领域的巨大计算需求 单CPU的计算能力有限 应用对计算资源的需求 3 CFD的计算资源依赖性 计算量大流动的多尺度性 (湍流) 大飞机全部流动细节完全分辨: 最小尺度:mm mm 量级; 计算网格: 1012-1016 ; 需计算量: 1020-30 ; 工程需求: 8个小时之内完成计算 预计: LES: 2045年; DNS: 2080年 最大尺度 m mm 几种我们常见的并行计算机 CPUCPUCPU 总线或交叉开关 Memory ( (a) SMP, a) SMP, 物理上单一地址空间物理上单一地址空间 CPUCPUCPU 定制网络 LMLMLM 虚拟分布共享存储(DSM) ( (b) DSM, b) DSM, 逻辑上单一地址空间逻辑上单一地址空间 P/CP/CP/C 定制/标准网络 LMLMLM ( (c) Cluster/COW, c) Cluster/COW, 物理物理/ /逻辑上多地址空间逻辑上多地址空间 SMPMPPMPP WAN LMDSMSM ( (d) Grid (Cluster of Clusters)d) Grid (Cluster of Clusters) 并行计算机体系结构 5 内存带宽 瓶颈 访存冲突机制 控制复杂 虚拟共享存 储“NUMA” 访存冲突机 制控制复杂 克服了访存 冲突及内存 瓶颈 访存的局部 性 对网 络要求不严 各系统的性能 2100 2100 21002100 2100 2100 21002100 2100 单处理器共享存储局域并行机群广域并行机群 G F L O P S 6 低价格 可扩展 自行搭建的简易机群 7 并行机群: 搭建简单 简单的局域网并行机群 = 局域网 早期 作者搭建的简易机群 机群软件:Linux/Windows; 套件OSCAR; MPICH.NT, 我国最早搭建的机群: LSEC 张林波 搭建的32节点机 8 美洲虎/1700万亿次 天河1号 千万亿次 CPU+GPU混合系统 单精度千万亿次的 GPU系统 Mole-xx 顶级的超级计算机 天河2号: CPU + 加速卡 (Xeon Phi) 3.39亿亿次 9 Top5 超级计算机 (2013-6) 排 名 计计算机核心数Rmax (Tflops) Power (KW) 1 Tianhe-2 (MilkyWay-2) - TH-IVB-FEP Cluster, Intel Xeon E5-2692 12C 2.200GHz, TH Express-2, Intel Xeon Phi 31S1P NUDT, China 3120000 33862.7; 17808 2Titan - Cray XK7 , Opteron 6274 16C 2.200GHz, Cray Gemini interconnect, NVIDIA K20 x Cray Inc, USA 56064017590.0; 8209 3Sequoia - BlueGene/Q, Power BQC 16C 1.60 GHz, Custom IBM, USA 157286417173.2; 7890 4K computer, SPARC64 VIIIfx 2.0GHz, Tofu interconnect Fujitsu, Japan 70502410510.0; 12660 5Mira - BlueGene/Q, Power BQC 16C 1.60GHz, Custom IBM , USA 7864328586.6; 3945 2. 并行程序设计工具 1) 共享存储式 自动并行(并行编译器) Intel Fortran/C 编译器 ifc aa.for -parallel 编译目标: 多线程程序 OpenMP 内 存 CPU 编译指示符: !omp parallel 10 局域网络 计算机 Cluster 系统 2) 分布存储式 HPF (High-Performance Fortran) 基于数据并行,程序改动较小 效率较低 PVM (Parallel Virtual Machine) MPI (Message Passing Interface) 基于消息传递 效率较高 11 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 设置:头文件路径、连接路径 运行: mpirun 二、MPI并行编程入门 1. 简介 12 13 设置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”; 在“Directories:” 下的 对话框里面添加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 (例如 “kernel32.lib” 变更为 “kernel32.lib ; mpich.lib”) Step3: 编译程序,生成可执行文件 14 Step 4: 利用mpirun 运行程序 (该工具在Windows桌面的 “ 开始- 程序- mpich - mpd - MPIRun”) 在“Application:”对话框里面选择刚编译生成的可执行文件 在 “Number of Processes” 对话框里面选择运行运行的进程数 (即所谓 “CPU个数”) 在“Advanced options ” 对话框里面选择 “Always prompt for password ” MPIRun 运行时会要求用户输入计算机的用 户名和密码 点击“Run”即可运行 (需要输入计算机的用户名和密 码) 注意: 如果程序为f90 程序,请修改mpif.h 将行首的注释符 “C” 替换为“!”, 否则编 译会出错mpif.h 在安装路径的include 目录下,通常在 C:/Porgram files/mpich/SDK/include里面) 通常MPIRun需要以计算机管理员的身份运行,需要对计算机设置用户名和密 码。
如果计算机没有设置密码,则需要在控制面板中设置 些防火墙及杀毒软件会阻止MPIRun的运行,如出现问题需要关闭这些防火墙 及杀毒软件 服务器/前端机 计算节点 a.exe a.exe a.exe MPI 程序的运行原理: 服务器(前端机)编译 可执行代码复制 N 份,每个节点运行一份 调用MPI库函数 得到每个节点号 my_id 根据my_id 不同,程序执行情况不同 调用MPI 库函数进行通讯 MPI 编程的基本思想: 主从式,对等式 重要! 15 重点:对等式程序设计 16 计算节点 a.exe a.exe a.exe a.exe 对等式 设计 “对等式”程序设计思想 如果我是其中一个进程; 我应当做 完成我需要完成的任务 站在其中一个进程的角度思考 一个简单的MPI程序 hello.f90 include mpif.h integer myid,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) end 17 运行结果: 18 2. 基本MPI函数 (MPI 子集) 1) MPI初始化 call MPI_Init(ierr) (out) Integer: ierr 2) MPI结束 call MPI_Finalize(ierr) (out) Integer: ierr 19 (in) : 输入参数; (out) : 输出参数 ; 整数,返回值非0表示出错 3) 得到当前进程标识 callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) (In) Integer: MPI_COMM_WORLD 为进程所在的通信域 (Out) Integer: myid, ierr 4) 得到通信域包含的进程数 Call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) (In) Integer: MPI_COMM_WORLD (Out) Integer: numprocs,ierr 20 进程的ID号 (从0开始 ) 最重要的参数! MPI_COMM_WORLD: MPI预定义的通信域; 可换成创建的 通信域Comm 基本概念: 通信域(通信子) 0 1 2 3 4 5 6 7 8 9 1011 0 1 2 3 4 5 0 1 2 3 4 5 MPI_COMM_WORLD MPI_Comm_1 MPI_Comm_2 21 把全班分成几 个组,执行任 务更方便 “班名”, 包含全班同学 MPI 预定义 my_id “学号” 组的名字( 编号) 组内编号 MPI 消息传递函数 消息发送 MPI_Send(buf,count,datatype,dest,tag,comm, ierr) MPI消息:数据描述+信封 数据描述:起始地址,数据个数,数据类型 信封: 源/目,标签,通信域 22 buf: 数据起始地址 (Fortran : 变量名, C: 变量地址/指针 ) count: 数据数目 (以datatype为单位,必须连续) MPI_Send(buf,count,datatype,dest,tag,comm,ierr) 23 Datatype: 数据类型 MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_LOGICAL, MPI_CHARACTER, MPI_BYTE, MPI_PACKED Real*8 x(10) (给x 赋值) Call MPI_send( 。












