第5A章OpenMP并行程序设计-2010_第1页
第5A章OpenMP并行程序设计-2010_第2页
第5A章OpenMP并行程序设计-2010_第3页
第5A章OpenMP并行程序设计-2010_第4页
第5A章OpenMP并行程序设计-2010_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

1、多媒体技术 2010 西安交通大学 新型计算机研究所1n5.1 多核技术n5.2 并行编程模型n5.3 OpenMP并行程序设计多媒体技术 2010 西安交通大学 新型计算机研究所n处理器的频率u以前是处理器性能的唯一标尺u在摩尔定律指引下保持高速发展CPU速度每18个月提高一倍而价格下降为原来的二分之一n主频提高遭遇瓶颈u由于晶体管数量倍增,会导致硅芯片所需要的电能、耗费功率大幅提升,甚至成几何级数的增加 n3GHz成为了无法逾越的一道坎uIntel发布3.8GHz的产品,宣布停止4GHz的产品计划uAMD频率超过2GHz以后无法大幅度提升CPU可以煎蛋?CPU功耗增长多媒体技术 2010

2、西安交通大学 新型计算机研究所n高端的RISC处理器中u在上个世纪末,HP和IBM已经提出双核处理器的可行性设计,成功推出了拥有双内核的HP PA8800和IBM Power4处理器uSun在2003年10月微处理器论坛中,发表双核心UltraSPARC处理器n x86平台 uAMD和Intel在2004年公布了各自的双核计划uAMD率先在服务器和工作站领域引入双核架构uIntel率先在台式机领域引入双核技术! 多媒体技术 2010 西安交通大学 新型计算机研究所多媒体技术 2010 西安交通大学 新型计算机研究所n多核u片上多处理器CMP(Chip Multiprocessor)u在一块硅晶

3、片上,集成多个计算核心u每个计算核心都是一个完整而独立的计算单体u核之间通过特定的硅晶片内通信方式互连例如总线、共享缓存u考虑多个处理核之间的功能分工、通信方式、存储层次和制造工艺等约束nCMP最早出现在1991年的Datawave结构中u设计可并行的处理器来解决视频处理中的大量数据计算n根据处理器中各个核类型的不同,多核芯片可以分为u同构多核体系(Homogeneous CMP)u异构多核体系(Heterogeneous CMP)多媒体技术 2010 西安交通大学 新型计算机研究所n前端总线(FSB)u总线频率,CPU与内存直接数据交换速度u数据传输最大带宽取决于所有同时传输的数据的宽度和传

4、输频率u前端总线的速度指的是数据传输的速度nCPU的位和字长u字长CPU在单位时间内(同一时间)能一次处理的二进制数的位数目前主流是32位,也有64、128位u字节和字长的区别8位称为一个字节字长的长度是不固定的对于不同的CPU、字长的长度也不一样多媒体技术 2010 西安交通大学 新型计算机研究所n内存是非常慢的期间,需要缓存(cache)加速nL1 Cache(一级缓存)uCPU第一层高速缓存u可分为数据缓存和指令缓存nL2 Cache(二级缓存)nL3 Cache(三级缓存)u一般用于服务器多媒体技术 2010 西安交通大学 新型计算机研究所多媒体技术 2010 西安交通大学 新型计算机

5、研究所n左图:每二核共享二级缓存n右图:四核共享二级缓存多媒体技术 2010 西安交通大学 新型计算机研究所n双核甚至多核处理器需要多线程化n大多数应用用C或C+编写的n根据单线程设计n多线程优化u需要耗费大量劳动力的改写过程u重头再来n多核迫使软件开发朝并行化方向发展nRISC架构的多核系统上已经形成了比较成熟的多线程系统并行处理能力n在x86架构下,应用程序的开发者还停留在单线程的开发模式下。多媒体技术 2010 西安交通大学 新型计算机研究所n程序是否具备扩展性n程序能否更精确n产品是否易于编程和维护n并行开发模式u打破串行的编程过程“一步一步”的模式u首先要进行分析和拆解u然后才能进行

