并行计算与MPI复习资料.docx
- 文档编号:23916791
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:26
- 大小:1.18MB
并行计算与MPI复习资料.docx
《并行计算与MPI复习资料.docx》由会员分享,可在线阅读,更多相关《并行计算与MPI复习资料.docx(26页珍藏版)》请在冰豆网上搜索。
并行计算与MPI复习资料
并行计算与MPI
1.并行计算:
并行机上所作的计算,又称高性能计算或超级计算。
在并行机上,将一个应用分解成多个子任务,分配给不同的处理器,各个处理器之间相互协同,并行地执行子任务,从而达到加速求解速度,或者求解应用问题规模的目的。
空间换时间。
并行度是指指令并行执行的最大条数。
2.需求类型:
计算密集、数据密集、网络密集。
3.并行计算必须具备的条件:
并行机,并行算法(应用问题必须具有并行度),并行编程
4.比较流行的并行编程环境:
消息传递,共享存储,数据并行;共享存储并行编程基于线程级细粒度并行,仅被SMP和DSM并行机所支持,可移植性不如消息传递并行编程;消息传递并行编程基于大粒度的进程级并行,具有最好的可移植性,几乎被当前流行的各类并行机所支持,且具有很好的可扩展性。
消息传递并行编程环境MPI
通常意义下所说的MPI系统就是指所有这些具有标准接口说明的消息传递函数所构成的函数库。
一个MPI系统通常由一组库、头文件和相应的运行、调试环境构成。
MPI并行程序通过调用MPI库中的函数来完成消息传递,编译时与MPI库链接。
而MPI系统提供的运行环境则负责一个MPI并行程序的启动与退出,并提供适当的并行程序调试、跟踪方面的支持。
MPI(MessagePassingInterface)是由全世界工业、科研和政府部门联合建立的一个消息传递编程标准,其目的是为基于消息传递的并行程序设计提供一个高效、可扩展、统一的编程环境。
它是目前最为通用的并行编程方式,也是分布式并行系统的主要编程环境。
MPI标准中定义了一组函数接口用于进程间的消息传递。
5.将一个应用分解为多个子任务的过程,称为并行算法的设计
6.并行计算的研究目标:
加速求解问题的速度,提高求解问题的规模。
7.并行计算的研究内容:
并行机的高性能特征抽取,并行算法设计与分析,并行实现技术,并行应用。
基于并行机提供的并行编程环境,例如消息传递平台MPI或者共享存储平台OpenMP
共享存储对称多处理机(SMP)系统
大规模并行机(MPP)系统
8.组成并行机的三个要素:
节点(每个结点由多个处理器构成,可以直接入输出(I/O)),
互联网络(所有结点通过互联网络相互连接相互通信),
内存(内存模块与结点分离或者内存模块位于结点内部),
9.评价一个互联网络的基本准则应该为:
固定并行机包含的结点个数,如果点对点带宽越高、折半宽度越大、或者网络直径越小、点对点延迟越小,则互联网络质量可以说越高。
10.根据内存访问的性质,并行机的访存模型可以分为:
(1)均匀访存模型(UMA:
UniformMemoryAccessmodel)
(2)非均匀访存模型(NUMA:
Non-UniformMemoryAccessmodel)
(3)分布式访存模型(DMA:
DistributedMemoryAccessmodel)
(4)混合访存模型(HMA:
HybridMemoryAccessmodel)
10.按内存访问模型、微处理器和互联网络的不同,当前流行的并行机可以分为:
(1)对称多处理共享存储并行机(SMP:
SymmetricMulti-Processing)
(2)分布共享存储并行机(DSM:
DistributedSharedMemory)
(3)集群机(cluster)结点内部共享存储,结点间分布存储,
(4)星群(constellation)
(5)大规模并行机(MPP:
MassivelyParallelProcessing)
(6)混合型并行机(HPP:
HybridParallelProcessing)
11.Flynn:
SISD,SIMD,MISD,MIMD。
12.如果按经典的指令与数据流进行分类,则并行机可以分为三类:
单指令多数据流(SIMD),多指令多数据流(MIMD),多指令单数据流(MISD)
13.UNIX操作系统几乎是当前所有高性能并行机(SMP、DSM、cluster、constellation、MPP)采用的标准操作系统
14.并行编程环境:
消息传递、共享存储和数据并行
15.进程具有两个明显的特征:
资源特征,执行特征(线程或者轻量级进程)。
进程的资源特征反映了进程是资源拥有的最小单元,而执行特征反映了进程是操作系统调度的基本单元。
16.任何进程,在执行过程中,均涉及如下几种状态:
(1)非存在状态:
进程依赖的程序还没有投入运行;
(2)就绪状态:
进程由其父进程(例如,操作系统的内核进程或Shell进程,或其他应用程序进程)调入并准备运行;
(3)运行状态:
进程占有CPU和其他必需的计算资源,并执行指令;
(4)挂起状态:
由于CPU或其他必需的计算资源被其他进程占有,或必需等待某类事件的发生,进程转入挂起状态,以后一旦条件满足,由操作系统唤醒并转入就绪状态;
(5)退出状态:
进程正常结束或因异常退出而被废弃。
进程可由单个线程来执行,即通常所说的串行执行;同时,进程也可由多个线程来并行执行。
称两个进程之间传递的数据为消息,称这种操作为消息传递。
显然,消息传递可以在同一台处理机的多个进程之间发生,也可以在不同处理机的多个进程之间发生。
进程间相互操作的三种形式:
通信、同步和聚集.应用程序接口(API)。
17.并行算法分类:
根据运算基本对象的不同可以分为:
数值并行算法,非数值并行算法;
根据各进程承担的计算任务粒度的不同可分为:
细粒度并行算法,中粒度并行算法,
大粒度并行算法;
根据并行进程间相互执行顺序关系的不同可分为:
同步并行算法(必须相互等待),
异步并行算法(不需要相互等待),
独立并行算法(不需要任何通信);
18.并行算法发展阶段:
基于向量运算的并行算法设计阶段,
基于多向量处理机的并行算法设计阶段,
SIMD类并行机上的并行算法设计阶段,
MIMD类并行机上的并行算法设计阶段
现代并行算法设计:
以MIMD类为主流,要求具有可扩展性和可移植性;
20.网络性能指标:
节点度,网络直径,对剖宽度,对剖带宽。
21.ATM是一种独立于介质的消息传输协议,它将消息段变成更短的固定长度为53字节的报元进行传输。
22.并行计算性能评测:
CPU的某些基本性能指标;
工作负载(执行时间,浮点运算数,指令数目);
并行执行时间Tn=Tcomput+Tparo+Tcomm(Tcomput为计算时间,
Tparo为并行开销时间,Tcomm为相互通信时间);
存储器性能(存储器的层次结构(C,L,B),估计存储器的带宽);
并行与通信开销
PowerPC(每个周期15ns执行4flops;
创建一个进程1.4ms可执行372000flops)
开销的测量:
乒--乓方法(Ping-PongScheme),
节点0发送m个字节给节点1;
节点1从节点0接收m个字节后,立即将消息发回节点0。
总的时间除以2,即可得到点到点通信时间,
也就是执行单一发送或接收操作的时间。
可一般化为热土豆法(Hot-Potato),也称为救火队法(Fire-Brigade)
0——1——2——…——-n-1——0;
23.Ping-PongScheme
if(my_node_id=0)then/*发送者*/
start_time=second()
sendanm-bytemessagetonode1
receiveanm-bytemessagefromnode1
end_time=second()
total_time=end_time–start_time
communication_time[i]=total_time/2
elseif(my_node_id=1)then/*接收者*/
receiveanm-bytemessagefromnode0
sendanm-bytemessagetonode0
endif
24.并行开销的表达式:
点到点通信
通信开销t(m)=t0+m/r_
通信启动时间t0
渐近带宽r_:
传送无限长的消息时的通信速率
半峰值长度m1/2:
达到一半渐近带宽所要的消息长度
特定性能π0:
表示短消息带宽
t0=m1/2/r_=1/π0
25.并行开销的表达式:
整体通信
典型的整体通信有:
播送,收集,散射,全交换,循环移位
26.算法级性能评测:
加速比性能定律
并行系统的加速比是指对于一个给定的应用,并行算法(或并行程序)的执行速度
相对于串行算法(或串行程序)的执行速度加快了多少倍。
Amdahl定律
Gustafson定律
SunNi定律
可扩放性评测标准
等效率度量标准
等速度度量标准
平均延迟度量标准
并行计算的可扩放性(Scalability)也是主要性能指标
可扩放性最简朴的含意是在确定的应用背景下,计算机系统(或算法或程序等)
性能随处理器数的增加而按比例提高的能力
影响加速比的因素:
处理器数与问题规模
求解问题中的串行分量
并行处理所引起的额外开销(通信、等待、竞争、冗余操作和同步等)
加大的处理器数超过了算法中的并发程度
增加问题的规模有利于提高加速的因素:
较大的问题规模可提供较高的并发度;
额外开销的增加可能慢于有效计算的增加;
算法中的串行分量比例不是固定不变的(串行部分所占的比例随着问题规模的
增大而缩小)。
增加处理器数会增大额外开销和降低处理器利用率,所以对于一个特定的并行系统
(算法或程序),它们能否有效利用不断增加的处理器的能力应是受限的,而度量这
种能力就是可扩放性这一指标。
可扩放性:
调整什么和按什么比例调整
并行计算要调整的是处理数p和问题规模W,
两者可按不同比例进行调整,此比例关系(可能是线性的,多项式的或指数的
等)就反映了可扩放的程度。
并行算法和体系结构
可扩放性研究的主要目的:
确定解决某类问题用何种并行算法与何种并行体系结构的组合,可以有效地利
用大量的处理器;
对于运行于某种体系结构的并行机上的某种算法当移植到大规模处理机上后运
行的性能;
对固定的问题规模,确定在某类并行机上最优的处理器数与可获得的最大的加
速比;
用于指导改进并行算法和并行机体系结构,以使并行算法尽可能地充分利用可
扩充的大量处理器
目前无一个公认的、标准的和被普遍接受的严格定义和评判它的标准
等效率度量标准
曲线1表示算法具有很好的扩放性;曲线2表示算法是可扩放的;曲线3表示算法是不可扩放的。
优点:
简单可定量计算的、少量的参数计算等效率函数
缺点:
如果To无法计算出(在共享存储并行机中)
优点:
直观地使用易测量的机器性能速度指标来度量
缺点:
某些非浮点运算可能造成性能的变化
优点:
平均延迟能在更低层次上衡量机器的性能
缺点:
需要特定的软硬件才能获得平均延迟
MPI_Init函数用于初始化MPI系统。
在调用其他MPI函数前(除MPI_Initialized外)必须先调用该函数。
在许多MPI系统中,第一个进程通过MPI_Init来启动其他进程。
注意要将命令行参数的地址(指针)&argc和&argv传递给MPI_Init,因为MPI程序启动时一些初始参数是通过命令行传递给进程的,这些参数被添加在命令行参数表中,MPI_Init通过它们得到MPI程序运行的相关信息,如需要启动的进程数、使用那些结点、以及进程间的通信端口等,返回时会将这些附加参数从参数表中去掉。
因此一个MPI程序如果需要处理命令行参数,最好在调用MPI_Init之后再进行处理,这样可以避免遇到MPI系统附加的额外参数。
函数MPI_Comm_size与MPI_Comm_rank分别返回指定通信器(这里是MPI_COMM_WORLD,它包含了所有进程)中进程的数目以及本进程的进程号。
MPI_Finalize函数用于退出MPI系统。
调用MPI_Finalize之后不能再调用任何其他MPI函数。
27.求PI
/*spmd.c*/
#include
#include”mpi.h”
intmain(intargc,char*argv[])
{intmyid,numprocs,n,i;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);MPI的广播函数是MPI_Bcast。
if(myid==0)
dowork0();
else
dowork1();
MPI_Finalize();
return0;
}
/*****各进程同时执行如下串行计算,计算部分和。
各进程需要了解:
①总进程数;
②本进程的进程号;
③所计算的问题;
④数据分布方案。
*****/
doubleParaDowork0(intmyid,intnumprocs,intn)
{
inti;
doublex,mySum=0,h=1.0/n;
for(i=myid;i { x=h*(i+0.5);//计算区间中点坐标 mySum+=f(x);//累加函数值 } returnh*mySum; } doubleParaDowork1(intmyid,intnumprocs,intn) { inti,m,k,m0,m1; doublex,mySum=0,h=1.0/n; k=n%numprocs; m=n/numprocs; if(myid { m0=myid*(m+1);m1=m0+m+1; } else { m0=myid*m+k;m1=m0+m; } for(i=m0;i { x=h*(i+0.5); mySum+=f(x); } returnh*mySum; } 28.死锁 1#include 2#include 3#include"mpi.h" 4 5#defineSIZE16 6程序在大部分MPI系统上不会出问题,这是因为发送的数据量很少,MPI系统会将待发送的数据复制到一个内部缓冲区,因此函数MPI_Send会立即返回,而实际发送在后台进行,各进程接着分别会调用MPI_Recv函数来接收对方发来的数据,完成通信。 如果加大消息中的数据量,例如将#defineSIZE16改成#defineSIZE(16*1024*1024) 则程序很可能会死锁,因为此时数据长度超过了MPI的内部缓冲区长度,MPI_Send函数无法立即返回,所有进程都在等待对方接收。 解决这类通信死锁问题的一个方法是调整消息收发的顺序使得消息的接收与发送正好配对,例如在上面的例子中,可以让偶数号的进程先发后收,奇数号的进程先收后发。 但对于实际应用中的复杂情况,往往不容易做到消息发送与接收的完美匹配,此时最好使用MPI_Sendrecv函数或者非阻塞型消息收发函数(MPI_Isend和MPI_Irecv)。 例如,如果将上例中的MPI_Send和MPI_Recv调用替换成MPI_Sendrecv(buf1,SIZE,MPI_INT,dst,tag,buf2,SIZE,MPI_INT,src,tag,MPI_COMM_WORLD,&status); 7int 8main(intargc,char**argv) 9{ 10staticintbuf1[SIZE],buf2[SIZE]; 11intnprocs,rank,tag,src,dst; 12MPI_Statusstatus; 13 14MPI_Init(&argc,&argv); 15MPI_Comm_size(MPI_COMM_WORLD,&nprocs);/*获取总进程数*/ 16MPI_Comm_rank(MPI_COMM_WORLD,&rank);/*获取本进程的进程号*/ 17 18/*初始化buf1*/ 19memset(buf1,1,SIZE); 20 21tag=123; 22dst=(rank>nprocs-1)? 0: rank+1; 23src=(rank==0)? nprocs-1: rank-1; 24MPI_Send(buf1,SIZE,MPI_INT,dst,tag,MPI_COMM_WORLD); 25MPI_Recv(buf2,SIZE,MPI_INT,src,tag,MPI_COMM_WORLD,&status); 26 27MPI_Finalize(); 28 29return0; 30} 30.聚合通信指在一个通信器的所有进程间同时进行的通信。 聚合通信总是在一个通信器中的所有进程间进行,调用一个聚合通信函数时,通信器中的所有进程必须同时调用同一函数共同参与操作。 31.聚合通信包括障碍同步(MPI_Barrier)、广播(MPI_Bcast)、数据收集(MPI_Gather)、数据散发(MPI_Scatter)、数据转置(MPI_Alltoall)和归约(MPI_Reduce)。 32.一个MPI并行程序主要由三个部分组成: (1)进入并行环境: 调用MPI_Init来启动并行计算环境,它包括在指定的计算结点上启动构成并行程序的所有进程以及构建初始的MPI通信环境和通信器MPI_COMM_WORLD、MPI_COMM_SELF。 (2)主体并行任务: 这是并行程序的实质部分,所有需要并行来完成的任务都在这里进行。 在这个部分中,实现并行算法在并行计算机上的执行过程。 (3)退出并行环境: 调用MPI_Finalize退出并行环境。 一般说来,退出并行计算环境后程序的运行亦马上结束。 33.π值计算 1/*程序来源: MPICHexamples/cpi.c*/ 2#include"mpi.h" 3#include 4 5doublef(doublea){return(4.0/(1.0+a*a));} 6 7intmain(intargc,char*argv[]) 8{ 9intn,myid,numprocs,i,namelen; 10doublePI25DT=3.141592653589793238462643; 11doublemypi,pi,h,sum,x; 12doublestartwtime,endwtime; 13charprocessor_name[MPI_MAX_PROCESSOR_NAME]; 14 15MPI_Init(&argc,&argv); 16MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 17MPI_Comm_rank(MPI_COMM_WORLD,&myid); 18MPI_Get_processor_name(processor_name,&namelen); 19fprintf(stderr,"Process%don%s\n",myid,processor_name); 20if(myid==0){ 21n=10000; 22startwtime=MPI_Wtime(); 23} 24MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); 25h=1.0/(double)n; 26sum=0.0; 27for(i=myid;i 28x=h*((double)i+0.5); 29sum+=f(x); 30} 31mypi=h*sum; 32MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD); 33if(myid==0){ 34endwtime=MPI_Wtime(); 35printf("piisapproximately%.16f,erroris%.16f\n",pi,pi-PI25DT); 36printf("wallclocktime=%f\n",endwtime-startwtime); 37} 38MPI_Finalize(); 39 40return0; 41} 34.MPI并行程序从程序结构上可以分成三种编程模式,包括主从模式(Master–slave)、单程序多数据模式(SPMD,即SingleProgramMultipleData)和多程序多数据模式(MPMD,即MultipleProgramsMultipleData) 35.串行程序的执行时间近似等于程序指令执行花费的CPU时间。 并行程序相对复杂,其执行时间(executiontime)等于从并行程序开始执行,到所有进程执行完毕,墙上时钟走过的时间,也称之为墙上时间,对各个进程,墙上时间可进一步分解为计算CPU时间、通信CPU时间、同步开销时间、同步导致的进程空闲时间。 计算CPU时间进程指令执行所花费的CPU时间,它可以分解为两个部分,一个是程序本身指令执行占用的CPU时间,即通常所说的用户时间(usertime),主要包含指令在CPU内部的执行时间和内存访问时间,另一个是为了维护程序的执行,操作系统花费的CPU时间,即通常所说的系统时间(systemtime),主要包含内存调度和管理开销、I/O时间、以及维护程序执行所必需要的操作系统开销等。 通常地,系统时间可以忽略。 通信CPU时间包含进程通信花费的CPU时间。 同步开销时间包含进程同步花费的时间。 进程空闲时间当一个进程阻塞式等待其他进程的消息时,CPU通常是空闲的,或者处于等待状态。 进程空闲时间是指并行程序执行过程中,进程所有这些空闲时间的总和。 显然,进程的计算CPU时间小于并行程序的墙上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并行 计算 MPI 复习资料
![提示](https://static.bdocx.com/images/bang_tan.gif)