高性能计算之并行编程技术

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

高性能计算之并行编程技术报告人:单位:E-Mail:2017年6月9日周兆永网络与教育技术中心yzz@nwsuaf.edu.cn六、CPU/GPU/TPU概述一、并行编程基础知识五、行计算优化四、Python并发编程方式三、MPI程序分析及编程入门二、MPI编程实例演示提纲一、并行编程基础知识节点(node):–每个节点由多个处理器构成,可以直接输入输出互联网络(interconnectnetwork):–所有节点通过互联网络相互连接通信。内存(memory):–内存由多个存储模块组成,这些模块或者与节点对称地分布在互联网络的两侧,或者位于各个节点的内部并行计算机组成部分内存模块位于节点内部并行计算机体系结构内存模块与节点分离一、并行编程基础知识一、并行编程基础知识一、并行编程基础知识程序:实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合,或者称之为:算法+数据结构。进程:可并发执行的程序在一个数据集合上的运行过程。进程是程序的一次执行;进程可以是和别的计算并发执行的计算;进程可以定义为一个数据结构及其能在其上进行操作的一个程序;进程是一个程序及其数据在处理机上顺序执行时所发生的活动;进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。线程:线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和堆栈),但他与同属于一个进程中的其他线程共享进程所拥有的全部资源。两个重要概念:进程与线程一、并行编程基础知识并行编程通常是指软件代码,它促进在同一时间执行多个计算任务的性能。Forexample:操场上有20个滑梯而不是一个。孩子们不必排队等待轮到自己,因为他们可以同时玩。使用电脑鼠标,一边听音乐,一边写毕业论文,同时对个人电脑做病毒扫描,这唯一的理由就是并发编程。在这种情况下,它的多重任务允许多个程序或进程访问CPU而没有等待。这一设置允许使用多任务共享的资源进行密集的I/O处理和有效的信号处理。并发性也可以通过实施多个计算线程发生(通常采用交错启动和完成点)。这叫做多线程,并且它发生在一个单一的进程或程序中。这就是为什么你可以打印一个文档,同时继续编辑另一个文档。如果没有多线程,UI会太慢,因为系统将无法在同一时间应对多个用户操作。并行编程概述一、并行编程基础知识并行编程模式,主要指并行编程时,程序员将程序各模块并行执行时,模块间的通信方式,目前并行编程模式主要包括以下三种:共享内存:共享内存是进程间传递数据的一种高效方法。在共享内存模型中,并行进程共享一个进行异步读取的全局地址空间。异步并发访问可能导致条件竞争,因此需要同步机制来避免条件竞争,这些机制包括锁,信号量,管程(monitor)。传统的多核处理器是直接支持共享内存的,所以导致很多利用该特性的语言和库出现,以OpenMP为代表;消息传递:在消息传递模型中,并行进程是通过消息传递来交换数据的。这些通信可以是异步的,即消息可以在接收者做好准备前发送,也可以是同步的,即只有接受者准备好接收消息时才能发送。消息传递的CSP(Communicatingsequentialprocesses)模型使用同步通信channel来连接进程,以MPI,PVM为代表;数据并行模式:数据并行化关注在数据集上执行的操作。一组任务对数据集进行运算,但是会对不同的分区进行运算,以Fortran为代表。并行编程模式一、并行编程基础知识MassagePassingInterface:是消息传递函数库的标准规范;由MPI论坛开发.支持Fortran、C和C++;一种新的库描述,不是一种语言。什么是MPI?消息传递并行程序设计–用户必须通过显式地发送和接收消息来实现处理机间的数据交换。–每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。–这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法–由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式一、并行编程基础知识•下面我们以C语言的形式给出一个最简单的MPI并行程序Hello(下页).•该程序在终端打印出HelloWorld!字样.•“HelloWorld”:一声来自新生儿的问候.二、MPI编程实例演示从简单入手!Helloworld(C)#includestdio.h#includempi.h“main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}二、MPI编程实例演示Helloworld(Fortran)二、MPI编程实例演示programmaininclude‘mpif.h’integerierrcallMPI_INIT(ierr)print*,'Hello,world!'callMPI_FINALIZE(ierr)endMPI程序的的编译与运行•mpicc–ohellohello.c–生成hello的可执行代码.•mpirun–np4hello–4指定np的实参,表示进程数,由用户指定.–hello要运行的MPI并行程序.%小写o%np:Thenumberofprocess.二、MPI编程实例演示•SPMD:SingleProgramMultipleData(MIMD)::::#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}HelloWorld!HelloWorld!HelloWorld!HelloWorld!#includempi.h#includestdio.hmain(intargc,char*argv[]){MPI_Init(&argc,&argv);printf(Hello,world!\n);MPI_Finalize();}Hello是如何被执行的?三、MPI程序分析及编程入门•C–必须包含mpi.h.–MPI函数返回出错代码或MPI_SUCCESS成功标志.–MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.•MPI函数的参数被标志为以下三种类型:–IN:参数在例程的调用中不会被修正.–OUT:参数在例程的调用中可能会被修正.–INOUT:参数在一些例程中为IN,而在另一些例程中为OUT.C语言中MPI函数约定三、MPI程序分析及编程入门•在写MPI程序时,我们通常需要知道以下两个问题的答案:–任务由多少个进程来进行并行计算?–我是哪一个进程?开始写MPI并行程序三、MPI程序分析及编程入门开始写MPI并行程序•MPI提供了下列函数来回答这些问题:–用MPI_Comm_size获得进程个数pintMPI_Comm_rank(MPI_Commcomm,int*rank);–用MPI_Comm_rank获得进程的一个叫rank的值,该rank值为0到p-1间的整数,相当于进程的IDintMPI_Comm_size(MPI_Commcomm,int*size);三、MPI程序分析及编程入门MPI基本函数•intMPI_Init(int*argc/*in/out*/,char**argv[]/*in/out*/)–通常应该是第一个被调用的MPI函数–除MPI_Initialized()外,其余所有的MPI函数应该在其后被调用–MPI系统将通过argc,argv得到命令行参数三、MPI程序分析及编程入门MPI基本函数•intMPI_Finalize(void)–退出MPI系统,所有进程正常退出都必须调用。表明并行代码的结束,结束除主进程外其它进程.–串行代码仍可在主进程(rank=0)上运行,但不能再有MPI函数(包括MPI_Init())三、MPI程序分析及编程入门MPI基本函数•intMPI_Comm_size(MPI_Commcomm/*in*/,int*size/*out*/)–获得进程个数size–指定一个通信子,也指定了一组共享该空间的进程,这些进程组成该通信子的group.–获得通信子comm中规定的group包含的进程的数量.三、MPI程序分析及编程入门MPI基本函数•intMPI_Comm_rank(MPI_Commcomm/*in*/,int*rank/*out*/)–得到本进程在通信空间中的rank值,即在组中的逻辑编号(该rank值为0到p-1间的整数,相当于进程的ID)。三、MPI程序分析及编程入门MPI程序的基本结构#includempi.h......intmain(intargc,char*argv[]){intmyrank,nprocs;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&nprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myrank);......MPI_Finalize();}三、MPI程序分析及编程入门更新的HelloWorld(c)#includestdio.h#includempi.hmain(intargc,char*argv[]){intmyid,numprocs;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);printf(“Iam%dof%d\n,myid,numprocs);MPI_Finalize();}三、MPI程序分析及编程入门•mpicc–ohello1hello1.c•mpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4更新后的的HelloWorld的允许结果三、MPI程序分析及编程入门MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数确什么有限。下面是6个最基本的MPI函数。1.MPI_Init(…);2.MPI_Comm_size(…);3.MPI_Comm_rank(…);4.MPI_Send(…);5.MPI_Recv(…);6.MPI_Finalize();MPI_Init(…);…并行代码;…MPI_Fainalize();只能有串行代码;最基本的MPI三、MPI程序分析及编程入门•SPMD编程模式:构成一个程序的所有进程运行的是同一份执行代码.不同进程根据自己的序号可能执行该代码中的不同分支.MPI编程中最常用的编程方式.用户只需要编写、维护一份源代码.•MPMD编程模式:构成一个程序的不同进程运行不同的执行代码

1 / 43
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功