6、程序的编写n程序设计并行规划u为双核,四核、八核、十六核等更多核芯规模开发n针对多核的开发过程与传统的开发模式的不同u需要性能优化工具多媒体技术 2010 西安交通大学 新型计算机研究所n现状u科学计算部分程序员可以进行并行编程,大部分程序是MPI程序,OpenMP也有一定比例u服务器服务器程序大部分采用多线程(PThread, Java Thread或Win32 Threads )模型u桌面系统除少数应用(图像处理,3D制作)外,大部分程序是串行程序多媒体技术 2010 西安交通大学 新型计算机研究所n多内核处理器所带来的变化u科学计算MPI程序可以在多内核系统上直接执行(优化MPI)Ope

7、nMP将更加流行如何同时支持多内核共享内存系统和集群系统?u服务器原有的多线程程序可以直接执行u桌面系统OpenMP对于大多数桌面系统程序员来说过于复杂,对新的高效并行程序设计语言有强烈需求多媒体技术 2010 西安交通大学 新型计算机研究所n广义的自动并行化,指开发人员无需考虑并行性,仅设计串行程序,由软件或硬件系统自动将串行程序转换为并行程序u编译器辅助的自动并行化u硬件推测执行u并行库多媒体技术 2010 西安交通大学 新型计算机研究所n编译器辅助的自动并行化u自动向量化很成功u线程级的自动并行化效果不够理想4处理器的SMP系统上平均加速比30%u多内核处理器系统的出现降低了对自动并行化

8、技术的期望,4 core 30%可以接受(没有其它编译优化可以提高30%的性能)n并行库uINTEL MKL,SCALAPACK,PNL等,将优化算法在函数库中实现u应用范围依然有限多媒体技术 2010 西安交通大学 新型计算机研究所n可以在多核平台上实现真正的并行。n在各个核上可以实现并发。多媒体技术 2010 西安交通大学 新型计算机研究所nAll processors have access to one global memorynAll processors share the same address space nThe system runs a single copy of

9、the OSnProcessors communicate by reading/writing to the global memorynExamples: multiprocessor PCs (Intel P4), Sun Fire 15K, NEC SX-7, Fujitsu PrimePower, IBM p690, SGI Origin 3000.多媒体技术 2010 西安交通大学 新型计算机研究所OpenMPPthreads多媒体技术 2010 西安交通大学 新型计算机研究所ProcessorMProcessorMProcessorM Interconnect MPI HPF多媒

10、体技术 2010 西安交通大学 新型计算机研究所 MPI hybrid MPI + OpenMP多媒体技术 2010 西安交通大学 新型计算机研究所u显式线程(Explicit threading)微软Windows线程API, Pthreads, Java线程类等。u利用编译器指导(Compiler-directed)自动并行, OpenMP, Intel Threading Building Blocks等u利用并行数学库(Parallel math libraries)Intel IPP/MKL, ScaLAPACK, PARDISO, PLAPACKu并行程序语言 有150种以上u消息

11、传递(Message passing)MPI, OpenMP, PVM,等等。多媒体技术 2010 西安交通大学 新型计算机研究所VTune Performance AnalyzerIntel Performance libraries: IPP and MKLOpenMP* (Intel Compiler)Explicit threading (Win32*, Pthreads*)Intel Thread CheckerIntel DebuggerIntel Thread ProfilerVTune Performance AnalyzerParallel ComputingWhat is

12、it?lParallel computing is when a program uses concurrency to either:udecrease the runtime for the solution to a problem.uIncrease the size of the problem that can be solved.Parallel Computing gives you more performance to throw at your problems.Parallel Computing: Writing a parallel application.Orig

13、inal ProblemTasks, shared and local dataDecompose into tasks Code with a parallel Prog. Env.Corresponding source codeProgram SPMD_Emb_Par () TYPE *tmp, *func(); global_array Data(TYPE); global_array Res(TYPE); int N = get_num_procs(); int id = get_proc_id(); if (id=0) setup_problem(N,DATA); for (int

14、 I= 0; IN;I=I+Num) tmp = func(I); Res.accumulate( tmp); Program SPMD_Emb_Par () TYPE *tmp, *func(); global_array Data(TYPE); global_array Res(TYPE); int N = get_num_procs(); int id = get_proc_id(); if (id=0) setup_problem(N,DATA); for (int I= 0; IN;I=I+Num) tmp = func(I); Res.accumulate( tmp); Progr

