OpenMP并行程序设计.ppt_第1页
OpenMP并行程序设计.ppt_第2页
OpenMP并行程序设计.ppt_第3页
OpenMP并行程序设计.ppt_第4页
OpenMP并行程序设计.ppt_第5页
已阅读5页,还剩48页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OpenMP并行程序设计简介,华南理工大学陈虎博士tommychen74,OpenMP概述,OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型:包含编译制导(CompilerDirective),运行库例程(RuntimeLibrary)和环境变量(EnvironmentVariables)支持增量并行化(IncrementalParallelization),OpenMP历史,1994年,第一个ANSIX3H5草案提出,被否决1997年,OpenMP标准规范代替原先被否决的ANSIX3H5,被人们认可1997年10月公布了与Fortran语言捆绑的第一个标准规范FORTRANversion1.01998年11月9日公布了支持C和C+的标准规范C/C+version1.02000年11月推出FORTRANversion2.02002年3月推出C/C+version2.02005年5月OpenMP2.5将原来的Fortran和C/C+标准规范相结合,OpenMP的优势,缺点,优势:相对简单。不需要显式设置互斥锁,条件变量,数据范围以及初始化。可扩展。主要是利用添加并行化指令到顺序程序中,由编译器完成自动并行化。移植性好。OpenMP规范中定义的制导指令、运行库和环境变量,能够使用户在保证程序的可移植性的前提下,按照标准将已有的串行程序逐步并行化,可以在不同的产商提供的共享存储体系结构间比较容易地移植。,OpenMP的优势,缺点,缺点:程序的可维护性不够好当程序比较复杂的时候,编程会显得比较困难,OpenMP的支持环境,Intel等的C+和Fortran编译器Microsoft的VisualStudio2005gcc4.2以上版本也宣布对其支持(尚未正式发布),OpenMP并行程序运行,并行区间(淡蓝色)表示该部分程序计算量大,需要多个处理器共同来处理以提高效率和运行速度并行区间以外的部分表示该部分的程序不适宜或者不能并行执行,只能由一个处理器来执行,OpenMP并行编程模型,OpenMP并行编程模型,基于线程的并行编程模型(ProgrammingModel)OpenMP使用Fork-Join并行执行模型,OpenMP程序设计,include#include“omp.h”Intmain()#pragmaompparallelPrintf(“helloworld!n”);,程序的输出结果:helloworld!helloworld!helloworld!,OpenMP程序结构,基于c/c+语言的OpenMP程序的结构#includemain()intvar1,var2,var3;/*Serialcode*/*Beginningofparallelsection.Forkateamofthreads*/*Specifyvariablescoping*/#pragmaompparallelprivate(var1,var2)shared(var3)/*Parallelsectionexecutedbyallthreads*/*Allthreadsjoinmasterthreadanddisband*/*Resumeserialcode*/,编译制导,OpenMP的#pragma语句的格式为#pragmaompdirective_name,编译制导,作用域静态扩展文本代码在一个编译制导语句之后,被封装到一个结构块中孤立语句一个OpenMP的编译制导语句不依赖于其它的语句动态扩展包括静态范围和孤立语句,作用域,并行域结构,并行域中的代码被所有的线程执行具体格式#pragmaompparallelclause,clausenewlineclause=if(scalar-expression)private(list)firstprivate(list)default(shared|none)shared(list)copyin(list)reduction(operator:list)num_threads(integer-expression),共享任务结构,共享任务结构将它所包含的代码划分给线程组的各成员来执行并行for循环并行sections串行执行,for编译制导语句,for语句指定紧随它的循环语句必须由线程组并行执行;语句格式#pragmaompforclause,clausenewlineclause=Schedule(type,chunk)orderedprivate(list)firstprivate(list)lastprivate(list)shared(list)reduction(operator:list)nowait,for编译制导语句,schedule子句描述如何将循环的迭代划分给线程组中的线程如果没有指定chunk大小,迭代会尽可能的平均分配给每个线程type为static,循环被分成大小为chunk的块,静态分配给线程type为dynamic,循环被动态划分为大小为chunk的块,动态分配给线程,Sections编译制导语句,sections编译制导语句指定内部的代码被划分给线程组中的各线程不同的section由不同的线程执行Section语句格式:#pragmaompsectionsclause,clausenewline#pragmaompsectionnewline#pragmaompsectionnewline,Sections编译制导语句,clause=private(list)firstprivate(list)lastprivate(list)reduction(operator:list)nowait在sections语句结束处有一个隐含的路障,使用了nowait子句除外,Sections编译制导语句,#include/eg2#defineN1000intmain()inti;floataN,bN,cN;/*Someinitializations*/for(i=0;iN;i+)ai=bi=i*1.0;#pragmaompparallelshared(a,b,c)private(i)#pragmaompsectionsnowait#pragmaompsectionfor(i=0;iN/2;i+)ci=ai+bi;#pragmaompsectionfor(i=N/2;iN;i+)ci=ai+bi;/*endofsections*/*endofparallelsection*/,single编译制导语句,single编译制导语句指定内部代码只有线程组中的一个线程执行。线程组中没有执行single语句的线程会一直等待代码块的结束,使用nowait子句除外语句格式:#pragmaompsingleclause,clausenewlineclause=private(list)firstprivate(list)nowait,组合的并行共享任务结构,parallelfor编译制导语句parallelsections编译制导语句,同步结构,master制导语句critical制导语句barrier制导语句atomic制导语句flush制导语句ordered制导语句,master制导语句,master制导语句指定代码段只有主线程执行语句格式#pragmaompmasternewline,critical制导语句,critical制导语句表明域中的代码一次只能执行一个线程其他线程被阻塞在临界区语句格式:#pragmaompcriticalnamenewline,critical制导语句,#includemain()intx;x=0;#pragmaompparallelshared(x)#pragmaompcriticalx=x+1;/*endofparallelsection*/,barrier制导语句,barrier制导语句用来同步一个线程组中所有的线程先到达的线程在此阻塞,等待其他线程barrier语句最小代码必须是一个结构化的块语句格式#pragmaompbarriernewline,barrier制导语句,barrier正确与错误使用比较,atomic制导语句,atomic制导语句指定特定的存储单元将被原子更新语句格式#pragmaompatomicnewlineatomic使用的格式,flush制导语句,flush制导语句用以标识一个同步点,用以确保所有的线程看到一致的存储器视图语句格式#pragmaompflush(list)newlineflush将在下面几种情形下隐含运行,nowait子句除外,barriercritical:进入与退出部分ordered:进入与退出部分parallel:退出部分for:退出部分sections:退出部分single:退出部分,ordered制导语句,ordered制导语句指出其所包含循环的执行任何时候只能有一个线程执行被ordered所限定部分只能出现在for或者parallelfor语句的动态范围中语句格式:#pragmaomporderednewline,threadprivate编译制导语句,threadprivate语句使一个全局文件作用域的变量在并行域内变成每个线程私有每个线程对该变量复制一份私有拷贝语句格式:#pragmaompthreadprivate(list)newline,threadprivate编译制导语句,intalpha10,beta10,i;/eg3#pragmaompthreadprivate(alpha)intmain()/*Firstparallelregion*/#pragmaompparallelprivate(i,beta)for(i=0;i10;i+)alphai=betai=i;/*Secondparallelregion*/#pragmaompparallelprintf(alpha3=%dandbeta3=%dn,alpha3,beta3);,数据域属性子句,变量作用域范围数据域属性子句private子句shared子句default子句firstprivate子句lastprivate子句copyin子句reduction子句,private子句,private子句表示它列出的变量对于每个线程是局部的。语句格式private(list)private和threadprivate区别,shared子句,shared子句表示它所列出的变量被线程组中所有的线程共享所有线程都能对它进行读写访问语句格式shared(list),default子句,default子句让用户自行规定在一个并行域的静态范围中所定义的变量的缺省作用范围语句格式default(shared|none),firstprivate子句,firstprivate子句是private子句的超集对变量做原子初始化语句格式:firstprivate(list),lastprivate子句,lastprivate子句是private子句的超集将变量从最后的循环迭代或段复制给原始的变量语句格式lastprivate(list),copyin子句,copyin子句用来为线程组中所有线程的threadprivate变量赋相同的值主线程该变量的值作为初始值语句格式copyin(list),reduction子句,reduction子句使用指定的操作对其列表中出现的变量进行规约初始时,每个线程都保留一份私有拷贝在结构尾部根据指定的操作对线程中的相应变量进行规约,并更新该变量的全局值语句格式reduction(operator:list),reduction子句,#include/eg4intmain()inti,n,chunk;floata100,b100,result;/*Someinitializations*/n=100;chunk=10;result=0.0;for(i=0;in;i+)ai=i*1.0;bi=i*2.0;,#pragmaompparallelfordefault(shared)private(i)schedule(static,chunk)reduction(+:result)for(i=0;in;i+)result=result+(ai*bi);printf(Finalresult=%fn,result);,reduction子句,Reduction子句的格式,x=xopexprx=expropx(exceptsubtraction)xbinop=exprx+xx-x,x是一个标量expr是一个不含对x引用的标量表达式,且不被重载binop是+,*,-,/,doublestep;voidmain()inti;doublex,pi,sum=0.0;step=1.0/(double)num_steps;for(i=0;inum_steps;i+)x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);pi=step*sum;,OpenMP计算实例,#includestaticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain()inti;doublex,pi,sumNUM_THREADS;step=1.0/(double)num_steps;omp_set_num_threads(NUM_THREADS);#pragmaompparalleldoublex;intid=omp_get_thread_num();for(i=id,sumid=0.0;inum_steps;i=i+NUM_THREADS)x=(i+0.5)*step;sumid+=4.0/(1.0+x*x);for(i=0,pi=0.0;iNUM_THREADS;i+)pi+=sumi*step;,使用共享任务结构,#includestaticlongnum_steps=100000;doublestep;#defineNUM_THREADS2voidmain()inti;doublex,pi,sumNUM_THREADS;step=1.0/(double)num_steps;omp_set_num_threads(NUM_THREADS);#pragmaompparalleldoublex;intid;id=omp_get_thread_num();sumid=0;/*#pragmaompfor/*for(i=0;inum_steps;i+)x=(i+0.5)*step;sumid+=4.0/(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论