MPI并行编程
// 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
非阻塞消息接收
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
混合模式
主进程分发完任务后,参与计算 如计算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
组通信
一对一
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
MPI并行进程的实现
MPI并行程序设计平台由标准消息传递函数及相关辅助函数 构成,多个进程通过调用这些函数(类似调用子程序),进 行通信;
一个程序同时启动多份,形成多个独立的进程, 在不同的处理机上运行,拥有独立的内存空间, 进程间通信通过调用MPI函数来实现;每个进程 开始执行时,将获得一个唯一的序号(rank)。 例如启动P个进程,序号依次为0,1,…,P-1;
6.780 6.840 6.960
取时间平均值,则并行时间:1.437s 串行时间:6.860s 加速比为:6.860/1.437=4.77 效率为:4.77/4=1.19
加速比一般不会超过处理器个数,efund的并行加速比 大于处理器个数,不知什么原因
主程序的并行思路 可扩展的 先粗颗粒度,再细颗粒度
efund并行的结果分析
开始
读入参数 计算并生成fcfcpc.datset
matrix
计算并生成eplasm.dat
grid 结束
计算并生成econto.dat
采用对等模式进行MPI程序设计 计算 结束
开始
程序的运行时间 由耗时最长的进 程决定
在linux集群上用4个节点运行所需要的时间
谢
谢!
…
CPU
(b) DSM, 逻辑上单一地址空间
P/C
P/C
…
P/C
定制/标准网络
(c) Cluster, 物理/逻辑上多地址空间
什么是并行计算
进程 1
进程 2
传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于 该内存空间。
进程 1
进程 2
MPI已经成为一种标准,应用越来越广泛。而最流行的MPI工具集 当属mpich,是目前高效率的超大规模并行计算(1000个处理器) 最可信赖的平台。 目标: 是提供一个实际可用的、可移植的、高效的和灵活的消息传递 接口标准. MPI以语言独立的形式来定义这个接口库, 并提供了与C、 Fortran和Java语言的绑定. 这个定义不包含任何专用于某个特别的 制造商、操作系统或硬件的特性. 由于这个原因, MPI在并行计算界 被广泛地接受.
发送信息
接收信息
并行计算将进程相对独立的 分配于不同的节点上,由 各自独立的操作系统调度, 享有独立的CPU和内存资源 (内存可以共享);进程间 相互信息交换通过消息传递;
MPI模型 MPI(Message Passing Interface)
在当前所有的消息传递软件中, 最重要最流行的是MPI, 它能运行 在所有的并行平台上, 包括SMP和PVP. 二者已经在Windows NT 和 Windows 9X这样的非Unix平台上实现. 程序设计语言支持C, Fortran和Java.在国产的三大并行机系列神威、银河和曙光上都实 现了对MPI和支持.
计算 fcfcpc.dat rfcoil.dat eplasm.dat econto.dat 运行时间 0.230 1.240 运行时间 0.210 1.190 1.380 0.390 运行时间 0.230 1.240 1.520 0.350 时间单位:秒
线程 0 1 2 3
1.410
0.370
串行程序的时间
MPI并行编程简介
主/从式
主进程将任务分发到从进程分别计算,再收集 计算结果,比如计算1+…+100,可以分成两部 份。进从程计算1+..+50和51+..+100,主进程收 集结果再相加
对等式
每个进程相对独立计算各自的任务 比如要计算1+…+100和1*…*100,可以由两个 进程独立计算
进程0 进程1
从进程1接收消息A
从进程0接收消息B
向进程1发送消息B
向进程1发送消息A
产生死锁的通信调用
1
例子
1 dx arctan( x) |1 arctan( 1) arctan( 0) arctan( 1) / 4 0 0 1 x 2
令:
f ( x)
4 (1 x 2 )
则有:
1
0
f ( x)dx
4
f ( x)
4 (1 x 2 )
0
N
1
2 i 1 1 1 N i 0.5 f( ) f ( ) 2 N N N i 1 N i 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进程汇总数据
消息接收 MPI_Recv(buf,count,datatype,source,tag,comm,status) In count,datatype,source,tag,comm Out buf,status(返回状态)
MPI类型匹配:数据类型要一致
数据接收缓冲区
数据发送缓冲区
通信域包含的进程数
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 9 1011 4 2 8
引用接收数据
非阻塞消息发送与接收
非阻塞消息发送
MPI_ISend(buf,count,datatype,dest,tag,comm,request,ierr) In buf,count,datatype,dest,tag,comm Out request,ierr Request(返回的非阻塞通信对象)
MPI并行编程
报告人:李俊照
内容
1、MPI并行编程简介
2、efund并行的结果分析
3、主程序的并行思路
几种我们常见的并行计算机
CPU CPU
…
CPU
LM
虚拟分布共享存储(DSM) LM LM
总线或交叉开关 定制网络 SM
CPU (a) SMP, 物理上单一地址空间
LM LM LM
CPU
0
1
0 3 4 5 1 3 4 5 2
2
MPI消息
MPI消息包括信封和数据两部份 信封:<源/目,标识,通信域> 数据:<起始地址,数据个数,数据类型> MPI_Send(buf,count,datatype,dest,tag,comm)