15、am SPMD_Emb_Par () TYPE *tmp, *func(); global_array Data(TYPE); global_array Res(TYPE); int N = get_num_procs(); int id = get_proc_id(); if (id=0) setup_problem(N,DATA); for (int I= 0; IN;I=I+Num) tmp = func(I); Res.accumulate( tmp); Program SPMD_Emb_Par () TYPE *tmp, *func(); global_array Data(TYPE

16、); global_array Res(TYPE); int Num = get_num_procs(); int id = get_proc_id(); if (id=0) setup_problem(N, Data); for (int I= ID; IN;I=I+Num) tmp = func(I, Data); Res.accumulate( tmp); Group onto execution units.Units of execution + new shared data for extracted dependenciesParallel Computing: Effecti

17、ve Standards for Portable programminglThread LibrariesWin32 APIPOSIX threads.lCompiler DirectivesOpenMP - portable shared memory parallelism.lMessage Passing LibrariesMPI Our focus多媒体技术 2010 西安交通大学 新型计算机研究所n面向共享存储体系结构。n基于fork-join的多线程执行模型,但同样也可以开发SPMD类型的程序。n主要采用指导语句的方式。n可以进行增量式并行开发,支持条件编译核条件并行。OpenM

18、P Overview: Programming ModelFork-Join Parallelism: uMaster thread spawns a team of threads as needed.uParallelism is added incrementally: i.e. the sequential program evolves into a parallel program.Parallel RegionsMaster ThreadOpenMP Overview:How is OpenMP typically used? (in C)lOpenMP is usually u

19、sed to parallelize loops:Find your most time consuming loops.Split them up between threads.void main() double Res1000; for(int i=0;i1000;i+) do_huge_comp(Resi); #include “omp.h”void main() double Res1000;#pragma omp parallel for for(int i=0;i1000;i+) do_huge_comp(Resi); Split-up this loop between mu

20、ltiple threadsParallel ProgramSequential Program多媒体技术 2010 西安交通大学 新型计算机研究所n提供一种快捷简单的多线程编程方法n形成于1997年,是一种应用程序接口n对编程人员:u无需进行复杂的线程创建、同步、负载平衡和销毁工作。u只需要认真考虑哪些循环应该以多线程方式运行uIntel编译器提供对OpenMP的支持。un多媒体技术 2010 西安交通大学 新型计算机研究所nOpenMP应用编程接口API是在共享存储体系结构上的一个编程模型n包含编译制导(Compiler Directive)、运行库

21、例程(Runtime Library)和环境变量(Environment Variables) n支持增量并行化(Incremental Parallelization) 多媒体技术 2010 西安交通大学 新型计算机研究所n结合了两种并行编程的方式u编译指导语句,在编译过程并行化代码u运行时库函数,在运行时对并行环境支持nOpenMP应用程序的组成部分 多媒体技术 2010 西安交通大学 新型计算机研究所n什么是OpenMPu应用编程接口API(Application Programming Interface)u由三个基本API部分(编译指令、运行部分和环境变量)构成 u是C/C+ 和Fo

22、rtan等的应用编程接口u已经被大多数计算机硬件和软件厂家所标准化nOpenMP不包含的性质u不是建立在分布式存储系统上的 u不是在所有的环境下都是一样的 u不是能保证让多数共享存储器均能有效的利用 多媒体技术 2010 西安交通大学 新型计算机研究所n1994年,第一个ANSI X3H5草案提出,被否决 n1997年,OpenMP标准规范代替原先被否决的ANSI X3H5,被人们认可n1997年10月公布了与Fortran语言捆绑的第一个标准规范 FORTRAN version 1.0 n1998年11月9日公布了支持C和C+的标准规范C/C+ version 1.0 n2000年11月推出

23、FORTRAN version 2.0 n2002年3月推出C/C+ version 2.0 n2005年5月OpenMP2.5将原来的Fortran和C/C+ 标准规范相结合n相关的规范可在/drupal/node/view/8中下载多媒体技术 2010 西安交通大学 新型计算机研究所n标准性 n简洁实用 n使用方便 n可移植性 多媒体技术 2010 西安交通大学 新型计算机研究所n基于线程的并行编程模型(Programming Model) nOpenMP使用Fork-Join并行执行模型 FORKJOINFORKJOIN主线程并行域并行域多媒体技术

