文档详情

并行计算基础知识讲座2

gu****n
实名认证
店铺
2024-09-18
PPT
498KB
约72页
并行计算基础知识讲座2_第1页
1/72
并行计算基础知识讲座2_第2页
2/72
并行计算基础知识讲座2_第3页
3/72

单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,*,,基于,MPI,的并行程序设计,王振海,,西北工业大学理学院,,西北工业大学高性能计算研究与发展中心,2024/9/18,1,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,,主要内容,2024/9/18,2,,目前,高性能并行机主要可以分为对称多处理共享存储并行机(,SMP, Symmetric,MultiProcessor,)、,分布式共享存储多处理机 (,DSM,,Distributied,Shared Memory)、,大规模并行处理机(,MPP, Massively Parallel Processor),和微机机群(,Cluster),等四类在这些并行机上,并行程序设计平台主要可分为消息传递、共享存储和数据并行三类,其中消息传递具有很好的可移植性,它能被所有这些类型的并行机所支持,而共享存储只能在在,SMP,和,DSM,并行机中使用,数据并行只能在,SMP,DSM,和,MPP,并行机上使用。

并行编程,环境简介,2024/9/18,3,,消息传递并行编程环境(,MPI:Message Passing Interface),是目前国际上最流行、可移植性和可扩展性很好的并行程序设计平台,并被当前流行的所有高性能并行机所支持它是在标准串行程序设计语言(,C,Fortran,C++),的基础上,再加入实现进程间通信的,MPI,消息传递库函数,就构成了,MPI,并行程序设计所依赖的并行编程环境MPI,已经在,Windows,系列的非,Unix、Linux,平台上实现,其程序设计语言支持,C, Fortran,和,Java在国产的三大并行机系列神威、银河和曙光上也都实现了对,MPI,和支持MPI,并行编程,环境,2024/9/18,4,,MPI,并行,环境的应用现状,,MPI,是全球工业、政府和科研部门联合推出的适合进程间进行标准消息传递的并行程序设计平台,最初版,MPI 1.0,本于,1994,年,6,月推出,目前最新的为,MPI 2.0,版,于,1998,年10月推出MPI,的,具体实现,:,MPICH,和,LAMMPI,,目前均已实现,MPI 1.2,版,适用于任何并行计算平台;部分并行机已实现,MPI 2.0,版。

MPI,是目前应用最广的并行程序设计平台,几乎被所有并行计算环境(共享和分布式存储并行机、,MPP、,机群系统等)和流行的多进程操作系统(,UNIX、Windows NT),所支持,基于它开发的应用程序具有最佳的可移植性2024/9/18,5,,MPI,并行,环境的应用现状(续),,目前高效率的超大规模并行计算(,1000,个处理器)最可信赖的平台工业、科学与工程计算部门的大量科研和工程软件(气象、石油、地震、空气动力学、核等)目前已经移植到,MPI,平台,发挥了重要作用MPI,的,优点,:(1)具有很好的可移植性,几乎被所有的并行环境支持;(2)具有很好的可扩展性,是目前高效率的大规模并行计算最可信赖的平台;(3)比其它消息传递系统好用;(4)有完备的异步通信功能;(5)有精确的定义,从而为并行软件产业的发展提供了必要的条件2024/9/18,6,,MPI,并行,环境的应用现状(续),,MPI 2.0,版在1.0版的基础上,增加了如下的消息传递功能,:(1)并行,I/O:,允许多个进程同时读写同一个文件;(2)线程安全:允许,MPI,进程的多个线程执行,即支持与,OpenMP,的混合并行编程;(3)动态进程管理:允许并行应用程序在执行过程中,动态地增加和删除进程个数;(4)单边通信:允许某个进程对其它进程的局部内存单元直接执行读写访问,而步需要对方进程的显式干预;(5)并行应用程序之间,的动态互操作:允许各个,MPI,并行应用程序之间动态地建立和删除消息传递通道。

