高性能计算之并行编程技术ppt课件.ppt

上传人:小飞机 文档编号:1974438 上传时间:2022-12-29 格式:PPT 页数:43 大小:645KB
返回 下载 相关 举报
高性能计算之并行编程技术ppt课件.ppt_第1页
第1页 / 共43页
高性能计算之并行编程技术ppt课件.ppt_第2页
第2页 / 共43页
高性能计算之并行编程技术ppt课件.ppt_第3页
第3页 / 共43页
高性能计算之并行编程技术ppt课件.ppt_第4页
第4页 / 共43页
高性能计算之并行编程技术ppt课件.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《高性能计算之并行编程技术ppt课件.ppt》由会员分享,可在线阅读,更多相关《高性能计算之并行编程技术ppt课件.ppt(43页珍藏版)》请在三一办公上搜索。

1、高性能计算之并行编程技术,六、CPU/GPU/TPU概述,一、并行编程基础知识,五、行计算优化,四、Python并发编程方式,三、MPI程序分析及编程入门,二、MPI编程实例演示,提 纲,一、并行编程基础知识,节点(node):每个节点由多个处理器构成,可以直接输入输出互联网络(interconnect network):所有节点通过互联网络相互连接通信。内存 (memory):内存由多个存储模块组成,这些模块或者与节点对称地分布在互联网络的两侧,或者位于各个节点的内部,并行计算机组成部分,内存模块位于节点内部,并行计算机体系结构,内存模块与节点分离,一、并行编程基础知识,一、并行编程基础知识

2、,一、并行编程基础知识,程序:实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合,或者称之为:算法+数据结构。进程:可并发执行的程序在一个数据集合上的运行过程。进程是程序的一次执行;进程可以是和别的计算并发执行的计算;进程可以定义为一个数据结构及其能在其上进行操作的一个程序;进程是一个程序及其数据在处理机上顺序执行时所发生的活动;进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。线程:线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但他与同属于一个进程中的

3、其他线程共享进程所拥有的全部资源。,两个重要概念:进程与线程,一、并行编程基础知识,并行编程通常是指软件代码,它促进在同一时间执行多个计算任务的性能。For example:操场上有20个滑梯而不是一个。孩子们不必排队等待轮到自己,因为他们可以同时玩。使用电脑鼠标,一边听音乐,一边写毕业论文,同时对个人电脑做病毒扫描,这唯一的理由就是并发编程。在这种情况下,它的多重任务允许多个程序或进程访问CPU而没有等待。这一设置允许使用多任务共享的资源进行密集的I/O处理和有效的信号处理。并发性也可以通过实施多个计算线程发生(通常采用交错启动和完成点)。这叫做多线程,并且它发生在一个单一的进程或程序中。这

4、就是为什么你可以打印一个文档,同时继续编辑另一个文档。如果没有多线程,UI会太慢,因为系统将无法在同一时间应对多个用户操作。,并行编程概述,一、并行编程基础知识,并行编程模式,主要指并行编程时,程序员将程序各模块并行执行时,模块间的通信方式,目前并行编程模式主要包括以下三种:共享内存:共享内存是进程间传递数据的一种高效方法。在共享内存模型中,并行进程共享一个进行异步读取的全局地址空间。异步并发访问可能导致条件竞争,因此需要同步机制来避免条件竞争,这些机制包括锁,信号量,管程(monitor)。传统的多核处理器是直接支持共享内存的,所以导致很多利用该特性的语言和库出现,以OpenMP为代表;消息

5、传递:在消息传递模型中,并行进程是通过消息传递来交换数据的。这些通信可以是异步的,即消息可以在接收者做好准备前发送,也可以是同步的,即只有接受者准备好接收消息时才能发送。消息传递的CSP(Communicating sequential processes)模型使用同步通信channel来连接进程,以MPI,PVM为代表;数据并行模式:数据并行化关注在数据集上执行的操作。一组任务对数据集进行运算,但是会对不同的分区进行运算,以Fortran为代表。,并行编程模式,一、并行编程基础知识,Massage Passing Interface:是消息传递函数库的标准规范;由MPI论坛开发.支持Fort

6、ran、C和C+;一种新的库描述, 不是一种语言。,什么是MPI?,消息传递并行程序设计用户必须通过显式地发送和接收消息来实现处理机间的数据交换。每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式,一、并行编程基础知识,下面我们以C语言的形式给出一个最

