计算流体力学讲义第五讲MPI并行程序设计(1)李新亮lixl@imech.ac.cn;力学所主楼219;82543801知识点:MPI程序的运行机制——拷贝N份,给每个进程一份MPI的基本库函数——6个库函数“对等式”编程方法——站在单个进程的角度思考1讲义、课件上传至(流体中文网)-“流体论坛”-“CFD基础理论”CopyrightbyLiXinliangCopyrightbyLiXinliang2Part1:基本概念及MPI并行编程入门1.并行计算基本概念2.MPI并行编程入门1)MPI简介2)MPI的基本函数及消息传递3)MPI的常用函数4)对等式编程思想的举例说明——全收集、矩阵相乘一、基本概念全球气候变化图1-1系统速度天气预报72小时油藏建模机翼设计物体特性分析年后19951991198019881993存储器容量48结构生物学药物设计化学动力学1000GB100GB10GB1GB100MB10MB小时天气预报100Mflops1Gflops10Gflops100Gflops1Tflops人类基因湍流飞行动力学海洋环流粘滞流体动力学超导建模半导体建模视觉量子染色动力学3维等离子体建模1.并行计算机简介大规模并行计算——超级计算(Supercomputing)/高性能计算(HPC)为何需要超级计算?•应用领域的巨大计算需求•单CPU的计算能力有限应用对计算资源的需求3CopyrightbyLiXinliang●CFD的计算资源依赖性计算量大——流动的多尺度性(湍流)大飞机全部流动细节完全分辨:最小尺度:mm~mm量级;计算网格:1012-1016;需计算量:~1020-30;工程需求:8个小时之内完成计算预计:LES:2045年;DNS:2080年最大尺度~mmm几种我们常见的并行计算机CPUCPUCPU…总线或交叉开关Memory(a)SMP,物理上单一地址空间CPUCPUCPU…定制网络LMLMLM虚拟分布共享存储(DSM)(b)DSM,逻辑上单一地址空间P/CP/CP/C…定制/标准网络LMLMLM(c)Cluster/COW,物理/逻辑上多地址空间SMPMPPMPP…WANLMDSMSM(d)Grid(ClusterofClusters)并行计算机体系结构5CopyrightbyLiXinliang内存带宽瓶颈访存冲突机制控制复杂虚拟共享存储“NUMA”访存冲突机制控制复杂克服了访存冲突及内存瓶颈访存的局部性——对网络要求不严各系统的性能210021002100210021002100210021002100单处理器共享存储局域并行机群广域并行机群GFLOPS6CopyrightbyLiXinliang低价格可扩展自行搭建的简易机群7CopyrightbyLiXinliang并行机群:搭建简单——简单的局域网并行机群=局域网早期作者搭建的简易机群机群软件:Linux/Windows;套件OSCAR;MPICH.NT,……我国最早搭建的机群:LSEC张林波搭建的32节点机CopyrightbyLiXinliang8美洲虎/1700万亿次曙光5000A/160万亿次天河1号560万亿次CPU+GPU混合系统联想深腾7000/106万亿次单精度千万亿次的GPU系统Mole-xx顶级的超级计算机目标:每秒1摩尔次浮点运算(1mole=6.02*1023)CopyrightbyLiXinliang9排名SiteComputer计算机描述cores核心数实测速度/峰值速度(Tflops);耗电量(KW)1OakRidgeNationalLaboratoryUnitedStatesJaguar-CrayXT5-HEOpteronSixCore2.6GHz/2009CrayInc.2241621759/2331;6950.62DOE/NNSA/LANLUnitedStatesRoadrunner-BladeCenterQS22/LS21Cluster,PowerXCell8i3.2Ghz/OpteronDC1.8GHz,VoltaireInfiniband/2009;IBM1224001042/1375.78;2345.503NationalInstituteforComputationalSciences/UniversityofTennesseeUnitedStatesKrakenXT5-CrayXT5-HEOpteronSixCore2.6GHz/2009CrayInc.98928831.70/1028.85Top5超级计算机(2009-11)美洲虎半年间性能猛增69%的秘密在于处理器核心数量的暴涨:在配备AMD刚刚发布的六核心“伊斯坦布尔”Opteron24352.6GHz(单颗浮点性能10.4GFlops)后,美洲虎的核心数从129600个增至224162个(+73%),且每核心搭配2GB内存,每个完整的计算节点由12个处理核心和16GB共享内存组成,整套系统300TB内存、10PB(10000TB)硬盘。CopyrightbyLiXinliang10排名SiteComputer计算机描述cores核心数实测速度/峰值速度(万亿次);耗电量(千瓦)4ForschungszentrumJuelich(FZJ)GermanyJUGENE-BlueGene/PSolution/2009IBM294912825.50/1002.7;22685NationalSuperComputerCenterinTianjin/NUDTChinaTianhe-1-NUDTTH-1Cluster,XeonE5540/E5450,ATIRadeonHD48702,Infiniband/2009NUDT71680563.10/1206.19Top5超级计算机(2009-11)天河1号:我国最快的计算机;CPU+GPU的混合系统GPU计算——最先进的高性能计算2.并行程序设计工具1)共享存储式自动并行(并行编译器)IntelFortran/C编译器ifcaa.for-parallel编译目标:多线程程序OpenMP内存CPU编译指示符:!ompparallel……11CopyrightbyLiXinliang局域网络计算机Cluster系统2)分布存储式HPF(High-PerformanceFortran)基于数据并行,程序改动较小效率较低PVM(ParallelVirtualMachine)MPI(MessagePassingInterface)基于消息传递效率较高12CopyrightbyLiXinliangMPI的编译、运行环境1)并行计算机(力学所机群、深腾7000,曙光5000A)编译:mpif90/mpif77/mpiccf90/f77-I/usr/local/mpi/include-L/usr/local/mpi/lib-lm-lmpi运行:mpirun/bsub2)MPIforNT(Windows2000,XP)编译环境:VisualFortran/MSDevelopStudio设置:头文件路径、连接路径运行:mpirun二、MPI并行编程入门1.简介13CopyrightbyLiXinliangCopyrightbyLiXinliang14设置Windows下的MPI环境Step1:下载并安装mpich.nt.1.2.5安装包;Step2:更改VisualFortran的环境设置,添加MPICH的include及lib路径1)Tools-options-Build;在“showdirectoriesfor:”栏目选择“includefiles”;在“Directories:”下的对话框里面添加MPICHinclude的路径,例如“C:/Porgramfiles/mpich/SDK/include”(根据安装的具体位置而定)在“showdirectoriesfor:”的栏目选择“Libraryfiles”,在“Directories:”下的对话框里面添加MPICHLib的路径,例如“C:/Porgramfiles/mpich/SDK/lib”2)程序编译时,请把mpich.lib添加在链接库里。project-settings-link;在objcet/Librarymodules下的对话框里面添加mpich.lib(例如“kernel32.lib”变更为“kernel32.lib;mpich.lib”)Step3:编译程序,生成可执行文件CopyrightbyLiXinliang15Step4:利用mpirun运行程序。(该工具在Windows桌面的“开始-程序-mpich-mpd-MPIRun”)在“Application:”对话框里面选择刚编译生成的可执行文件。在“NumberofProcesses”对话框里面选择运行运行的进程数(即所谓“CPU个数”)。在“Advancedoptions”对话框里面选择“Alwayspromptforpassword”。MPIRun运行时会要求用户输入计算机的用户名和密码。点击“Run”即可运行(需要输入计算机的用户名和密码)。注意:•如果程序为f90程序,请修改mpif.h。将行首的注释符“C”替换为“!”,否则编译会出错。(mpif.h在安装路径的include目录下,通常在C:/Porgramfiles/mpich/SDK/include里面)•通常MPIRun需要以计算机管理员的身份运行,需要对计算机设置用户名和密码。如果计算机没有设置密码,则需要在控制面板中设置。•些防火墙及杀毒软件会阻止MPIRun的运行,如出现问题需要关闭这些防火墙及杀毒软件。服务器/前端机计算节点a.exea.exea.exeMPI程序的运行原理:服务器(前端机)编译可执行代码复制N份,每个节点运行一份调用MPI库函数得到每个节点号my_id根据my_id不同,程序执行情况不同调用MPI库函数进行通讯MPI编程的基本思想:主从式,对等式重要!16CopyrightbyLiXinliang重点:对等式程序设计CopyrightbyLiXinliang17计算节点a.exea.exea.exea.exe对等式设计“对等式”程序设计思想如果我是其中一个进程;我应当做……完成我需要完成的任务站在其中一个进程的角度思考一个简单的MPI程序hello.f90include‘mpif.h’integermyid,numprocs,ierrcallMPI_Init(ierr)callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)callMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)Print*,HelloWorld!myidis:,myid!添加自己的程序……!callMPI_Finalize(ierr)end18CopyrightbyLiXinliang运行结果:19CopyrightbyLiXinliang2.基本MPI函数(MPI子集)1)MPI初始化callMPI_Init(ierr)(out)Integer::ierr2)MPI结束callMPI_Finalize(ierr)(out)Integer::ierr20CopyrightbyLiXinliang(in):输入参数;(out):输出参数;整数,返回值非0表示出错3)得到当前进程标识•callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)•(In)Integer::MPI_COMM_WORLD为进程所在的通信域•(Out)Integer::myid,ierr4)得到通信域包含的进程数•CallMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)•(In)Integer::MPI_COMM_WORLD•(Out)Integer: