320 likes | 542 Views
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.
E N D
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 (c) Cluster, 物理/逻辑上多地址空间 几种我们常见的并行计算机
进程 2 接收信息 进程 1 发送信息 什么是并行计算 进程 1 进程 2 传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于 该内存空间。 并行计算将进程相对独立的 分配于不同的节点上,由 各自独立的操作系统调度, 享有独立的CPU和内存资源 (内存可以共享);进程间 相互信息交换通过消息传递;
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在并行计算界 被广泛地接受.
MPI并行进程的实现 MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信; 一个程序同时启动多份,形成多个独立的进程, 在不同的处理机上运行,拥有独立的内存空间, 进程间通信通过调用MPI函数来实现;每个进程 开始执行时,将获得一个唯一的序号(rank)。 例如启动P个进程,序号依次为0,1,…,P-1;
消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关, 任何支持进程间通信的并行机,均可支持消息传递并行程序设计;几乎 有共享和分布存储并行计算环境均支持进程间的消息传递通信; 进程 1 传递信息 进程 3 传递信息 进程 2 传递信息 进程 0 传递信息 进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将 该数加1,再传递给进程3;依次类推,最后,进程N-1将该数传递给进程0, 由进程1负责广播该数给所有进程,并打印输出。
MPI并行编程简介 • 主/从式 • 主进程将任务分发到从进程分别计算,再收集计算结果,比如计算1+…+100,可以分成两部份。进从程计算1+..+50和51+..+100,主进程收集结果再相加
对等式 • 每个进程相对独立计算各自的任务 • 比如要计算1+…+100和1*…*100,可以由两个进程独立计算
混合模式 • 主进程分发完任务后,参与计算 • 如计算1+..+100,主进程可以自己计算1..33,分发任务34..66和67..100到两个从进程。可以提高效率
一个简单的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)
MPI初始化 • call MPI_Init(ierr) • Integer ierr • MPI结束 • call MPI_Finalize(ierr) • Integer ierr
当前进程标识 • 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
通信域 • 一个通信域是一个进程组加上一个现场,进程组是所有参加通信的进程的集合,如果一共有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
MPI消息 • MPI消息包括信封和数据两部份 • 信封:<源/目,标识,通信域> • 数据:<起始地址,数据个数,数据类型> • MPI_Send(buf,count,datatype,dest,tag,comm) • 消息数据 消息信封 • In buf,count,datatype,dest,tag,comm
消息接收 • MPI_Recv(buf,count,datatype,source,tag,comm,status) • In count,datatype,source,tag,comm • Out buf,status(返回状态) • MPI类型匹配:数据类型要一致 数据发送缓冲区 数据接收缓冲区 消息装配 消息拆卸 消息传递
阻塞发送 阻塞接收 • 阻塞通信与非阻塞通信 开始 开始 消息成功发出 消息成功接收 结束 结束 缓冲区数据可使用 缓冲区可释放 • 阻塞消息发送与接收
非阻塞发送 非阻塞接收 启动发送 启动接收 发 送 消 息 接 收 消 息 立即返回 立即返回 计算 与 通信 重叠 计 算 计 算 通信完成 通信完成 释放发送缓冲区 引用接收数据 非阻塞消息发送与接收
非阻塞消息发送 • 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
MPI_Send MPI_Recv MPI_ISend MPI_IRecv • 组通信 • 一对一 一对多 广播 MPI_Bcast 收集 MPI_Gather 多对一 多对多
编写安全的通信 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 • 产生死锁的通信调用
例子 令: 则有:
4 0 1
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进程汇总数据
efund并行的结果分析 开始 读入参数 getset 计算并生成fcfcpc.dat 计算并生成rfcoil.dat matrix 计算并生成eplasm.dat grid 计算并生成econto.dat 结束
结束 开始 计算 • 采用对等模式进行MPI程序设计 程序的运行时间由耗时最长的进程决定
线程 计算 运行时间 运行时间 运行时间 • 在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
取时间平均值,则并行时间:1.437s 串行时间:6.860s 加速比为:6.860/1.437=4.77 效率为:4.77/4=1.19 加速比一般不会超过处理器个数,efund的并行加速比 大于处理器个数,不知什么原因
主程序的并行思路 • 可扩展的 • 先粗颗粒度,再细颗粒度