24、 2010 西安交通大学 新型计算机研究所n以线程为基础,通过编译指导语句来显式地指导并行化,为编程人员提供了对并行化的完整的控制。n采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion多媒体技术 2010 西安交通大学 新型计算机研究所n在开始执行的时候,只有主线程的运行线程存在n主线程在运行过程中,当遇到需要进行并行计算的时候,派生出(ForkFork,创建新线程或者唤醒已有线程)线程来执行并行任务n在并行执行的时候,主线程和派生线程共同工作n在并行代码结束执行后,派生线程退出或者挂起,不再工作,控制流程回到单独的主线程中(

25、JoinJoin,即多线程的会和)。 多媒体技术 2010 西安交通大学 新型计算机研究所nOpenMP的#pragma语句的格式为 #pragma omp directive_name 多媒体技术 2010 西安交通大学 新型计算机研究所n在编译器编译程序的时候,会识别特定的注释n这些注释就包含着OpenMP程序的一些语义#pragma omp clause , clause其中directive部分就包含了具体的编译指导语句,包括parallel, for, parallel for, section, sections, single, master, critical, flush,

26、ordered和atomic。n在无法识别OpenMP语义的普通编译器中,这些注释被忽略n将串行的程序逐步地改造成一个并行程序多媒体技术 2010 西安交通大学 新型计算机研究所n作用域u静态扩展文本代码在一个编译制导语句之后,被封装到一个结构块中 u孤立语句一个OpenMP的编译制导语句不依赖于其它的语句 u动态扩展 包括静态范围和孤立语句多媒体技术 2010 西安交通大学 新型计算机研究所动态范围静态范围for语句出现在一个封闭的并行域中 孤立语句critical和sections语句出现在封闭的并行域之外 #pragma omp parallel #pragma omp for for(

27、) sub1(); sub2(); void sub1() #pragma omp critical void sub2() #pragma omp sections OpenMP: ContentslOpenMPs constructs fall into 5 categories:uParallel RegionsuWorksharinguData Environment uSynchronizationuRuntime functions/environment variableslOpenMP is basically the same between Fortran and C/C+

28、The OpenMP* APIParallel RegionslYou create threads in OpenMP* with the “omp parallel” pragma.lFor example, To create a 4 thread Parallel region:double A1000;omp_set_num_threads(4);#pragma omp parallelint ID = omp_get_thread_num(); pooh(ID,A);pooh(ID,A)ID03Each thread executes a copy of the the code

29、within the structured blockRuntime function to request a certain number of threadsRuntime function returning a thread ID* Third party trademarks and names are the property of their respective owner.The OpenMP* APIParallel RegionslEach thread executes the same code redundantly.double A1000;omp_set_nu

30、m_threads(4);#pragma omp parallel int ID = omp_get_thread_num(); pooh(ID, A);printf(“all donen”);omp_set_num_threads(4)pooh(1,A)pooh(2,A)pooh(3,A)printf(“all donen”);pooh(0,A)double A1000;A single copy of A is shared between all threads.Threads wait here for all threads to finish before proceeding (

31、I.e. a barrier)* Third party trademarks and names are the property of their respective owner.Exercise 1:A multi-threaded “Hello world” programlWrite a multithreaded program where each thread prints “hello world”.#include “omp.h”void main() int ID = omp_get_thread_num(); printf(“ hello(%d) ”, ID); pr

32、intf(“ world(%d) n”, ID);Exercise 1:A multi-threaded “Hello world” programlWrite a multithreaded program where each thread prints “hello world”.#include “omp.h”void main()#pragma omp parallel int ID = omp_get_thread_num(); printf(“ hello(%d) ”, ID); printf(“ world(%d) n”, ID); Sample Output:hello(1)

33、 hello(0) world(1)world(0)hello (3) hello(2) world(3)world(2)多媒体技术 2010 西安交通大学 新型计算机研究所n并行域中的代码被所有的线程执行n具体格式u#pragma omp parallel clause,clausenewlineuclause=if(scalar-expression)private(list)firstprivate(list)default(shared | none)shared(list)copyin(list)reduction(operator: list)num_threads(integer