目前,各类并行机,特别式微机机群,只实现了,MPI 2.0,的部分功能本中心机群所支持的为,MPI 1.2.5,版本2024/9/18,7,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,8,,单个进程(,process,),进程,是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位通俗理解:串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间进程,1,,内存,,进程,2,,2024/9/18,9,,单机内多个进程,,多个进程可以,同时存在于单机内同一操作系统,:,由操作系统负责调度分时共享处理机资源(,CPU,、,内存、存储、外设等)进程间相互独立,(,内存空间不相交),:,在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行,进程间可以相互交换信息,:例如数据交换、同步等待,,消息,是这些交换信息的基本单位,,消息传递,是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式,。

2024/9/18,10,,最基本的消息传递操作,:发送消息(,send,)、,接受消息(,receive,)、,进程同步(,barrier,)、,规约(,reduction,),消息传递的实现,:共享内存或信号量,用户不必关心,单机内多个进程(续),2024/9/18,11,,包含于通过网络联接的不同计算机的多个进程,,进程独立存在,:进程位于不同的计算机,由各自独立的操作系统调度,享有独立的,CPU,和内存资源进程间相互信息交换,:消息传递,消息传递的实现,:基于网络,socket,机制,,,用户不必关心2024/9/18,12,,消息传递库函数,,应用程序接口,(,API):,提供给应用程序(,FORTRAN、C、C++,语言)的可直接调用的完成进程间消息传递的某项特定功能的函数消息传递库,:,所有定义的消息传递函数编译形成的软件库,调用其内部函数的应用程序,通过与之联接,即可成为可并行执行的程序目前流行的消息传递函数库,:,PVM 3.3.11、,MPICH 1.2,、LAMMPI 6.4,等2024/9/18,13,,标准消息传递界面,MPI,MPI,标准,:根据应用程序对消息传递功能的需求,全球工业、应用和研究部门联合推出标准的消息传递界面函数,不考虑其具体实现,以保证并行应用程序的可移植性,。

MPI,的具体实现,:消息传递库函数,目前有影响的为,MPICH,和,LAMMPI,,,我们注重,MPICH,系列,2024/9/18,14,,基于消息传递的并行程序执行模式,,SPMD,模式:单程序多数据流,2024/9/18,15,,基于消息传递的并行程序执行模式(续),,MPM,模式,:多程序多数据流,除初始启动多个可执行代码,其余与,SPMD,模式一致2024/9/18,16,,共享存储与分布式存储,,属于并行机体系结构的范畴,与消息传递并行程序设计平台无关,2024/9/18,17,,消息传递是相对于,进程间通信方式,而言的,与具体并行机存储模式无关,任何支持进程间通信的并行机,均可支持消息传递并行程序设计,几乎所有共享和分布存储并行计算环境均支持进程间的消息传递通信,共享存储与分布式存储(续),,2024/9/18,18,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,19,,MPI,并行程序设计平台由,标准消息传递函数及相关辅助函数,构成,多个进程通过调用这些函数(类似调用子程序),进行通信。

SPMD,执行模式,:一个程序同时启动多份,形成多个独立的进程,在不同的处理机上运行,拥有独立的内存空间,进程间通信通过调用,MPI,函数来实现每个进程开始执行时,将获得一个唯一的序号(,rank)例如启动,P,个进程,序号依次为0,1,…,,P-1MPI,并行程序,2024/9/18,20,,MPI,并行程序,例,1,进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将该数加1,再传递给进程3;依次类推,最后,进程,P-1,将该数传递给进程0,由进程0负责广播该数给所有进程,并打印输出program example1,,include “,mpif,.h” !! MPI,系统头文件,,,integer status(MPI_STATUS_SIZE), my_rank,p,,integer source,,dest,,tag,,ierr,,data,,c,2024/9/18,21,,MPI,并行程序,例,1(续),c-------,进入,MPI,系统,,,call MPI_Init(,ierr,),,call MPI_,Comm,_rank(MPI_COMM_WORLD,my_rank,,ierr,),,call MPI_,Comm,_size(MPI_COMM_WORLD,p,,ierr,),,c-------,数据交换,,,data=0,,tag = 5,,source= my_rank-1,,if(source.,eq,.-1) source=p-1,,,dest,=my_rank+1,,if(,dest,.,eq,.p),dest,=0,2024/9/18,22,,,if(my_rank.,eq,.0) then,,call MPI_Send(data,1,MPI_INTEGER,,dest,,tag,MPI_COMM_WORLD,,ierr,),,call MPI_,Recv,(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,,ierr,),,else,,call MPI_,Recv,(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,,ierr,),,data=data+1,,call MPI_Send(data,1,MPI_INTEGER,,dest,,tag,MPI_COMM_WORLD,,ierr,),,,endif,,c,,MPI,并行程序,例,1(续),2024/9/18,23,,c-------,广播数据,,,call MPI_,Bcast,(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,,ierr,),,c------,打印输出,,,if(my_rank.,eq,.0) then,,if(data.,eq,.p-1) then,,print *,”Successful, data=”,data,,else,,print *,”Failure, data=”,data,,,endif,,endif,,c,,call MPI_Finalize(,ierr,),,end,MPI,并行程序,例,1(续),2024/9/18,24,,MPI,并行程序的运行,MPI,编译命令,:,mpif77 -o exam.e example.f,,运行命令,:,mpirun,–,np,4 exam.e,,运行效果,:,MPI,系统选择相同或不同的4个处理机,在每个处理机上运行程序代码,exam.e。