7、简单的MPI并行程序Hello (下页).该程序在终端打印出Hello World!字样.“Hello World”:一声来自新生儿的问候.,二、MPI编程实例演示,从简单入手!,Hello world (C),#include #include mpi.h“main( int argc, char *argv ) MPI_Init( ,二、MPI编程实例演示,Hello world (Fortran),二、MPI编程实例演示,program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )print *, Hello, world!cal

8、l MPI_FINALIZE( ierr )end,MPI程序的的编译与运行,mpicc o hello hello.c生成hello的可执行代码.mpirun np 4 hello4 指定np的实参,表示进程数,由用户指定.hello 要运行的MPI并行程序.,%小写o,np: The number of process.,二、MPI编程实例演示,SPMD: Single Program Multiple Data(MIMD) :,#include mpi.h#include main( int argc, char *argv ) MPI_Init( ,#include mpi.h#inc

9、lude main( int argc, char *argv ) MPI_Init( ,#include mpi.h#include main( int argc, char *argv ) MPI_Init( ,#include mpi.h#include main( int argc, char *argv ) MPI_Init( ,Hello World!Hello World!Hello World!Hello World!,#include mpi.h#include main( int argc, char *argv ) MPI_Init( ,Hello是如何被执行的?,三、M

10、PI程序分析及编程入门,C必须包含mpi.h.MPI 函数返回出错代码或 MPI_SUCCESS成功标志.MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.MPI函数的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正.INOUT:参数在一些例程中为IN,而在另一些例程中为OUT.,C语言中MPI函数约定,三、MPI程序分析及编程入门,在写MPI程序时,我们通常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?,开始写MPI并行程序,三、MPI程序分析及编程入门,开始写MPI并行程序,MPI 提供

11、了下列函数来回答这些问题:用MPI_Comm_size 获得进程个数pint MPI_Comm_rank(MPI_Comm comm, int *rank);用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的IDint MPI_Comm_size(MPI_Comm comm, int *size);,三、MPI程序分析及编程入门,MPI基本函数,int MPI_Init (int*argc /* in/out */,char* argv /* in/out */)通常应该是第一个被调用的MPI函数除MPI_Initialized()外,

12、其余所有的MPI函数应该在其后被调用MPI系统将通过argc,argv得到命令行参数,三、MPI程序分析及编程入门,MPI基本函数,int MPI_Finalize (void) 退出MPI系统,所有进程正常退出都必须调用。表明并行代码的结束,结束除主进程外其它进程.串行代码仍可在主进程(rank = 0)上运行,但不能再有MPI函数(包括MPI_Init()),三、MPI程序分析及编程入门,MPI基本函数,int MPI_Comm_size (MPI_Comm comm /* in */,int* size /* out */)获得进程个数 size指定一个通信子,也指定了一组共享该空间的进

13、程, 这些进程组成该通信子的group.获得通信子comm中规定的group包含的进程的数量.,三、MPI程序分析及编程入门,MPI基本函数,int MPI_Comm_rank (MPI_Comm comm /* in */, int* rank /* out */)得到本进程在通信空间中的rank值,即在组中的逻辑编号(该rank值为0到p-1间的整数,相当于进程的ID)。,三、MPI程序分析及编程入门,MPI程序的基本结构,#include mpi.h. .int main(int argc, char *argv)int myrank, nprocs;MPI_Init(,三、MPI程序分

14、析及编程入门,更新的Hello World (c),#include #include mpi.hmain( int argc, char *argv ) int myid, numprocs; MPI_Init( ,三、MPI程序分析及编程入门,mpicc o hello1 hello1.cmpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4,更新后的的Hello World 的允许结果,三、MPI程序分析及编程入门,MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数确什么有限。下面是6个

15、最基本的MPI函数。MPI_Init();MPI_Comm_size();MPI_Comm_rank();MPI_Send();MPI_Recv();MPI_Finalize();,MPI_Init();并行代码;MPI_Fainalize();只能有串行代码;,最基本的MPI,三、MPI程序分析及编程入门,SPMD 编程模式:构成一个程序的所有进程运行的是同一份执行代码. 不同进程根据自己的序号可能执行该代码中的不同分支. MPI 编程中最常用的编程方式. 用户只需要编写、维护一份源代码.MPMD 编程模式:构成一个程序的不同进程运行不同的执行代码. 用户需要编写、维护多份源代码.主/从编程

16、模式:它是MPMD 编程模式的一个特例, 也是MPMD 编程模式中最常见的方式. 构成一个程序的进程之一负责所有进程间的协调及任务调度, 该进程称为主进程(Master), 其余进程称为从进程(Slave). 通常用户需要维护两份源代码.,MPI编程模式,三、MPI程序分析及编程入门,MPI程序设计方法,明确并行任务设计单个任务的串行程序所有任务的统一表示-SPMD并行程序,SPMD,三、MPI程序分析及编程入门,线程(Thread)进程 (Process)远程分布式主机 (Distributed Node)伪线程 (PseudoThread),Python并发编程四种方式,四、Pyhon并发

17、编程方式,多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外)。然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题。然而在python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,很多人会发现使用多线程来改进自己的Python代码后,程序的运行效率却下降了。实际上使用多线程的编程模型是很困难的,程序员很容易犯错,这并不是程序员的错误,因为我们大多数人的思维是串行(精神分裂不讨论),且冯诺依曼设计的计算机架构也是以顺