34、-expression)OpenMP: ContentslOpenMPs constructs fall into 5 categories:uParallel RegionsuWork-sharinguData Environment uSynchronizationuRuntime functions/environment variables多媒体技术 2010 西安交通大学 新型计算机研究所n共享任务结构将它所包含的代码划分给线程组的各成员来执行u并行for循环u并行sectionsu串行执行FORKFORKFORKJOINJOINJOIN主线程主线程线程列主线程主线程线程列主线程主线

35、程线程列SECTIONSSINGLEDO/for loop多媒体技术 2010 西安交通大学 新型计算机研究所nfor语句指定紧随它的循环语句必须由线程组并行执行;n语句格式u#pragma omp for clause,clause newlineuclause=schedule(type ,chunk) orderedprivate (list)firstprivate (list)lastprivate (list)shared (list)reduction (operator: list)nowait OpenMP: Work-Sharing ConstructslThe “for”

36、 Work-Sharing construct splits up loop iterations among the threads in a team#pragma omp parallel#pragma omp for for (I=0;IN;I+)NEAT_STUFF(I);By default, there is a barrier at the end of the “omp for”. Use the “nowait” clause to turn off the barrier.Work Sharing ConstructsA motivating examplefor(i=0

37、;IN;i+) ai = ai + bi;#pragma omp parallelint id, i, Nthrds, istart, iend;id = omp_get_thread_num();Nthrds = omp_get_num_threads();istart = id * N / Nthrds;iend = (id+1) * N / Nthrds;for(i=istart;Iiend;i+) ai = ai + bi;#pragma omp parallel #pragma omp for schedule(static) for(i=0;IN;i+) ai = ai + bi;

38、Sequential codeOpenMP parallel regionOpenMP parallel region and a work-sharing for-construct多媒体技术 2010 西安交通大学 新型计算机研究所nschedule子句描述如何将循环的迭代划分给线程组中的线程n如果没有指定chunk大小,迭代会尽可能的平均分配给每个线程ntype为static,循环被分成大小为 chunk的块,静态分配给线程ntype为dynamic,循环被动态划分为大小为chunk的块,动态分配给线程多媒体技术 2010 西安交通大学 新型计算机研究所n循环并行化的语句必须具有如下的形

39、式for (index = start ; index end ; increment_expr)uindex必须是一个整数u小于号()也可以被其它的比较操作符替代ustart和end可以是任意的数值表达式,但是在循环的过程中其值不能改变,以保证能够在循环之前就计算出循环的次数。uincrement_expr形式如下,其中incr是一个在循环过程中不变的数值表达式n循环语句块应该是单出口与单入口的,在循环过程中不能使用break、goto和return语句n可以使用continue语句,因为这个语句不影响循环执行的次数。多媒体技术 2010 西安交通大学 新型计算机研究所n将两个向量相加,并将

40、计算的结果保存到第三个向量中,向量的维数为n for(int i=0;in;i+)zi=xi+yi;n各个分量之间没有数据相关性n循环计算的过程也没有循环依赖性 n程序改成#pragma omp parallel forfor(int i=0;in;i+)zi=xi+yi;多媒体技术 2010 西安交通大学 新型计算机研究所n循环并行化子句可以包含一个或多个子句来控制循环并行化的执行u有多个类型的子句可以用来控制循环并行化编译u最主要的子句是数据作用域子句。n由于有多线程同时执行循环语句中的功能指令,这就涉及到数据的作用域问题u作用域用来控制某一个变量是否是在各个线程之间共享或者是某一个线程是

41、私有的u数据的作用域子句用shared来表示一个变量是各个线程之间共享的u用private来表示一个变量是每一个线程私有的u默认的变量作用域是共享的多媒体技术 2010 西安交通大学 新型计算机研究所n其他编译制导子句u用来控制线程的调度(schedule子句)u动态控制是否并行化(if子句)u进行同步的子句(ordered子句)u控制变量在串行部分与并行部分传递的子句(copyin子句) 多媒体技术 2010 西安交通大学 新型计算机研究所n循环并行化编译指导语句可循环并行化编译指导语句可以加在任意一个循环之前以加在任意一个循环之前n对应的最近的循环语句被并对应的最近的循环语句被并行化,其它