运行结果,:,Successful, data=3,,2024/9/18,25,,运行分析,2024/9/18,26,,MPI,重要概念,进程序号,(,rank),:,各进程通过函数,MPI_,Comm,_rank(),获取各自的序号消息号,:,消息的标号通信器,(,Communicator),:,1),理解为一类进程的集合,且在该集合内,进程间可以相互通信;类比:邮局、电话局、国际网;,2),任何,MPI,通信函数均必须在某个通信器内发生;,3),MPI,系统提供省缺的通信器,MPI_COMM_WORLD,,,所有启动的,MPI,进程通过调用函数,MPI_Init(),包含在该通信器内;,4),各进程通过函数,MPI_,Comm,_size(),获取通信器包含的,(,初始启动,),的,MPI,进程个数2024/9/18,27,,消息,:,分为,数据(,data,),和,包装(,envelope,),两个部分,其中,包装由,接收进程序号,、,发送进程序号,、,消息标号,和,通信器,四部分组成,数据包含用户将要传递的内容,进程组,:,一类进程的集合,在它的基础上,可以定义新的通信器基本数据类型,:,对应于,FORTRAN,和,C,语言的内部数据类型(,INTEGER,REAL,DOUBLE PRECISION,COMPLEX,LOGICAL,CHARACTER),MPI,系统提供已定义好的对应数据类型(,MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER),。

MPI,重要概念(续),2024/9/18,28,,MPI,重要概念(续),自定义数据类型,:,基于基本数据类型,用户自己定义的数据类型(后面介绍),MPI,对象,:,MPI,系统内部定义的数据结构,包括数据类型、进程组、通信器等,它们对用户不透明,在,FORTRAN,语言中,所有,MPI,对象均必须说明为“整型变量,INTEGER”,MPI,联接器(,handle,),:,联接,MPI,对象和用户的桥梁,用户可以通过它访问和参与相应,MPI,对象的具体操作;例如,,MPI,系统内部提供的通信器,MPI_COMM_WORLD;,在,FORTRAN,语言中,所有,MPI,联接器均必须说明为“,整型变量,INTEGER,”,2024/9/18,29,,MPI,重要概念(续),进程拓扑结构,:,进程组内部进程之间的一种相互连接结构,如,3,,3,网格,将在后面介绍,3×3,网格拓扑结构,,静态进程个数,:,进程数由命令“,mpirun,–,np xxx,”,初始确定为,xxx,个,程序执行过程中,不能动态改变,进程的个数 2024/9/18,30,,MPI,重要概念(续),消息缓存区,:,应用程序产生的消息包含的数据所处的内存空间,。

