




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算流体力学讲义第五讲MPI并行程序设计 1 李新亮lixl 力学所主楼219 82543801 知识点 MPI程序的运行机制 拷贝N份 给每个进程一份MPI的基本库函数 6个库函数 对等式 编程方法 站在单个进程的角度思考 1 讲义 课件上传至 流体中文网 流体论坛 CFD基础理论 CopyrightbyLiXinliang CopyrightbyLiXinliang 2 Part1 基本概念及MPI并行编程入门 并行计算基本概念MPI并行编程入门1 MPI简介2 MPI的基本函数及消息传递3 MPI的常用函数4 对等式编程思想的举例说明 全收集 矩阵相乘 一 基本概念 并行计算机简介大规模并行计算 超级计算 Supercomputing 高性能计算 HPC 为何需要超级计算 应用领域的巨大计算需求单CPU的计算能力有限 应用对计算资源的需求 3 CopyrightbyLiXinliang CFD的计算资源依赖性计算量大 流动的多尺度性 湍流 大飞机全部流动细节完全分辨 最小尺度 mm mm量级 计算网格 1012 1016 需计算量 1020 30 工程需求 8个小时之内完成计算预计 LES 2045年 DNS 2080年 最大尺度 m mm 几种我们常见的并行计算机 并行计算机体系结构 5 CopyrightbyLiXinliang 内存带宽瓶颈 访存冲突机制控制复杂 虚拟共享存储 NUMA 访存冲突机制控制复杂 克服了访存冲突及内存瓶颈 访存的局部性 对网络要求不严 6 CopyrightbyLiXinliang 低价格可扩展 自行搭建的简易机群 7 CopyrightbyLiXinliang 并行机群 搭建简单 简单的局域网 并行机群 局域网 早期作者搭建的简易机群 机群软件 Linux Windows 套件OSCAR MPICH NT 我国最早搭建的机群 LSEC张林波搭建的32节点机 CopyrightbyLiXinliang 8 美洲虎 1700万亿次 曙光5000A 160万亿次 天河1号560万亿次CPU GPU混合系统 联想深腾7000 106万亿次 单精度千万亿次的GPU系统Mole xx 顶级的超级计算机 目标 每秒1摩尔次浮点运算 1mole 6 02 1023 CopyrightbyLiXinliang 9 Top5超级计算机 2009 11 美洲虎半年间性能猛增69 的秘密在于处理器核心数量的暴涨 在配备AMD刚刚发布的六核心 伊斯坦布尔 Opteron24352 6GHz 单颗浮点性能10 4GFlops 后 美洲虎的核心数从129600个增至224162个 73 且每核心搭配2GB内存 每个完整的计算节点由12个处理核心和16GB共享内存组成 整套系统300TB内存 10PB 10000TB 硬盘 CopyrightbyLiXinliang 10 Top5超级计算机 2009 11 天河1号 我国最快的计算机 CPU GPU的混合系统 GPU计算 最先进的高性能计算 2 并行程序设计工具 1 共享存储式自动并行 并行编译器 IntelFortran C编译器ifcaa for parallel编译目标 多线程程序OpenMP 编译指示符 ompparallel 11 CopyrightbyLiXinliang Cluster系统 2 分布存储式HPF High PerformanceFortran 基于数据并行 程序改动较小效率较低PVM ParallelVirtualMachine MPI MessagePassingInterface 基于消息传递效率较高 12 CopyrightbyLiXinliang MPI的编译 运行环境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 简介 13 CopyrightbyLiXinliang CopyrightbyLiXinliang 14 设置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 编译程序 生成可执行文件 CopyrightbyLiXinliang 15 Step4 利用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的运行 如出现问题需要关闭这些防火墙及杀毒软件 MPI程序的运行原理 服务器 前端机 编译可执行代码复制N份 每个节点运行一份调用MPI库函数得到每个节点号my id根据my id不同 程序执行情况不同调用MPI库函数进行通讯 MPI编程的基本思想 主从式 对等式 重要 16 CopyrightbyLiXinliang 重点 对等式程序设计 CopyrightbyLiXinliang 17 a 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 end 18 CopyrightbyLiXinliang 运行结果 19 CopyrightbyLiXinliang 基本MPI函数 MPI子集 1 MPI初始化callMPI Init ierr out Integer ierr2 MPI结束callMPI Finalize ierr out Integer ierr 20 CopyrightbyLiXinliang 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 numprocs ierr 21 CopyrightbyLiXinliang 进程的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 CopyrightbyLiXinliang 把全班分成几个组 执行任务更方便 班名 包含全班同学MPI预定义 my id 学号 组的名字 编号 组内编号 MPI消息传递函数消息发送MPI Send buf count datatype dest tag comm ierr MPI消息 数据描述 信封数据描述 起始地址 数据个数 数据类型 信封 源 目 标签 通信域 23 CopyrightbyLiXinliang buf 数据起始地址 Fortran 变量名 C 变量地址 指针 count 数据数目 以datatype为单位 必须连续 MPI Send buf count datatype dest tag comm ierr 24 CopyrightbyLiXinliang Datatype 数据类型MPI INTEGER MPI REAL MPI DOUBLE PRECISION MPI COMPLEX MPI LOGICAL MPI CHARACTER MPI BYTE MPI PACKED Real 8x 10 给x赋值 CallMPI send x 1 10 MPI double precision 数据的首地址 不是变量的值 10个数据 不是10个字节 Fortran 按地址传送 x 1 或xC 按值传送 x 0 或x dest 发送目标的ID integer Tag 消息标签 integer Comm 通信域 integer 例 MPI COMM WORLDierr 整数 如果成功返回0例 realA if my id eq 0 CallMPI Send A 1 MPI REAL 1 27 MPI COMM WORLD ierr 标签tag的作用 区别不同的消息 MPI Send buf count datatype dest tag comm ierr 25 CopyrightbyLiXinliang 标签 举例 0号同学向1号同学发出3封信 内容分别为3科考试成绩 为了防止弄混 必须用约定的数做标签 目的ID 消息接收MPI Recv buf count datatype source tag comm status ierr 参数 数据起始地址 数据 类型 源地址 标签 通信域 返回状态integerstatus MPI STATUS SIZE MPI接收匹配 数据类型 源地址 标签要一致 否则不接收 26 CopyrightbyLiXinliang 返回状态和调试信息 MPI Recv buf count datatype source tag comm status ierr 源地址 标签 27 CopyrightbyLiXinliang integerstatus 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 接收 发送变量A 接收到变量B 配合使用 发 收两步机制 避免直接读写对方内存 保证安全性 sumfrom1to100 Runonlyfornp 2 include mpif h integermyid sum local sum local1 sum global ierr status MPI STATUS SIZE callMPI Init ierr callMPI Comm Rank MPI COMM WORLD myid ierr sum local 0doi myid 1 100 2sum local sum local ienddoprint myid myid sum local sum localif myid eq 1 callMPI SEND sum local 1 MPI INTEGER 0 99 MPI COMM WORLD ierr if myid eq 0 thencallMPI RECV sum local1 1 MPI INTEGER 1 99 MPI COMM WORLD status ierr sum global sum local sum local1print sum global sum globalendifcallMPI Finalize ierr end 例 计算1 2 3 100 采用2个CPU并行 CPU0 1 3 5 7 99CPU1 2 4 6 8 100 对等式 编程思路 站在每个进程的角度思考 29 CopyrightbyLiXinliang 结果显示 30 CopyrightbyLiXinliang 消息传递时要注意防止死锁 缓冲区 信箱 MPI Send MPI Recv MPI Send MPI Recv属于阻塞式发送 接收发送成功接收成功 发送和接收是两个独立过程 子程序返回 Send与Recv一定要配合好 发送到 信箱 即为成功 31 CopyrightbyLiXinliang 重要 发生死锁的情况 只发送 不接收 只接收 不发送 32 CopyrightbyLiXinliang 例 任务 进程0发送变量A给进程1进程1发送变量B给进程0 if myid eq 0 thencallMPI send A 1 MPI real 1 99 MPI Comm World ierr callMPI recv B 1 MPI real 1 99 MPI Comm World ierr Elseif myid eq 1 thencallMPI recv A 1 MPI real 0 99 MPI Comm World ierr callMPI send B 1 MPI real 0 99 MPI Comm World ierr endif Step1 Step2 Step1 Step2 不会死锁 33 CopyrightbyLiXinliang 死锁的例子 if myid eq 0 thencallMPI recv B 1 MPI real 1 99 MPI Comm World ierr callMPI send A 1 MPI real 1 99 MPI Comm World ierr Elseif myid eq 1 thencallMPI recv A 1 MPI real 0 99 MPI Comm World ierr callMPI send B 1 MPI real 0 99 MPI Comm World ierr endif Step1 Step1 Step2 不会死锁 Step2 34 CopyrightbyLiXinliang 有可能死锁的例子 if myid eq 0 thencallMPI send A 1 MPI real 1 99 MPI Comm World ierr callMPI recv B 1 MPI real 1 99 MPI Comm World ierr Elseif myid eq 1 thencallMPI send B 1 MPI real 0 99 MPI Comm World ierr callMPI recv A 1 MPI real 0 99 MPI Comm World ierr endif Step2 Step2 Step1 35 CopyrightbyLiXinliang 使用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 次序由系统决定 36 CopyrightbyLiXinliang 基本的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 source tag comm status ierr MPI只能点到点通信 其他函数是用这6个函数开发的 使用这6个函数 可以实现MPI的全部功能 CopyrightbyLiXinliang 38 系统时间 墙钟 函数 MPI Wtime real 8 timetime MPI Wtime 返回当前墙钟时间 单位 秒 Walltime与CPUtime不同 Walltime更可靠 CPU分时为所有进程服务 Real 8 Time begin Time end 初始化 Time begin MPI Wtime 计算任务 CallMPI Barrier comm ierr Time end MPI Wtime Print 计算时间为 Time end Time begin 可用来测量程序的执行速度测量加速比及并行效率 加速比 N个进程的执行速度 单个进程的执行速度 并行效率 加速比 N 作者的Hoam OpenCFD软件加速比测试 CPUCorenumber1024 16384 并行效率89 6 通常要进行同步 然后测量时间 否则各进程报出的时间不同 3 常用的MPI函数 1 广播MPI Bcast buff count datatype root comm ierr 参数 数据缓冲区 数目 数据类型 根进程 通讯域例 realAif myid eq 0 thenopen 55 file data dat read 55 Aclose 55 endifcallMPI Bcast A 1 MPI REAL 0 MPI COMM WORLD ierr 广播 树状传播 效率较高 39 广播的逻辑图 广播的实际实现方式 树状传播 MPI的消息 只能点到点传递 不能真正 广播 2 规约 求和 求最大值 求最小值 MPI Reduce sendbuf recvbuf count datatype op root comm ierr 发送缓冲区 接收缓冲区 数目 数据类型 规约操作 通讯域 sumfrom1to100 Runonlyfornp 2 include mpif h integermyid sum local sum global ierrcallMPI Init ierr callMPI Comm Rank MPI COMM WORLD myid ierr sum local 0doi myid 1 100 2sum local sum local ienddocallMPI Reduce sum local sum global 1 MPI INTEGER MPI SUM 0 MPI COMM WORLD ierr print sum global sum globalcallMPI Finalize ierr end 40 CopyrightbyLiXinliang 预定义的规约操作 MPI MAX最大值MPI LXOR逻辑异或MPI MIN最小值MPI BXOR按位异或MPI SUM求和MPI MAXLOC最大值及位置MPI PROD求积MPI MINLOC最小值及位置MPI LAND逻辑与MPI BAKD按位与MPI LOR逻辑或MPI BOR安位或 41 CopyrightbyLiXinliang 同步MPI Barrier comm ierr Comm 通讯域 ierr 返回值 等待所有进程都调用MPI Barrier 函数才能返回 CallMPI barrier MPI COMM WORLD ierr 42 CopyrightbyLiXinliang CopyrightbyLiXinliang 43 4 对等式 编程示例 例1 全收集的实现MPI Allgather 题目 N个进程 每个进程有一个数A 把所有进程的数收集起来 按进程号的次序形成数组A0 1 N 存放到所有进程中 把每个同学的电话号码收集起来 形成通讯录 发给全班同学 也可以是数组 各进程的数A可以不同 A0 1 A0 2 A0 3 A0 4 方式1 根进程收集所有数据 根进程发送到所有进程if myid eq 0 thenA0 0 Adoid 1 Nproc 1callMPI Recv A0 id 1 MPI Real id 99 MPI Comm World status ierr enddoelsecallMPI Send A 1 MPI Real 0 endifif myid eq 0 thendoid 1 Nproc 1callMPI Send A0 Nproc MPI Real id enddoelsecallMPI Recv A0 Nproc MPI Real 0 endif 44 CopyrightbyLiXinliang 班长 依次与所有同学通信 收集信息 收集后依次通信 发放信息 负载不均衡效率最低可能会死锁 方式2 根进程收集所有数据 根进程广播到所有进程if myid eq 0 thenA0 0 Adoid 1 Nproc 1callMPI Recv A0 id 1 MPI Real id 99 MPI Comm World status ierr enddoelsecallMPI Send A 1 MPI Real 0 endifcallMPI Bcast A0 Nproc MPI Real 0 MPI Comm world ierr 效率高于 1 是MPI Allgather 的原有的标准方式 45 CopyrightbyLiXinliang 广播的实现方式 班长 依次收集信息后 广播 给全班 CopyrightbyLiXinliang 46 1A sendtoID0 0123N 1 1B 0123N 1 Step1 我 my id进程 向my id 1进程发数据 我 收my id 1进程发来的数据 该步完成后 我 my id进程 得到了my id 1的数据 全收集的实现图解 方式3 循环通信 CopyrightbyLiXinliang 47 2A sendtoID1 0123N 1 2B 0123N 1 Step2 我 向my id 2进程发数据 我 收my id 2进程发来的数据 该步完成后 我 得到了my id 1 my id 2进程的数据 Step3 我向my id 3发数据 我收my id 3发来的数据 StepN 1完成后 我得到了全部数据 全体进程也得到了全部数据 对等式编程思想 每个人做好自己的工作 全部工作就做好了 不设班长 所有人工作量相同 循环通讯 由张林波研究员首次提出dostep 1 Nproc 1id send mod myid step Nproc id recv mod myid step Nproc callMPI Send A 1 MPI Real id send 99 MPI Comm World ierr callMPI Recv A0 id recv 1 MPI Real id recv 99 MPI Comm World status ierr enddo效率高于 1 2 是MPI Allgather 的现有的标准方式 48 CopyrightbyLiXinliang 计算矩阵A B C A B C N N矩阵采用P个进程计算 N能被P整除 存储方式 分布存储 A C按行分割 B按列分割 矩阵ABC 49 CopyrightbyLiXinliang 例2 计算矩阵乘积 对等式 程序设计思想 站在每个进程角度思考 我 的数据 dimensionA1 N P N B1 N N P C1 N P N 我 的任务 计算C1 0 K P 1 A C B A1 B1 C1 50 CopyrightbyLiXinliang 需要得到整个矩阵B 自己只有Bk 向他人索取doid 0 P 1callMPI Recv B tmp N N P MPI REAL id 计算出C1 id C1 id A1 B tmp enddo只索取数据 何人提供 命令 他人提供数据 不符合 对等式 程序设计思想 0 K P 1 A C B 如何完成任务 B tmp N N P P C1 0 C1 1 C1 51 CopyrightbyLiXinliang B 顺次发送数据dostep 0 P 1if myid eq step thendoid 0 P 1callMPI Send B1 N N P MPI REAL id enddoendifcallMPI Recv B tmp N N P MPI REAL step 计算出C1 id C1 id
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 慰问慈善活动发言稿
- 旧房拆除新建施工方案
- 大学的期末总结
- 基坑土方破碎施工方案
- 节电装置安装施工方案
- 管道抱卡施工方案
- 河南省全省防汛应急预案
- 防腐施工方案
- pe水管现场施工方案
- 2025年中国油性外墙稀释剂数据监测研究报告
- 2024年国家电投集团黄河公司招聘笔试参考题库含答案解析
- 航海英语会话(一)
- 道路工程安全技术交底
- 高三数学备课组高考数学经验总结
- 鼎捷T100-V1.0-票据资金用户手册-简体
- 城乡规划管理与法规系列讲座城乡规划的监督检查
- 第一单元知识盘点(含字词、佳句、感知、考点) 四年级语文上册 (部编版有答案)
- 钻井工程钻柱课件
- 小学硬笔书法课教案(1-30节)
- 周口市医疗保障门诊特定药品保险申请表
- 校园物业考评表
评论
0/150
提交评论