42、部分保持不变行化,其它部分保持不变int i;int j#pragma omp parallel for private(j)for(i=0;i2;i+)for(j=6;j10;j+)printf(“i=%d j=%dn”,i,j);执行结果:i=0 j=6i=1 j=6i=0 j=7i=1 j=7i=0 j=8i=1 j=8i=1 j=9i=0 j=9int i;int j;for(i=0;i2;i+)#pragma omp parallel forfor(j=6;j10;j+)printf(i=%d j=%dn,i,j);执行结果:i=0 j=6i=0 j=8i=0 j=9i=0 j=7i

43、=1 j=6i=1 j=8i=1 j=7i=1 j=9多媒体技术 2010 西安交通大学 新型计算机研究所nsections编译制导语句指定内部的代码被划分给线程组中的各线程n不同的section由不同的线程执行nSection语句格式:#pragma omp sections clause,clausenewline #pragma omp section newline #pragma omp section newline 多媒体技术 2010 西安交通大学 新型计算机研究所nclause=uprivate (list) ufirstprivate (list)ulastprivate

44、(list)ureduction (operator: list)unowait n在sections语句结束处有一个隐含的路障,使用了nowait子句除外多媒体技术 2010 西安交通大学 新型计算机研究所#include /eg2#define N 1000int main ()int i;float aN, bN, cN;/* Some initializations */for (i=0; i N; i+) ai = bi = i * 1.0;#pragma omp parallel shared(a,b,c) private(i) #pragma omp sections nowai

45、t #pragma omp section for (i=0; i N/2; i+) ci = ai + bi; #pragma omp section for (i=N/2; i N; i+) ci = ai + bi; /* end of sections */ /* end of parallel section */ 多媒体技术 2010 西安交通大学 新型计算机研究所n工作分区编码(sections)#pragma omp parallel sections#pragma omp sectionprintf(section 1 thread=%dn,omp_get_thread_nu

46、m();#pragma omp sectionprintf(section 2 thread=%dn,omp_get_thread_num();#pragma omp sectionprintf(sectino 3 thread=%dn,omp_get_thread_num();程序运行结果为:section 1 thread=0section 2 thread=1sectino 3 thread=0多媒体技术 2010 西安交通大学 新型计算机研究所nsingle编译制导语句指定内部代码只有线程组中的一个线程执行。n线程组中没有执行single语句的线程会一直等待代码块的结束,使用nowai

47、t子句除外n语句格式:u#pragma omp single clause,clause newlineuclause=private(list)firstprivate(list)nowaitlThe single construct denotes a block of code that is executed by only one thread.lA barrier is implied at the end of the single block.#pragma omp parallel private (tmp)do_many_things();#pragma omp singl

48、e exchange_boundaries(); do_many_other_things(); OpenMP: ContentslOpenMPs constructs fall into 5 categories:uParallel RegionsuWorksharinguData Environment uSynchronizationuRuntime functions/environment variables多媒体技术 2010 西安交通大学 新型计算机研究所n变量作用域范围n数据域属性子句uprivate子句ushared子句udefault子句ufirstprivate子句ula

49、stprivate子句ucopyin子句ureduction子句Private Clause program wrong IS = 0C$OMP PARALLEL DO PRIVATE(IS) DO J=1,1000 IS = IS + J END DO print *, ISlprivate(var) creates a local copy of var for each thread. The value is uninitialized Private copy is not storage associated with the originalIS was not initiali

50、zedRegardless of initialization, IS is undefined at this point多媒体技术 2010 西安交通大学 新型计算机研究所nprivate子句表示它列出的变量对于每个线程是局部的 。n语句格式uprivate(list)nprivate和threadprivate区别PRIVATETHREADPRIVATE数据类型变量变量位置在域的开始或共享任务单元在块或整个文件区域的例程的定义上持久性否是扩充性只是词法的- 除非作为子程序的参数而传递动态的初始化使用 FIRSTPRIVATE使用 COPYIN多媒体技术 2010 西安交通大学 新型计算机

51、研究所nshared子句表示它所列出的变量被线程组中所有的线程共享n所有线程都能对它进行读写访问n语句格式ushared (list) 多媒体技术 2010 西安交通大学 新型计算机研究所ndefault子句让用户自行规定在一个并行域的静态范围中所定义的变量的缺省作用范围n语句格式udefault (private|shared | none) 多媒体技术 2010 西安交通大学 新型计算机研究所nfirstprivate子句是private子句的超集n对变量做原子初始化n语句格式:u firstprivate (list) Firstprivate ClauselFirstprivate i