18、序执行为基础的。Python提供两组线程的接口,一组是thread模块,提供基础的,低等级(Low Level)接口,使用Function作为线程的运行体。还有一组是threading模块,提供更容易使用的基于对象的接口(类似于Java),可以继承Thread对象来实现线程,还提供了其它一些线程相关的对象,例如Timer,Lock。,线程(Thread),四、Pyhon并发编程方式,由于python的全局解释锁问题,Python下比较好的并行方式是使用多进程,这样可以非常有效的使用CPU资源,并实现真正意义上的并发。当然,进程的开销比线程要大,也就是说如果你要创建数量惊人的并发进程的话,需要考

19、虑一下你的机器是不是有一颗强大的心。由于线程共享相同的地址空间和内存,所以线程之间的通信是非常容易的,然而进程之间的通信就要复杂一些了。常见的进程间通信有:管道,消息队列,Socket接口(TCP/IP)等等。Python的mutliprocess模块提供了封装好的管道和队列,可以方便的在进程间传递消息。Python进程间的同步使用锁,这一点和线程是一样的。Python还提供了进程池Pool对象,可以方便管理和控制线程。python的mutliprocess模块和threading具有类似的接口。,线程(Thread),四、Pyhon并发编程方式,随着大数据时代的到临,摩尔定理在单机上似乎已经

20、失去了效果,数据的计算和处理需要分布式的计算机网络来运行,程序并行的运行在多个主机节点上,已经是现在的软件架构所必需考虑的问题。远程主机间的进程间通信有几种常见的方式(1)TCPIP:TCPIP是所有远程通信的基础,然而API比较低级别,使用起来比较繁琐,所以一般不会考虑(2)远程方法调用 Remote Function Call:RPC是早期的远程进程间通信的手段。Python下有一个开源的实现RPyC(3)远程对象Remote Object:远程对象是更高级别的封装,程序可以想操作本地对象一样去操作一个远程对象在本地的代理。远程对象最广为使用的规范CORBA,(4)消息队列 Message

21、 Queue:比起RPC或者远程对象,消息是一种更为灵活的通信手段,常见的支持Python接口的消息机制有,远程分布式主机(Distributed Node),四、Pyhon并发编程方式,还有一种并发手段并不常见,我们可以称之为伪线程,就是看上去像是线程,使用的接口类似线程接口,但是实际使用非线程的方式,对应的线程开销也不存在的。greenlet提供轻量级的coroutines来支持进程内的并发。,伪线程(PseudoThread),四、Pyhon并发编程方式,决定性能调优上限的两个定律:阿曼达定律和Gustafson定律;系统的性能遵循木桶原理,也就是整体性能是由系统中最短的那块板决定;整个

22、优化应该采用自上而下的方法,顺序一定不能乱。,并行调优需要注意的方面,五、并行计算优化,首先通过标准性能基准测试程序确保系统的工作状态正常, 比如使用SpecInt, SpecFP,Linpack等得到处理器的性能,对比设计性能指标,可以得知CPU是否工作正常,BIOS或者操作系统中的相关设置是否正确。使用Stream测试程序测试内存系统的性能,Netperf测试网络性能,Fio或者iozone等测试文件系统性能是否正常。在所有调优开始之前,一定要先把基础做好,一定要了解你的系统性能极限;再来是应用调优,可以调节运行环境,或者有代码的可以调整代码;最后才会到处理器级别的调优,这里是榨干最后一滴