标准输入,:所有进程的标准输入,read(*,*),均省缺为当前终端屏幕,且只能由0号进程执行该操作,其他进程需要这些输入参数,只能由0号进程执行数据广播操作标准输出,:,所有进程可以独立执行标准输出,write(*,*),,但其省缺为当前终端屏幕2024/9/18,31,,MPI,函数格式,FORTAN,语言中,最后一个参数为该函数调用是否成功的标志:0表示成功,其它表示各种可能的错误C,语言中,该标志有函数参数返回C :,ierr,=MPI_,Comm,_rank(,myrank,),,F : MPI_,Comm,_rank(,myrank,,,ierr,),2024/9/18,32,,MPI,函数的使用查询,,由函数名查询:,man,,函数名 (,MPI_,Xxxx,),,注意大小写,例如,,man MPI_,Comm,_rank,,man MPI_Send,,man MPI_,recv,2024/9/18,33,,MPI,函数的学习与使用,,注重,MPI,函数的各类功能,由应用程序的通信需求出发,寻找匹配的函数类型,在查找具体函数名,采用,man,命令可以查询该函数的具体参数含义和使用方法。

2024/9/18,34,,一般的,MPI,程序设计流程图,程序参数说明,Call MPI_Init ( ),进入,MPI,系统,通信器,MPI_COMM_WORLD,形成,,Call MPI_,Comm,_rank ( ),,Call MPI_,Comm,_size ( ),建立新的通信器、定义新的数据类型和进程拓扑结构,2024/9/18,35,,一般的,MPI,程序设计流程图(续),应用程序实体:,,.计算控制程序体;,,.进程间通信;,Call MPI_Finalize ( ),End,退出,MPI,系统,,2024/9/18,36,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,37,,点对点通信(,point-to-point),定义,:给定属于同一通信器内的两个进程,其中一个发送消息,一个接收消息,MPI,系统定义的所有通信方式均建立在点对点通信之上四种模式,:,标准模式,、缓存区模式、同步模式、就绪模式2024/9/18,38,,标准模式点对点通信,进程可以随意地发送(接收)消息,与是否存在匹配的消息接收(发送)进程无关。

发收匹配:,,发收不匹配:,,进程0,进程1,进程0,进程1,进程2,2024/9/18,39,,标准模式点对点通信,的分类,阻塞式,:消息发送函数返回,用户可以对消息缓存区进行处理,不会影响已发送的消息数据;接收函数返回,用户可以使用接收到的消息数据,非阻塞式,:发送和接受函数返回后,必须调用另一类函数来确保它们的正确完成2024/9/18,40,,标准模式点对点通信,的分类举例,2024/9/18,41,,点对点通信函数举例,阻塞式标准消息发送函数,,MPI_Send(,buf,,count,,datatype,,,dest,,tag,,comm,,,ierr,),,Real*8(integer,…),buf,:,消息发送缓存区起始地址,,(,Fortran,,用户的待发送的第一个数据),,integer count :,buf,起始的数据单元个数,,integer,datatype,:,数据类型(基本或用户定义的),,integer,dest,:,接收进程序号,,integer tag :,消息的标号,,integer,comm,:,通信器,,integer,ierr,:,函数调用返回错误码,2024/9/18,42,,,real *8 a(100,100),,integer b(60,60),,c-----,发送50个双精度数“,a(5,20) : a(54,20)”,到2号进程,,call MPI_Send( a (5,20),50,MPI_DOUBLE_PRECISION,2,,,& 99999,MPI_COMM_WORLD,,ierr,),,c-----,发送20个整型数“,b(20,40) : b(39,40)”,到5号进程,,call MPI_Send( b (20,40),20,MPI_DOUBLE_PRECISION,5,,,& 99999,MPI_COMM_WORLD,,ierr,),阻塞式标准消息发送函数举例,2024/9/18,43,,MPI_,Recv,(,buf,,count,,datatype,,,dest,,tag,,comm,,status,,ierr,),,Real*8(integer,…),buf,:,消息接收缓存区起始地址,,(,Fortran,,用户用于接受的第一个数据),,,integer count :,buf,起始的数据单元个数,,,integer,datatype,:,数据类型(基本或用户定义的),,,integer,dest,:,发送进程序号,,,integer tag :,消息的标号,,,integer,comm,:,通信器,,,integer status(MPI_STATUS_SIZE) :,接收状态数组;,,,integer,ierr,:,函数调用返回错误码,阻塞式标准消息接收函数,,2024/9/18,44,,阻塞式标准消息接收函数举例,,real *8 a(100,100),,integer b(60,60),,c-----,从2号进程接收50个双精度数到“,a(5,20) : a(54,20)”,,call MPI_,Recv,( a (5,20),50,MPI_DOUBLE_PRECISION,2,,,& 99999,MPI_COMM_WORLD,status,,ierr,),,c-----,从5号进程接收20个整型数到“,b(20,40) : b(39,40)”,,call MPI_,Recv,( b (20,40),20,MPI_DOUBLE_PRECISION,5,,,& 99999,MPI_COMM_WORLD,status,,ierr,),其他点对点通信函数:参考手册。