52、s a special case of private. Initializes each private copy with the corresponding value from the master thread.Regardless of initialization, IS is undefined at this point program almost_right IS = 0C$OMP PARALLEL DO FIRSTPRIVATE(IS) DO J=1,1000 IS = IS + J1000 CONTINUE print *, ISEach thread gets it

53、s own IS with an initial value of 0多媒体技术 2010 西安交通大学 新型计算机研究所nlastprivate子句是private子句的超集n将变量从最后的循环迭代或段复制给原始的变量n语句格式ulastprivate (list) Lastprivate ClauselLastprivate passes the value of a private from the last iteration to a global variable.IS is defined as its value at the last iteration (I.e. for

54、J=1000) program closer IS = 0C$OMP PARALLEL DO FIRSTPRIVATE(IS) C$OMP+ LASTPRIVATE(IS) DO J=1,1000 IS = IS + J1000 CONTINUE print *, ISEach thread gets its own IS with an initial value of 0多媒体技术 2010 西安交通大学 新型计算机研究所nfirstprivate和lastprivate int val=8;#pragma omp parallel for firstprivate(val) lastpr

55、ivate(val)for(int i=0;i2;i+)printf(i=%d val=%dn,i,val);if(i=1)val=10000;printf(i=%d val=%dn,i,val);printf(val=%dn,val);下面是程序的执行结果i=0 val=8i=1 val=8i=0 val=8i=1 val=10000val=10000在每一个线程的内部,私有变量val被初始化为主线程原有的同名变量的值,并且在循环并行化退出的时候,相应的变量被原有串行执行的最后一次执行对应的值所赋值 多媒体技术 2010 西安交通大学 新型计算机研究所nthreadprivate语句使一个全

56、局文件作用域的变量在并行域内变成每个线程私有n每个线程对该变量复制一份私有拷贝n语句格式:u#pragma omp threadprivate (list) newlineThreadprivatelMakes global data private to a threaduFortran: COMMON blocksuC: File scope and static variableslDifferent from making them PRIVATEuwith PRIVATE global variables are masked. uTHREADPRIVATE preserves gl

57、obal scope within each threadlThreadprivate variables can be initialized using COPYIN or by using DATA statements.多媒体技术 2010 西安交通大学 新型计算机研究所int alpha10, beta10, i;/eg3#pragma omp threadprivate(alpha) int main () /* First parallel region */#pragma omp parallel private(i,beta) for (i=0; i 10; i+) alph

58、ai = betai = i;/* Second parallel region */#pragma omp parallel printf(alpha3= %d and beta3=%dn,alpha3,beta3); 多媒体技术 2010 西安交通大学 新型计算机研究所ncopyin子句用来为线程组中所有线程的threadprivate变量赋相同的值n主线程该变量的值作为初始值n语句格式ucopyin(list)多媒体技术 2010 西安交通大学 新型计算机研究所nreduction子句使用指定的操作对其列表中出现的变量进行规约n初始时,每个线程都保留一份私有拷贝n在结构尾部根据指定的操作

59、对线程中的相应变量进行规约,并更新该变量的全局值n语句格式ureduction (operator: list) 多媒体技术 2010 西安交通大学 新型计算机研究所n规约操作u会反复将一个二元运算符应用在一个变量和另外一个值上,并把结果保存在原变量中u一个常见的规约操作就是数组求和,使用一个变量保存部分和,并把数组中的每一个值加到这个变量中,就可以得出最后所有数组的总和 nOpenMP在使用规约操作时,只需在变量前指明规约操作的类型以及规约的变量 # pragma omp parallel for private(arx,ary,n) reduction(+:a,b)for(i=0;in;i+)a=a+arxi;b=b+aryi;多媒体技术 2010 西安交通大学 新型计算机研究所#include /eg4int main () int i, n, chunk;float a100, b100, result;/* Some initializations */n = 100;chunk = 10;result = 0.0;for (i=0; i n; i+) ai = i * 1.0; bi = i * 2.0; #pragma omp parallel for defau

温馨提示

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

评论

0/150

提交评论