23、性能的地方。,如何自上而下并行调优,五、并行计算优化,36/122,(一)硬件级:性能优化的方法有很多种,第一个叫硬件级调优,就是简单粗暴直接换掉性能低的硬件,比如网卡千兆换到万兆,硬盘从机械的换成SSD等等。很多时候这也不失为一个好办法。(二)运行级:所谓运行级调优,从运行环境上调整,通过监控整个系统的性能及各项指标看问题所在,然后看能不能通过一些运行参数的调整,比如说内存的使用率非常高,可以试试在操作系统中调整内存页的大小。如果是网络带宽压力特别大,可以试试将网络包的处理程序绑定在某一个核上面。对于网络小包特别多的情况,有一些网卡带包聚合功能,等很多小包会聚合到一定的程度,再统一处理,大量

24、减少中断数量,降低系统消耗。这些调整的成本很低,难点在于对技术人员要求很高,需要对整个系统非常熟。,并行计算系统性能调优方法分类,五、并行计算优化,(三)编译器级:编译器级调优,需要有代码,但是不修改代码,使用编译器的优化选项,有的时候也能够获得巨大的性能提高。比如引入自动向量化,深度优化,性能剖析指导的优化(PGO)等等。需要技术人员熟悉编译的使用,以及对优化过程的理解。(四)代码级:代码级调优就是直接改动实现代码,改代码收益或许非常大,比如换个算法,因为有的算法就是比别的算法快很多倍,甚至快几个数量级,但是修改的难度极其大,成本极高,代码改了以后正确性要重新验证,所有测试的步骤都要做。在原

25、有串行单线程程序中,如果有比较明显的计算密集型循环,可以引入OpenMPI进行并行化,结合编译器的自动向量化编译选项,可以只改极小一部分代码,获得比较大的性能收益。在性能调优中常用的一些关键指标:系统性能指标包括CPU利用率、内存使用率,swap分区、带宽使用率;处理器性能指标包括CPI、浮点运算的峰值、向量化比例、cache miss、DTLB miss等。,五、并行计算优化,并行计算系统性能调优方法分类,11.串行代码优化从以下几个角度分析:系统级:需要分析出性能控制因素,例如网速,利用率,负载均衡。如果CPU使用率不高且很稳定,则需要优化内存带宽,若CPU使用率忽上忽下,则需要考虑其他进

26、程占用CPU。当然,CPU大多时候空闲,说明没有很大程度上发挥硬件计算能力,或者,访问带宽太小,或者CPU在等待其他进程,线程释放资源等。应用级别:通常有编译选项,调用高性能库,去掉全局变量等;算法级:函数级,循环级,语句级,指令级。,代码级调优之串行代码优化,五、并行计算优化,CPU、GPU、TPU的区别,六、CPU/GPU/TPU概述,TPU张量处理器Tensor Processing Unit,CPU央处理器Central Processing Unit,GPU图形处理器Graphics Processing Unit,CPU vs GPU,六、CPU/GPU/TPU概述,什么类型的程序

27、适合在GPU上运行?,六、CPU/GPU/TPU概述,计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。满足以上两点,可以考虑采用GPU做运算。 不过需要先用CUDA或者Open CL 在GPU

28、上进行编程, 较为麻烦。 而且GPU的架构比较特殊,要想写出高效率的程序,需要进一步深入研究。,有关并行编程的部分参考书目,六、CPU/GPU/TPU概述,黄铠,徐志伟著,陆鑫达等译. 可扩展并行计算技术,结构与编程. 北京:机械工业出版社, P.3356,P.227237, 2000.陈国良著.并行计算结构、算法、编程. 北京:高等教育出版社,1999.Barry Wilkinson and Michael Allen. Parallel Programming(Techniques and Applications using Networked Workstations and Parallel Computers). Prentice Hall, 1999.李晓梅,莫则尧等著. 可扩展并行算法的设计与分析. 北京:国防工业出版社,2000.张宝琳,谷同祥等著. 数值并行计算原理与方法. 北京:国防工业出版社,1999.都志辉著. 高性能计算之并行编程技术MPI并行程序设计. 北京:清华大学出版社, 2001.,THANKS,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号