2024/9/18,45,,聚合通信(,Collective Communication),定义,:属于同一通信器的所有,MPI,进程均必须参与的通信操作,参与方式,:调用同一聚合通信函数函数类型,:,,同步通信函数,:,所有进程在某个程序点上同步MPI_Barrier (,comm,,,ierr,),,全局通信函数,,全局规约函数,,,2024/9/18,46,,全局通信函数,广播,:,MPI_,Bcast,(,buf,,count,,dtype,,,root,,,comm,,,ierr,),,root,发送,,other,接收,,收集,:,MPI_Gather(,bufs,,,bufr,,count,,dtype,,root,,comm,,,ierr,),,all,发送大小一致的数据块,,root,接收并按序号连续存放,,全收集:,MPI_,Allgather,(),,all,发送,,all,接收,2024/9/18,47,,全局通信函数(续),索引收集,:,MPI_,Gatherv,(),,all,发送大小不等的数据块,,root,接收并按索引间断存放,,索引全收集,:,MPI_,Allgatherv,(),,all,发送大小不等的数据块,,all,接收并按索引间断存放,2024/9/18,48,,全局通信函数(续),分散,:,MPI_Scatter(,bufs,,,bufr,,count,,dtype,,root,,comm,,,ierr,),,root,发送连续的大小一致的数据块,,all,接收,,索引分散,:,MPI_,Scatterv,(),,root,发送间断的的大小不一致的数据块,,all,接收,,全交换,:,MPI_,Scatterv,(),,all,发送大小一致数据块到各进程,,all,接收大小一致数据块并按序号连续存放,2024/9/18,49,,全局规约,(,global reduction),函数,规约,:,MPI_Reduce(,sbuf,,,rbuf,,count,,dtype,,,op,,,root,,,comm,,,ierr,),,规约操作类型,op,: MPI_SUM, MPI_MIN, MPI_MAX,,,MPI_PROD,等12种。

全规约,:,MPI_,Allreduce,(),,除要求将结果返回到所有进程外,与,MPI_Reduce(),一致,,规约分散,:,MPI_Reduce_scatter(),,将规约结果分散到各进程并行前缀计算,:,MPI_Scan(),2024/9/18,50,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,51,,自定义数据类型,定义,:,在,MPI,系统已定义的基本数据类型(,MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_CHARACTER,等)基础上,用户根据需求,自己定义的数据类型,在用户已定义好的数据类型基础上,还可以进一步定义新的数据类型用户定义的数据类型,必须由函数,MPI_Type_Commit(),提交给,MPI,系统;此后,就可以象基本数据类型一样,在消息传递函数中重复使用;并由函数,MPI_Type_free(),释放具体自定义数据类型函数,请参考手册2024/9/18,52,,自定义数据类型(续),,real a(1000),,,发送:,a(5:9),,,call MPI_Send(a(5), 5, MPI_ REAL,…..) OK,,发送:,a(5),a(7),a(9),a(11),a(13),a(15),,do i=5, 15, 2,,call MPI_Send(a(i),1,MPI_REAL,….) OK,,,enddo,,缺点,: 多次发送,效率低,程序设计繁琐,,改进,:用户定义新的数据类型,,call MPI_Type_vector(5,1,2,MPI_REAL,,newtype,,,ierr,),,call MPI_Type_commit(,newtype,,,ierr,),提交,,call MPI_Send(a(5), 1,,newtype,,….),,call MPI_Type_free(,newtype,,,ierr,),释放,2024/9/18,53,,进程拓扑结构,,定义,:根据应用程序的特征,在进程间建立的一种虚拟拓扑连接方式,以方便并行程序设计和提高并行计算性能。

