1 / 32

MPI 并行编程   

MPI 并行编程   . 报告人:李俊照. 内容. 1、 MPI 并行编程简介 2、 efund 并行的结果分析 3、主程序的并行思路. 虚拟分布共享存储( DSM). …. CPU. CPU. CPU. 定制网络. 总线或交叉开关. …. CPU. CPU. CPU. SM. …. P/C. P/C. P/C. ( a) SMP, 物理上单一地址空间. 定制/标准网络. ( b) DSM, 逻辑上单一地址空间. LM. LM. LM. LM. LM. LM.

gotzon
Download Presentation

MPI 并行编程   

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MPI并行编程    报告人:李俊照

  2. 内容 • 1、MPI并行编程简介 • 2、efund并行的结果分析 • 3、主程序的并行思路

  3. 虚拟分布共享存储(DSM) … CPU CPU CPU 定制网络 总线或交叉开关 … CPU CPU CPU SM … P/C P/C P/C (a) SMP, 物理上单一地址空间 定制/标准网络 (b) DSM, 逻辑上单一地址空间 LM LM LM LM LM LM (c) Cluster, 物理/逻辑上多地址空间 几种我们常见的并行计算机

  4. 进程 2 接收信息 进程 1 发送信息 什么是并行计算 进程 1 进程 2 传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于 该内存空间。 并行计算将进程相对独立的 分配于不同的节点上,由 各自独立的操作系统调度, 享有独立的CPU和内存资源 (内存可以共享);进程间 相互信息交换通过消息传递;

  5. MPI模型 MPI(Message Passing Interface) 在当前所有的消息传递软件中, 最重要最流行的是MPI, 它能运行在所有的并行平台上, 包括SMP和PVP. 二者已经在Windows NT 和Windows 9X这样的非Unix平台上实现. 程序设计语言支持C, Fortran和Java.在国产的三大并行机系列神威、银河和曙光上都实现了对MPI和支持. MPI已经成为一种标准,应用越来越广泛。而最流行的MPI工具集当属mpich,是目前高效率的超大规模并行计算(1000个处理器)最可信赖的平台。 目标: 是提供一个实际可用的、可移植的、高效的和灵活的消息传递 接口标准. MPI以语言独立的形式来定义这个接口库, 并提供了与C、 Fortran和Java语言的绑定. 这个定义不包含任何专用于某个特别的 制造商、操作系统或硬件的特性. 由于这个原因, MPI在并行计算界 被广泛地接受.

  6. MPI并行进程的实现 MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信; 一个程序同时启动多份,形成多个独立的进程, 在不同的处理机上运行,拥有独立的内存空间, 进程间通信通过调用MPI函数来实现;每个进程 开始执行时,将获得一个唯一的序号(rank)。 例如启动P个进程,序号依次为0,1,…,P-1;

  7. 消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关, 任何支持进程间通信的并行机,均可支持消息传递并行程序设计;几乎 有共享和分布存储并行计算环境均支持进程间的消息传递通信; 进程 1 传递信息 进程 3 传递信息 进程 2 传递信息 进程 0 传递信息 进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将 该数加1,再传递给进程3;依次类推,最后,进程N-1将该数传递给进程0, 由进程1负责广播该数给所有进程,并打印输出。

  8. MPI并行编程简介 • 主/从式 • 主进程将任务分发到从进程分别计算,再收集计算结果,比如计算1+…+100,可以分成两部份。进从程计算1+..+50和51+..+100,主进程收集结果再相加

  9. 对等式 • 每个进程相对独立计算各自的任务 • 比如要计算1+…+100和1*…*100,可以由两个进程独立计算

  10. 混合模式 • 主进程分发完任务后,参与计算 • 如计算1+..+100,主进程可以自己计算1..33,分发任务34..66和67..100到两个从进程。可以提高效率

  11. 一个简单的MPI程序 • include  'mpif.h‘ • integer  myid,numprocs,ierr,rc • call MPI_Init(ierr) • call MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) • call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) • //添加需要并行的程序 • Write(*,*) "Hello World! process is :",myid • // • call MPI_Finalize(rc)

  12. 运行的结果

  13. MPI初始化 • call MPI_Init(ierr) • Integer ierr  • MPI结束 • call MPI_Finalize(ierr) • Integer ierr

  14. 当前进程标识 • call MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) • In MPI_COMM_WORLD 为进程所在的通信域 • Out Integer myid,ierr • 通信域包含的进程数 • Call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) • In MPI_COMM_WORLD • Out Integer numprocs,ierr

  15. 通信域 • 一个通信域是一个进程组加上一个现场,进程组是所有参加通信的进程的集合,如果一共有N个进程参加通信,则进程编号从0到N-1;现场提供一个相对独立的通信区域 6 1 3 7 0 5 11 9 4 10 2 8 0 1 1 5 3 0 5 3 4 4 2 2

  16. MPI消息 • MPI消息包括信封和数据两部份 • 信封:<源/目,标识,通信域> • 数据:<起始地址,数据个数,数据类型> • MPI_Send(buf,count,datatype,dest,tag,comm) • 消息数据     消息信封 • In buf,count,datatype,dest,tag,comm

  17. 消息接收 • MPI_Recv(buf,count,datatype,source,tag,comm,status) • In count,datatype,source,tag,comm • Out buf,status(返回状态) • MPI类型匹配:数据类型要一致  数据发送缓冲区 数据接收缓冲区 消息装配 消息拆卸 消息传递

  18. 阻塞发送 阻塞接收 • 阻塞通信与非阻塞通信   开始 开始 消息成功发出 消息成功接收 结束 结束 缓冲区数据可使用 缓冲区可释放 • 阻塞消息发送与接收

  19. 非阻塞发送 非阻塞接收 启动发送 启动接收 发 送 消 息 接 收 消 息 立即返回 立即返回 计算 与 通信 重叠 计 算 计 算 通信完成 通信完成 释放发送缓冲区 引用接收数据 非阻塞消息发送与接收

  20. 非阻塞消息发送 • MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr) • In buf,count,datatype,dest,tag,comm • Out request,ierr • Request(返回的非阻塞通信对象) • 非阻塞消息接收 • MPI_IRecv(buf,count,datatype,source,tag,comm,request,ierr) • In buf,count,datatype,source,tag,comm • Out request,ierr • 非阻塞通信的完成 • MPI_Wait(request,status) • In request • Out status

  21. MPI_Send MPI_Recv MPI_ISend MPI_IRecv • 组通信 • 一对一 一对多 广播 MPI_Bcast 收集 MPI_Gather 多对一 多对多

  22. 编写安全的通信 If (rank.eq.0) then Call MPI_Recv(recvbuf,count,real,1,tag,comm,status,ierr) Call MPI_Rend(sendbuf,count,real,1,tag,comm,ierr) Else if (rank.eq.1) Call MPI_Recv(recvbuf,count,real,0,tag,comm,status,ierr) Call MPI_Rend(sendbuf,count,real,0,tag,comm,ierr) Endif • 进程0 • 进程1 • 从进程1接收消息A • 从进程0接收消息B • 向进程1发送消息B • 向进程1发送消息A • 产生死锁的通信调用

  23. 例子 令: 则有:

  24. 4 0 1

  25. Myid:本身进程号 • Numprocs:总的进程数 • For(I=myid+1;I<=n;I+=numprocs) • /*每一个进程计算一部份矩形的面积,若进程总数为4, • 将0-1区间为100个矩形 • 0进程:1,5,9,13,…,97 • 1进程:2,6,10,14,…,98 • 2进程:3,7,11,15,…,99 • 3进程:4,8,12,16,…,100 • */ • 然后0进程汇总数据

  26. efund并行的结果分析 开始 读入参数 getset 计算并生成fcfcpc.dat 计算并生成rfcoil.dat matrix 计算并生成eplasm.dat grid 计算并生成econto.dat 结束

  27. 结束 开始 计算 • 采用对等模式进行MPI程序设计 程序的运行时间由耗时最长的进程决定

  28. 线程 计算 运行时间 运行时间 运行时间 • 在linux集群上用4个节点运行所需要的时间 fcfcpc.dat 0.230 0.210 0.230  0 rfcoil.dat 1.240 1.190 1.240  1 1.410 eplasm.dat 1.380 1.520  2 econto.dat 0.370 0.390 0.350  3 串行程序的时间 时间单位:秒 6.780 6.840 6.960

  29. 取时间平均值,则并行时间:1.437s 串行时间:6.860s 加速比为:6.860/1.437=4.77 效率为:4.77/4=1.19 加速比一般不会超过处理器个数,efund的并行加速比 大于处理器个数,不知什么原因

  30. 主程序的并行思路 • 可扩展的 • 先粗颗粒度,再细颗粒度

  31.  谢 谢!

More Related