OpenMP简介

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

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

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

资源描述

OpenMP的介绍与使用什么是openmp?Openmp常用指令的用法openmp的实例目录一、什么是openmp?1.面向共享内存以及分布式共享内存的多处理器多线程并行编程的一种编译指导语句,是能够显式指导多线程、共享内存并行的应用程序编程接口。OpenMP支持的编程语言包括C语言、C++和Fortran;OpenMp提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化。Fork-Join执行模式在开始执行的时候,只有主线程的运行线程存在主线程在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork,创建新线程或者唤醒已有线程)线程来执行并行任务在并行执行的时候,主线程和派生线程共同工作在并行代码结束执行后,派生线程退出或者挂起,不再工作,控制流程回到单独的主线程中(Join,即多线程的会和)。OpenMP的功能由两种形式提供:1)编译指导语句在编译器编译程序的时候,会识别特定的注解,这些注解包含openmp的一些语义。在无法识别OpenMP语义的普通编译器中,这些注释被忽略2)运行时库函数OpenMP运行时函数库原本用以设置和获取执行环境相关的信息,它们当中也包含一系列用以同步的API。OpenMP头文件omp.h二、Openmp的常用指令的用法在编译器编译程序的时候,会识别特定的注释,这些注释就包含着OpenMP程序的一些语义#pragmaomp指令[子句[子句]…]前面提到的parallelfor就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如:#pragmaompparallelnum_threads(n)parallel就是指令,num_threads是子句parallel指令的用法parallel是用来构造一个并行块的,也可以使用其他指令如for、sections等和它配合使用。#pragmaompparallel[for|sections][子句[子句]…]{//代码}for指令的使用方法for指令则是用来将一个for循环分配到多个线程中执行,一般可以和parallel指令合起来形成parallelfor指令使用,也可以单独用在parallel语句的并行块中。#pragmaomp[parallel]for[子句]for循环语句例:for循环并行化的约束条件1.for循环中的循环变量必须是有符号整形。例如,for(unsignedinti=0;i10;++i){}会编译不通过;2.for循环中比较操作符必须是,=,,=。例如for(inti=0;i!=10;++i){}会编译不通过;3.如果for循环中的比较操作为或=,那么循环变量只能增加;反之亦然。例如for(inti=0;i=10;--i)会编译不通过;5.循环必须是单入口、单出口,也就是说循环内部不允许能够达到循环以外的跳转语句,exit除外。异常的处理也必须在循环体内处理。例如:若循环体内的break或goto会跳转到循环体外,那么会编译不通过。4.for循环中的三个表达式,必须按照严格的书写规范,只能有一个变量。例如for(inti=0,j=0;i=10;i++){}会编译不通过;sections和section指令的用法section语句是用在sections语句里,用来将sections语句里的代码划分成几个不同的段,每段都并行执行。#pragmaomp[parallel]sections[子句]{#pragmaompsection{代码块}}用for语句来分摊是由系统自动进行,只要每次循环间没有时间上的差距,那么分摊是很均匀的,使用section来划分线程是一种手工划分线程的方式,最终并行性的好坏得依赖于程序员。OpenMP中的线程任务调度OpenMP中任务调度主要针对并行的for循环,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代,则可能会造成各个线程计算负载的不平衡,影响程序的整体性能。OpenMP提供了schedule子句来实现任务的调度。schedule子句schedule(type,size),参数type是指调度的类型,可以取值为static,dynamic,guided三种值。参数size表示每次调度的迭代数量,必须是整数。该参数是可选的。1.静态调度staticstatic在编译的时候就已经确定了,那些循环由哪些线程执行。当不使用size时,将给每个线程分配┌N/t┐个迭代。当使用size时,将每次给线程分配size次迭代。在四核机器上执行:(1)当不使用参数时,100/4=25,0-24由1号线程执行;25-49由2号线程执行;50-74由3号线程执行;75-99由4号线程执行(2)当使用参数时,x(x=0,1,2,3)线程执行((n/5)%4)任务。其中n=0-99。2.动态调度dynamic动态调度依赖于运行时的状态动态确定线程所执行的迭代,也就是线程执行完已经分配的任务后,会去领取还有的任务。由于线程启动和执行完的时间不确定,所以迭代被分配到哪个线程是无法事先知道的。当不使用size时,是将迭代逐个地分配到各个线程。当使用size时,逐个分配size个迭代给各个线程。3.启发式调度guided采用启发式调度方法进行调度,每次分配给线程迭代次数不同,开始比较大,以后逐渐减小。size表示每次分配的迭代次数的最小值,由于每次分配的迭代次数会逐渐减少,少到size时,将不再减少。如果不知道size的大小,那么默认size为1,即一直减少到1。具体采用哪一种启发式算法,需要参考具体的编译器和相关手册的信息。控制数据的共享属性1、OpenMP程序在同一个共享内存空间上执行,可以任意使用这个共享内存空间上的变量进行线程间的数据传递2、OpenMP还允许线程保留自己的私有变量不能让其他线程访问intg=8;voidfunb(int*x,int*y,intz){staticintsv;intu;u=(*y)*g;*x=u+z;}voidfuna(int*a,intn){inti;intcc=9;#pragmaompparallelforfor(i=0;in;i++){inttemp=cc;funb(&a[i],&temp,i);}}线程私有数据与threadprivate,copyin子句对于每一个线程来说,可能需要生成自己私有的线程数据,此时,就需要使用threadprivate子句用来标明某一个变量是线程私有数据,在程序运行的过程中,不能够被其它线程访问到。执行过程最后结果都为:而如果将含有注释的那一行删除,就将全局变量counter变为共享,执行可能的结果:对于所有的线程私有全局变量来说,除了主线程,其它线程的私有变量在运行过程中是没有初始化的,为了使用主线程的变量初始化的值,我们使用copyin子句对线程私有的全局变量进行初始化。线程私有数据与threadprivate,copyin子句并行区域编程并行区域之间的工作共享:1、工作队列工作队列的基本工作过程即维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止。2、根据线程号分配任务由于每一个线程在执行的过程中的线程标识号是不同的,可以根据这个线程标识号来分配不同的任务#pragmaompparallelprivate(myid){nthreads=omp_get_num_threads();myid=omp_get_thread_num();my_work_done(myid,nthreads);}三、openmp的实例串行程序并行程序串行和并行的比较次数串行并行10.2131160.06436120.2094570.07222430.1984490.05011440.2099830.06673750.2214920.05956460.2066440.06533470.2030560.06859680.2197430.04997890.2071670.061647100.2162800.070892平均值0.2105370.062944700.050.10.150.20.2512345678910串行并行openmp的实例:求十万内的素数和一个线程两个线程四个线程六个线程八个线程11.5133991.1892980.7078430.5402350.58790821.595291.1920110.6840930.5449890.58790831.5415781.162060.680020.5432080.587908平均值1.5500891.1811230.6906520.5428110.556987加速比11.3123852.2443852.8556712.784354并行效率10.6561930.5610960.4759450.34794200.511.522.532468加速比效率Openmp多线程应用程序性能分析影响性能的主要因素:根据Amdahl定律,我们应当努力提高并行化代码在应用程序中的比率,这是通用的提高效率的方法。1、OpenMP本身的开销:并行化需要一定的程序库的支持,库中代码的运行必然会带来一定的开销。2、负载均衡:各个线程之间的负载不均衡,就有可能造成某些线程在执行过程中无事可干,经常处于空闲状态;而另外一些线程则负担沉重,需要很长时间才能够完成任务。在OpenMP的运行时以及环境变量中对负载均衡的需求有一定的支持,例如可以划分执行的粒度,并通过动态调度的方法消除一定的负载均衡问题。3、线程同步带来的开销:多个线程在进行同步的时候必然带来一定的同步开销。考虑同步的必要性,消除不必要的同步,或者调整同步的顺序,就有可能带来性能上的提升。Openmp与mpi比较MPI是多主机联网协作进行并行计算,它是使用进程间通信的方式协调并算的一个标准,也可用于单主机多核/多CPU的并行计行计算。mpiopenmp一1.3994231.550089二1.3589851.181123四0.8556270.690652八0.7280920.55687700.20.40.60.811.21.41.61.8一二四八mpiopenmp

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

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

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

×
保存成功