例,:二维规则区域,3*3 区域分解,9个进程,建立,Cartesion,坐标,进程(,i,j),的相邻进程为(,i-1,j), (i+1,j), (i,j-1), (i,j+1)2024/9/18,54,,并行,I/O,各进程可以类似于串行程序独立地读,/,写,不同,的文件,MPICH 1.2,以上版本支持所有进程并行读写同一个文件,2024/9/18,55,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,56,,MPI,并行程序,例,2,矩阵乘积,:,A,为,M×N,阶矩阵,,B,为,N×L,阶矩阵,,C,为,M×L,阶矩阵计算矩阵乘积,C=AB算法描述,:假设使用,nprocs,个,MPI,进程,为简单起见假定,M,和,L,均为,nprocs,的倍数A,和,C,按行等分成子块分别存储在不同的进程中,而,B,则按列等分成子块分别存储在不同的进程中A,B,和,C,的子块大小分别为,mloc,×N,N×,lloc,和,mloc,×L,,其中,mloc,=M/,nprocs,,,lloc,=L/,nprocs,。

具体存储方式为(,k=0,…,,nprocs,-1):,,,存储在进程,k,的数组,A,中,,存储在进程,k,的数组,B,中,,存储在进程,k,的数组,C,中,2024/9/18,57,,MPI,并行程序,例,2(续),算法,:矩阵,A,和,C,的子块不动,矩阵,B,的子块在各个进程间循环移动如图,是当,nprocs,=3,时的计算流程示意图A0,A1,A2,×,B0,B1,B2,=,A0×B0 A0×B1 A0×B2,C0,A1×B0 A1×B1 A1×B2,C1,A2×B0 A2×B1 A2×B2,C2,A0,,B0,,B2,,B1,A1,,B1,,B0,,B2,A2,,B2,,B1,,B0,进程1,进程2,进程3,2024/9/18,58,,MPI,并行程序,例,2(续),MPI,并行程序,:主程序负责分配存储单元并生成矩阵,A,和,B,的子块,然后调用子程序,matmul,完成矩阵的乘法运算其中,nprocs,为,MPI,进程数,,myrank,为当前进程的,MPI,进程号数组,A,B,和,C,分别存储矩阵,A,B,和,C,的子块work,为工作数组,大小与数组,B,一样乘法子程序使用,MPI_,Sendrecv,_replace。

ex1.f),,使用异步通信函数,MPI_,Isend,/MPI_,Irecv,,,在适当的硬件环境下它可以使得计算与通信重叠进行ex2.f),,调用,BLAS,库函数完成矩阵子块的乘积选用适当的,BLAS,库可以大幅度提高程序的实际运行性能注意,编译该程序时必须与,BLAS,库连接ex3.f),2024/9/18,59,,MPI,并行程序,例3,,一维,Dirichlet,问题,:,,,,算法,:均匀网格有限差分离散,,Jacobi,迭代求解区域分解,:,nproc,=4, n = 21, ns = (n-1)/,nproc,+1 =6,,源程序:1,dpoisson,.f,2024/9/18,60,,MPI,并行编程,环境,,进程与消息传递,,,MPI,并行程序设计入门,,初步的,MPI,消息传递函数,,先进的,MPI,函数,,MPI,并行程序示例,,面向性能的程序设计,2024/9/18,61,,设计高性能并行程序的要点与技术,,划分阶段的性能问题,,在多存储系统中的数据访问和通信,,,性能的整合,,,从处理器角度看到的性能因素,,,程序设计模型的影响,,2024/9/18,62,,在分解和分配步骤中,我们可以将并行计算机系统简单地看作是一个相互合作的处理器集合,不用考虑程序设计模型和硬件系统组织。

我们只需知道在处理器之间的通信开销是很大的此时,在算法方面的三个基本要素是:,,平衡负载,减少花在等待同步事件上的时间,,减少通信开销,,减少由确定和管理分配所带来的附加工作,,不幸的是,即使这三种基本目标也是相互冲突的,必须进行折衷权衡划分阶段的性能问题,2024/9/18,63,,平衡负载和减少同步等待时间的过程分为四步,在分解中识别足够的并发性(数据并行和功能并行);,,决定管理并发性的方式(,静态分配和动态分配的对比,);,,确定并发性开发的粒度;,,降低序列化和同步代价2024/9/18,64,,在多存储系统中的数据访问和通信,多处理器系统也是多存储器系统,多缓存系统系统这些组成部分的作用对程序执行性能是十分重要的,并且其重要性与程序设计模型无关(尽管程序设计模型可能影响某些性能折衷考虑的特性)在这里,我们从一种不同的角度来看多处理器系统多处理器系统看成为扩展的存储层次结构,,,在扩展的存储层次中的附加通信,,,用工作集的观念看人为的通信和数据的复制,2024/9/18,65,,性能的整合,减少人为通信:,开发时间局部性与空间局部性;,,将通信结构化以降低开销:通过减少通信开销和降低延迟,增加带宽,减少占有度,提供机制来分散冲突,用计算和通信来重叠通信 。

2024/9/18,66,,从处理器角度看到的性能因素,,在我们通常的分布存储并行系统结构上,并行执行时间有五个分量:,,忙有用,:处理器花在执行指令上的时间,那些指令本来在串行程序中也是要执行的假设一个直接从串行算法中导出的确定性的并行程序,所有处理器的有用忙时间之和等于串行执行的有用忙时间忙开销,:处理器花在执行那些在串行程序中不需要的指令上的时间这直接对应于并行程序中的额外工作部分数据局部,:等待数据引用被它自己的存储系统满足的时间;即等待的引用不会产生和其它节点的通信,数据远程,:等待数据通信的时间,无论是固有通信还是附加通信这代表处理器看到的通信代价2024/9/18,67,,同步,:等待其它进程给出某个事件发生的信号,有了该信号,本进程才能推进这包括负载不平衡和程序中的串行化现象,还有实际花在执行同步操作和访问同步变量上的时间当它等待的时候,一个处理器可能重复检测某个变量的值,直到改变—这就要执行指令—或者它停滞等待,这取决于同步的实现方式同步、忙开销、远程数据访问分量是由于并行所引入的开销,在串行程序在单处理器上执行没有固有通信大多数包含在远程数据分量中,它的某些(通常很小)部分可能也在数据局部分量中体现出来。

从处理器角度看到的性能因素(续),,2024/9/18,68,,程序设计模型的影响,经验表明,随着应用变得更复杂和更非规则,透明命名和复制的有用性增加,这是倾向于共享存储的观点然而,由于通信自然是细粒度的(特别是非规则应用),还由于大粒度通信和一致性引起的性能问题,支持共享空间就要求有大胆的通信系统结构,用硬件来支持大多数功能许多计算机公司现在正建造这样的机器,作为它们的高端系统在另一方面,便宜的工作站或者多处理器群也正在逐步流行起来这些系统通常是消息传递程序设计的,这是由于消息传递的性能模型比较好定义,可以用大消息来分摊开销,程序员有显式的控制,以及不同的机器操作粒度对性能的相对影响不大2024/9/18,69,,总结评述,,我们已经看到,性能的方方面面是相互制约的,设计好的并行程序的艺术在于在相互矛盾的要求中获得适当的折衷以高性能为目标的程序设计也是一个逐步求精的过程:在后面所发现的系统或者程序的特点,可能导致在前一个步骤中作的决定被修改将性能的潜力都发挥出来可能需要很大的努力,这取决于应用和系统两个方面进而,不同技术一起发挥作用的程度和方式能够大大影响表现给系统结构的负载的特点2024/9/18,70,,问题讨论,,请联系,,王振海、赵俊峰,,Tel:88493550-17 Email:,zhwang,@nwpu.,edu,.,cn,,zhaojf,_77@,2024/9/18,71,,Thanks!,2024/9/18,72,,。

下载提示
相关文档
正为您匹配相似的精品文档