OpenMP 并行编程

上传人:抢*** 文档编号:131765515 上传时间:2022-08-07 格式:PPT 页数:60 大小:373.50KB
收藏 版权申诉 举报 下载
OpenMP 并行编程_第1页
第1页 / 共60页
OpenMP 并行编程_第2页
第2页 / 共60页
OpenMP 并行编程_第3页
第3页 / 共60页
资源描述:

《OpenMP 并行编程》由会员分享,可在线阅读,更多相关《OpenMP 并行编程(60页珍藏版)》请在装配图网上搜索。

1、1OpenMP 并行编程并行编程(一)(一)并行编程介绍并行编程介绍 并行域与工作共享并行域与工作共享2内容提要内容提要n 并行编程并行编程 n OpenMP 简介简介n OpenMP 编译制导编译制导n OpenMP 库函数库函数n OpenMP 环境变量环境变量n OpenMP 示例示例3并行程序设计模型并行程序设计模型l 隐式并行(隐式并行(Implicit Parallel)l 数据并行(数据并行(Data Parallel)l 共享变量(共享变量(Shared Variable)l 消息传递(消息传递(Message Passing)n 并行程序设计模型并行程序设计模型4隐式并行隐式

2、并行l 编写串行程序编写串行程序l 通过编译器和运行支持系统将串行程序自动并行化通过编译器和运行支持系统将串行程序自动并行化l 特点:语义简单,可移植性好,易于调试和验证特点:语义简单,可移植性好,易于调试和验证l 缺点:细粒度并行,效率很低缺点:细粒度并行,效率很低n 隐式并行隐式并行5数据并行数据并行l SIMD(单指令流多数据流)(单指令流多数据流)l 同一操作同时作用到一组数据上同一操作同时作用到一组数据上l 特点:单线程,单一地址空间,编程简单,特点:单线程,单一地址空间,编程简单,松散同步,隐式交互,隐式数据分配松散同步,隐式交互,隐式数据分配l 缺点:并行粒度局限于数据级并行,粒

3、度小缺点:并行粒度局限于数据级并行,粒度小l 典型代表:典型代表:Fortran 90,HPFn 数据并行数据并行SIMD:Single Instruction Multiple Data 6共享变量共享变量l 适用于适用于 SMP 和和 DSMl 特点:松散同步,多线程(特点:松散同步,多线程(SPMD,MPMD)单一地址空间,显式同步,隐式通信,隐式数据分布单一地址空间,显式同步,隐式通信,隐式数据分布l 典型代表:典型代表:OpenMP,Pthreadsn 共享变量共享变量SPMD:Single Program Multiple DataSMP:Shared Memory Process

4、orsDSM:Distributed Shared MemoryMPMD:Multiple Program Multiple dataPthreads:POSIX threadsOpenMP:Open Multi-Processing7消息传递消息传递l MPP、COW 的自然模型的自然模型l 特点:异步并行,多线程,多地址空间,特点:异步并行,多线程,多地址空间,显式同步,显式通信,显式数据映射和负载分配显式同步,显式通信,显式数据映射和负载分配l 典型代表:典型代表:MPI,PVMn 消息传递消息传递MPI:Message Passing InterfaceCOW:Cluster of W

5、orkstationsPVM:Parallel Virtual MachineMPP:Massively parallel processing8并行编程模型并行编程模型l 数据并行:数据并行:Fortran 90,HPF;适用于;适用于 SMP,DSM l 共享内存:共享内存:OpenMP,Pthreads;适用于;适用于 SMP,DSMl 消息传递:消息传递:MPI,PVM;适用于所有并行机;适用于所有并行机n 并行编程模型标准并行编程模型标准l 三者可混合使用三者可混合使用9并行化方法并行化方法l 相并行(相并行(Phase Parallel)l 流行线并行(流行线并行(Pipeline

6、 Parallel)l 主从并行(主从并行(Master-Slave Parallel)l 分而治之并行(分而治之并行(Divide and Conquer Parallel)l 工作池并行(工作池并行(Work Pool Parallel)n 基本并行化方法基本并行化方法10并行化方法并行化方法l 一组超级步(相)一组超级步(相)l 步内各自计算步内各自计算l 步间通信同步步间通信同步l 方便差错和性能分析方便差错和性能分析l 计算和通信不能重叠计算和通信不能重叠l 相并行相并行 CCCSynchronous InteractionCCCSynchronous Interaction.l 将

7、分成一系列子任务将分成一系列子任务 t1,t2,tm,一旦,一旦 t1 完成,完成,后继的子任务就立即开始,并以同样的速率进行计算后继的子任务就立即开始,并以同样的速率进行计算l 一组进程,流水线作业,流水线设计技术一组进程,流水线作业,流水线设计技术l 流行线并行流行线并行P1P2Pn.11并行化方法并行化方法l 主进程:串行,协调任务主进程:串行,协调任务l 子进程:计算子任务子进程:计算子任务l 与相并行结合与相并行结合l 主进程易成为瓶颈主进程易成为瓶颈l 主从并行主从并行SlaveSlaveSlaveMaster.l 分而治之分而治之l 将问题分解成若干特征相同的将问题分解成若干特征

8、相同的 子问题,分而治之子问题,分而治之l 父进程把负载分割并指派给子进程父进程把负载分割并指派给子进程l 重点在于归并重点在于归并l 难以负载平衡难以负载平衡12并行化方法并行化方法l 初始状态:一件工作初始状态:一件工作l 进程从池中取任务执行进程从池中取任务执行l 可产生新任务放回池中可产生新任务放回池中l 直至任务池为空直至任务池为空l 易于负载平衡易于负载平衡l 工作池并行工作池并行Work PoolP1P2Pn.13并行算法设计原则并行算法设计原则l 与体系结构相结合与体系结构相结合l 具有可扩展性具有可扩展性l 粗粒度粗粒度l 减少通信减少通信l 优化性能优化性能n 并行算法设计

9、基本原则并行算法设计基本原则粒度粒度是指各个线程可以独立并行执行的任务的大小,是一个是指各个线程可以独立并行执行的任务的大小,是一个相对的概念,与并行度和并行机相关。一般可理解为:相对的概念,与并行度和并行机相关。一般可理解为:l 细粒度:基于向量和循环系级并行细粒度:基于向量和循环系级并行l 中粒度:较大的循环级并行中粒度:较大的循环级并行l 大粒度:任务级并行(如:区域分解)大粒度:任务级并行(如:区域分解)Parallel Programming Paradigms14并行程序设计步骤并行程序设计步骤l 划分(划分(Partitioning)将计算任务划分成尽可能多的小任务将计算任务划分

10、成尽可能多的小任务 划分方法主要有:数据分解(区域分解)和功能分解划分方法主要有:数据分解(区域分解)和功能分解l 通信(通信(Communication)确认各任务间的数据交流,评估任务划分的合理性确认各任务间的数据交流,评估任务划分的合理性l 组合(组合(Agglomeration)依据任务的局部性,将小任务组合成大任务,减少通信依据任务的局部性,将小任务组合成大任务,减少通信l 映射(映射(Mapping)将组合后的任务分配到各个线程,力争负载平衡将组合后的任务分配到各个线程,力争负载平衡n 并行程序设计步骤并行程序设计步骤15内容提要内容提要n 并行编程并行编程 n OpenMP 简介

11、简介n OpenMP 编译制导编译制导n OpenMP API 函数函数n OpenMP 环境变量环境变量n OpenMP 示例示例16OpenMP 简介简介l OpenMP 是是基于共享存储体系结构的一个并行编程标准。基于共享存储体系结构的一个并行编程标准。l OpenMP 通过在源代码(串行程序)中添加通过在源代码(串行程序)中添加 OpenMP 指令指令和调用和调用 OpenMP 库函数来实现在共享内存系统上的并行执行。库函数来实现在共享内存系统上的并行执行。l OpenMP 为共享内存并行程序员提供了一种简单灵活的开发为共享内存并行程序员提供了一种简单灵活的开发并行应用的接口模型,使程

12、序既可以在台式机上执行,也可以并行应用的接口模型,使程序既可以在台式机上执行,也可以在超级计算机上执行,具有良好的可移植性在超级计算机上执行,具有良好的可移植性l 不打开不打开 OpenMP 编译选项,编译器将忽略编译选项,编译器将忽略 OpenMP 指令,指令,从而生成串行可执行程序从而生成串行可执行程序l 打开打开 OpenMP 编译选项,编译器将对编译选项,编译器将对 OpenMP 指令进行指令进行 处理,编译生成处理,编译生成 OpenMP 并行可执行程序并行可执行程序l 并行线程数可以在程序启动时利用环境变量等动态设置并行线程数可以在程序启动时利用环境变量等动态设置l 支持与支持与

13、MPI 混合编程混合编程17OpenMP 简介简介l 起源于起源于ANSI X3H5(1994)标准标准l 由设备商和编译器开发者共同制定,由设备商和编译器开发者共同制定,工业标准工业标准(1997)l 编程编程简单简单,增量化并行,增量化并行,移植性好移植性好,可扩展性可扩展性好好l 支持支持 Fortran,C/C+(编译器自带(编译器自带 OpenMP)(http:/openmp.org/wp/openmp-compilers/)l 支持支持 Unix,Linux,Windows 等操作系统等操作系统l AMD,Intel,IBM,Cray,NEC,HP,NVIDIA,.The Open

14、MP API supports multi-platform shared-memory parallel programming in C/C+and Fortran.The OpenMP API defines a portable,scalable model with a simple and flexible interface for developing parallel applications on platforms from the desktop to the supercomputer.API:Application Programming Interface18Op

15、enMP 运行模式运行模式l OpenMP 是基于是基于线程线程的并行编程模型的并行编程模型l OpenMP 采用采用 Fork-Join 并行执行方式并行执行方式OpenMP 程序开始于一个单独的主线程(程序开始于一个单独的主线程(Master Thread),),然后主线程一直串行执行,直到遇见第一个然后主线程一直串行执行,直到遇见第一个并行域并行域(Parallel Region),然后开始并行执行并行域。并行域代码执行完后再,然后开始并行执行并行域。并行域代码执行完后再回到主线程,直到遇到下一个并行域,以此类推,直至程序回到主线程,直到遇到下一个并行域,以此类推,直至程序运行结束。运行

16、结束。l 是下面三种编程要素的集合:是下面三种编程要素的集合:编译编译制导制导(Compiler Directive)运行库函数(运行库函数(Runtime Library Routines)环境变量环境变量(Environment Variables)19Fork-Joinl Fork:主线程创建一个并行线程队列,然后,并行域中的主线程创建一个并行线程队列,然后,并行域中的代码在不同的线程上并行执行代码在不同的线程上并行执行l Join:当并行域执行完之后,它们或被同步当并行域执行完之后,它们或被同步,或或被被中断,中断,最后只有主线程最后只有主线程继续继续执行执行FORKJOINFORKJ

17、OIN并行域可以嵌套并行域可以嵌套并行域并行域并行域并行域串串行域行域串串行域行域串串行域行域20Fortran 举例举例program hellouse omp_libimplicit noneinteger:tid,nthreads!$omp parallel private(tid)tid=omp_get_thread_num()write(*,100)Hello,world from OpenMPthread,tid if(tid=0)then nthreads=omp_get_num_threads();write(*,100)Number of threads,nthreads e

18、ndif!$omp end parallel100 format(1X,A,I1,/)endl OpenMP 编译制导指令标识符编译制导指令标识符!$ompl 模块:模块:omp_libl 编译编译 gfortran fopenmp hello.f90 ifort openmp hello.f9021C 举例举例#include#include int main()int nthreads,tid;#pragma omp parallel private(nthreads,tid)tid=omp_get_thread_num();printf(Hello,world from OpenMPth

19、read%dn,tid);if(tid=0)nthreads=omp_get_num_threads();printf(Number of threads%dn,nthreads);return 0;l OpenMP 编译制导指令标识符编译制导指令标识符#pragma ompl 头文件:头文件:omp.hl 编译编译 gcc fopenmp hello.c22OpenMP 说明说明l 在在 Fortran 程序中,所有程序中,所有 OpenMP 编译制导指令都是以编译制导指令都是以 !$OMP 开头,后面跟具体的指令,一般形式为开头,后面跟具体的指令,一般形式为 (FORTRAN 77 程序中

20、以程序中以 C$OMP 或或*$OMP 开头开头)l 指令标识符必须位于所在行的最前面,字符之间不能有空格指令标识符必须位于所在行的最前面,字符之间不能有空格l 标识符与指令之间必须用空格隔开,标识符与指令之间必须用空格隔开,l 每行只能有一个每行只能有一个 OpenMP 指令指令l OpenMP 指令不区分大小写(指令不区分大小写(Fortran)l 所有所有 OpenMP 编译指令都必须以标识符开始编译指令都必须以标识符开始l 续行的行首要有标识符,后面可以跟续行符续行的行首要有标识符,后面可以跟续行符&l 字句为可选,若有则必须出现在指令之后字句为可选,若有则必须出现在指令之后l 若有多

21、个字句,则用空格隔开,顺序任意若有多个字句,则用空格隔开,顺序任意 n 几点说明(几点说明(Fortran)!$OMP 编译制导指令编译制导指令 字句字句(clause)23OpenMP 说明说明增量并行增量并行:逐步改造现有的串行程序,每次只对部分代:逐步改造现有的串行程序,每次只对部分代码进行并行化,这样可以逐步改造,逐步调试。码进行并行化,这样可以逐步改造,逐步调试。l C/C+的指令标识符为的指令标识符为#pragma ompl C/C+程序中,程序中,OpenMP 指令指令区分大小写区分大小写l 每个每个 OpenMP 指令后是一个结构块(用大括号括起来)指令后是一个结构块(用大括号

22、括起来)n 几点说明(几点说明(C/C+)n OpenMP 并行程序编写方法并行程序编写方法n OpenMP 源程序的编译源程序的编译gcc fopenmp hello.cicc openmp hellp.cgfortran fopenmp hello.f90ifort openmp hello.f90ifort openmp Tf free hello.f95 !ifort 不认不认.f9524编译制导编译制导l 并行域指令并行域指令:生成并行域:即产生多个线程以并行执行任务,生成并行域:即产生多个线程以并行执行任务,所有并行任务必须放在并行域中才可能被并行执行所有并行任务必须放在并行域中才

23、可能被并行执行l 工作共享指令工作共享指令:负责任务划分,并分发给各个线程负责任务划分,并分发给各个线程 工作共享指令不能产生新线程,因此工作共享指令不能产生新线程,因此必须位于并行域中必须位于并行域中l 同步指令同步指令:负责并行线程之间的同步:负责并行线程之间的同步l 数据环境数据环境:负责并行域内的变量的属性(共享或私有),:负责并行域内的变量的属性(共享或私有),以及边界上(串行域与并行域)的数据传递以及边界上(串行域与并行域)的数据传递n 编译制导指令大致分四类编译制导指令大致分四类n OpenMP 通过对串行程序添加通过对串行程序添加编译制导指令编译制导指令实现并行化实现并行化25

24、编译制导指令编译制导指令PARALLEL END PARALLEL标识一个并行域的开始和结束标识一个并行域的开始和结束n 并行域指令并行域指令 Parallel Constructsl 负责产生多个线程,即生成一个并行域负责产生多个线程,即生成一个并行域l 并行域中的所有代码默认都将被所有线程并行执行并行域中的所有代码默认都将被所有线程并行执行l 可以通过线程可以通过线程 id 给不同线程手工分配不同的任务给不同线程手工分配不同的任务l 也可以利用也可以利用工作共享指令工作共享指令给每个线程分配任务给每个线程分配任务26编译制导指令编译制导指令l 工作共享指令工作共享指令 Work-Shari

25、ng ConstructsDOEND DO用在用在 DO 循环之前,标识一个并行循环任务的开始循环之前,标识一个并行循环任务的开始和结束,必须保证每次循环之间无数据相关性和结束,必须保证每次循环之间无数据相关性 SECTIONS SECTIONEND SECTIONS标识仅由一个线程执行的若干区域的开始标识仅由一个线程执行的若干区域的开始标识仅由一个线程执行的一个区域标识仅由一个线程执行的一个区域标识仅由一个线程执行的若干区域的结束标识仅由一个线程执行的若干区域的结束SINGLE END SINGLE标识仅由一个线程执行的区域开始和结束标识仅由一个线程执行的区域开始和结束WORKSHAREEN

26、D WORKSHARE用于用于 Fortran 95 中可并行执行的语句,如中可并行执行的语句,如 FORALL 结构,结构,WHERE 结构,以及矩阵函数结构,以及矩阵函数27编译制导指令编译制导指令l 并行域与工作共享指令的结合并行域与工作共享指令的结合PARALLEL DOEND PARALLEL DOPARALLEL SECTIONS SECTIONEND PARALLEL SECTIONSPARALLEL WORKSHAREEND PARALLEL WORKSHARE工作共享指令只负责任务划分,并分发给各个线程。工作共享指令只负责任务划分,并分发给各个线程。工作共享指令工作共享指令必

27、须位于并行域中必须位于并行域中才能起到并行执行任务的才能起到并行执行任务的作用,原因是工作共享指令不能产生新的线程,因此如果作用,原因是工作共享指令不能产生新的线程,因此如果位于串行域中的话,任务只能被一个线程执行。位于串行域中的话,任务只能被一个线程执行。28编译制导指令编译制导指令l 同步指令同步指令 Synchronization ConstructsMASTEREND MASTER标识仅由主线程执行的区域的开始和结束标识仅由主线程执行的区域的开始和结束CRITICALEND CRITICAL标识关键区的开始和结束标识关键区的开始和结束(保证每次只有一个线程进入)(保证每次只有一个线程进

28、入)BARRIER障碍同步:用在并行域内,所有线程执行到障碍同步:用在并行域内,所有线程执行到 BARRIER 都要停下等待,直到所有线程都执行到都要停下等待,直到所有线程都执行到 BARRIER,然后再继续往下执行,然后再继续往下执行ATOMIC确保共享变量在同一时间只能被一个线程更新确保共享变量在同一时间只能被一个线程更新FLUSH用在同步的时候,确保数据被正确写入用在同步的时候,确保数据被正确写入ORDEREDEND ORDERED指定并行区域的循环按顺序执行指定并行区域的循环按顺序执行29编译制导指令编译制导指令l 数据环境指令数据环境指令 Data Environment Const

29、ructsTHREADPRIVATE(list)指定一个或多个变量是线程私有指定一个或多个变量是线程私有30OpenMP子句子句l 数据作用域属性字句数据作用域属性字句 Data Scope Attribute ClausesPRIVATE(list)指定一个或多个变量为私有变量,即在每个线指定一个或多个变量为私有变量,即在每个线程中都创建一个同名局部变量,但没有初始值程中都创建一个同名局部变量,但没有初始值SHARED(list)指定一个或多个变量为共享变量,即所有线程指定一个或多个变量为共享变量,即所有线程都可以访问这些变量都可以访问这些变量DEFAULT(.)指定并行域内的变量的缺省属性

30、,可设为指定并行域内的变量的缺省属性,可设为 PRIVATE,SHARED,NONE,默认是,默认是 SHAREDn OpenMP 子句(子句(Clause)子句出现在编译制导指令之后,负责添加一些补充设置子句出现在编译制导指令之后,负责添加一些补充设置31OpenMP子句子句l 数据作用域属性字句数据作用域属性字句 Data Scope Attribute ClausesFIRSTPRIVATE(list)指定一个或多个变量为私有变量,指定一个或多个变量为私有变量,并且私有变量并且私有变量在进入并行域时,将主线程中的同名变量的值作在进入并行域时,将主线程中的同名变量的值作为初值为初值LAST

31、PRIVATE(list)指定将线程中的私有变量的指定将线程中的私有变量的“最后最后”的值在并行的值在并行处理结束后复制到主线程中的同名变量中处理结束后复制到主线程中的同名变量中COPYIN(list)配合配合 THREADPRIVATE,用主线程同名变量的,用主线程同名变量的值对值对 THREADPRIVATE 的变量的变量进行初始化进行初始化COPYPRIVATE(list)配合配合 SINGLE,将,将 SINGLE 块中串行计算得到的块中串行计算得到的变量值广播到并行域中其它线程的同名变量中变量值广播到并行域中其它线程的同名变量中REDUCTION(op:list)指定一个或多个变量是

32、私有的,并且在并行处理指定一个或多个变量是私有的,并且在并行处理结束后对这些变量执行指定的归约操作(如求结束后对这些变量执行指定的归约操作(如求和),并将结果返回给主线程中的同名变量和),并将结果返回给主线程中的同名变量32OpenMP子句子句l 其它字句其它字句IF(log_expr)条件并行,满足指定条件时才执行相关操作条件并行,满足指定条件时才执行相关操作NUM_THREADS(int_expr)指定并行域内线程的个数指定并行域内线程的个数NOWAIT忽略忽略并行线程或其它制导指令中暗含的障碍并行线程或其它制导指令中暗含的障碍同步同步SCHEDULE(type,chunk)指定循环任务的

33、分配规则指定循环任务的分配规则ORDERED指定循环内的代码要按顺序执行指定循环内的代码要按顺序执行33并行域并行域l PARALLEL 指令指令l 产生多个线程,即创建一个并行域产生多个线程,即创建一个并行域l 并行域内的代码将被多个线程并行执行并行域内的代码将被多个线程并行执行l 并行域可以嵌套并行域可以嵌套l 并行域结束后,将回到主线程并行域结束后,将回到主线程n 并行域的设置与管理并行域的设置与管理34!OMP PARALLELFortran!$omp parallel clause clause.structured-block!$omp end parallelC/C+#pragm

34、a omp parallel clause clause.structured-block l 结尾处有隐式同步,可用的子句(结尾处有隐式同步,可用的子句(clause)包括:)包括:if(scalar-logical-expression)num_threads(scalar-integer-expression)default(private|shared|none)private(list)firstprivate(list)shared(list)copyin(list)reduction(op|intrinsic:list)子句用来添加一些补充信息。子句用来添加一些补充信息。若有多个

35、,则用空格隔开。若有多个,则用空格隔开。若没有指定线程个数,则产若没有指定线程个数,则产生最大可能的线程个数。生最大可能的线程个数。35PARALLEL举例举例PROGRAM hello!$OMP PARALLEL write(*,*)“Hello”!$OMP END PARALLELEND PROGRAMThread 0Thread 0write(*,*)“hello”Thread 1write(*,*)“hello”Thread Nwrite(*,*)“hello”.串行域串行域并行域并行域如果不指定线程数,则如果不指定线程数,则开启尽可能多的线程开启尽可能多的线程36PARALLEL举例

36、举例PROGRAM hello!$OMP PARALLEL NUM_THREADS(4)write(*,*)Hello Math!$OMP END PARALLELEND PROGRAM helloNUM_THREADS(int_expr)指定产生的线程个数指定产生的线程个数!$OMP PARALLEL NUM_THREADS(4)l 以下写法等价以下写法等价!$OMP PARALLEL&!$OMP NUM_THREADS(4)!$OMP PARALLEL !$OMP&NUM_THREADS(4)可分成几行书写,但每行的可分成几行书写,但每行的最前面要加最前面要加OpenMP标识符标识符37P

37、ARALLEL举例举例PROGRAM helloCALL OMP_SET_NESTED(.true.)!$OMP PARALLEL NUM_THREADS(2)write(*,*)Hello Math !$OMP PARALLEL NUM_THREADS(2)write(*,*)Hi Math !$OMP END PARALLEL!$OMP END PARALLELEND PROGRAM hellol PARALLEL 可以嵌套可以嵌套缺省不支持嵌套,需要利用缺省不支持嵌套,需要利用 OpenMP 的的 API 过程过程 OMP_SET_NESTED 开开启嵌套功能(该过程的缺省值是启嵌套功能

38、(该过程的缺省值是.false.)38工作共享指令工作共享指令l DO 指令:负责循环任务的划分和分配指令:负责循环任务的划分和分配l SECTIONS 指令:手动划分任务指令:手动划分任务l SINGLE 指令:指定并行域中的串行任务指令:指定并行域中的串行任务l WORKSHARE 指令:指令:主要负责主要负责 Fortran 95 中本身可并行执行的语句中本身可并行执行的语句l 负责任务的划分和分配,负责任务的划分和分配,l 在每个工作分享结构入口处无需同步在每个工作分享结构入口处无需同步l 每个工作分享结构结束处会隐含障碍同步每个工作分享结构结束处会隐含障碍同步n 工作共享指令工作共享

39、指令39!OMP DOFortran!$omp do clause clause.do-loops!$omp end doC/C+#pragma omp for clause clause.for-loops l 只负责工作分享,不负责并行域的产生和管理只负责工作分享,不负责并行域的产生和管理l 如果不放在并行域内,则只能串行执行如果不放在并行域内,则只能串行执行l 结尾处有隐式同步,可用的子句(结尾处有隐式同步,可用的子句(clause)包括:)包括:private(list)firstprivate(list)lastprivate(list)reduction(op|intrinsic:

40、list)schedule(kind,chunk_size)ordered40!OMP DOl 串行串行 DO 循环:循环:工作流程:将循环变量从初始值开始,逐次递增或递减,直至满足结束工作流程:将循环变量从初始值开始,逐次递增或递减,直至满足结束条件,其间对每个循环变量的取值都将执行一次循环体内的代码,且循条件,其间对每个循环变量的取值都将执行一次循环体内的代码,且循环体内的代码是依次串行执行的环体内的代码是依次串行执行的DO i=1,100 B(i)=i+1 A(i)=2*B(i)ENDDOl OpenMP 并行并行 DO 循环循环 工作流程:假定总共有工作流程:假定总共有 N 次循环,次

41、循环,OpenMP 对循环的任务分配就是将对循环的任务分配就是将这这 N 次循环进行划分,然后让每个并发线程各自负责其中的一部分循次循环进行划分,然后让每个并发线程各自负责其中的一部分循环工作,因此必须确保每次循环之间的数据的相互独立性!环工作,因此必须确保每次循环之间的数据的相互独立性!l OpenMP 规定:循环变量只能是整型规定:循环变量只能是整型l 将任务划分后分发给并发进程称为将任务划分后分发给并发进程称为“调度调度”(schedule)41SCHEDULEl 循环体任务的调度基本原则:循环体任务的调度基本原则:任务调度的方式直接影响程序的效率,这主要体现在两个方面:一个是任任务调度

42、的方式直接影响程序的效率,这主要体现在两个方面:一个是任务的均衡程度,另一个是循环体内数据访问顺序与相应的务的均衡程度,另一个是循环体内数据访问顺序与相应的 cache 冲突情况。冲突情况。l 分解代价低:分解方法要快速,尽量减少分解任务而产生的额外开销分解代价低:分解方法要快速,尽量减少分解任务而产生的额外开销l 任务计算量要均衡任务计算量要均衡l 尽量避免高速缓存(尽量避免高速缓存(cache)冲突:)冲突:尽可能避免尽可能避免 cache 行竞争和行竞争和 cache 的乒乓效应,提高的乒乓效应,提高 cache 命中率。命中率。42高速缓存高速缓存 cache高速缓存高速缓存(cach

43、e)的关键特性是以连续单元的的关键特性是以连续单元的数据数据块的形式组成的块的形式组成的,当当处理器处理器需要需要引用某个引用某个数据数据块的一个或几个字节块的一个或几个字节时,时,这个块的所有数据就这个块的所有数据就会被传送到高速缓存中会被传送到高速缓存中。因此因此,如果如果接下来需要接下来需要引用这个块中的其他数引用这个块中的其他数据据,则,则不必不必再再从主存中调用它从主存中调用它,这样就可以提高执行效率。,这样就可以提高执行效率。l 高速缓存高速缓存比如:两个处理器比如:两个处理器 A 和和 B 访问同一个数据块的不同部分,如果处理器访问同一个数据块的不同部分,如果处理器A修改了数据,

44、则高速缓存一致协议将更新或者使处理器修改了数据,则高速缓存一致协议将更新或者使处理器 B 中的高速缓存中的高速缓存块无效。而在此时处理器块无效。而在此时处理器 B 可能也修改了数据,则高速缓存一致协议反可能也修改了数据,则高速缓存一致协议反过来又要将处理器过来又要将处理器 A 中的高速缓存块进行更新或者使无效。如此往复,中的高速缓存块进行更新或者使无效。如此往复,就会导致高速缓存块的乒乓效应(就会导致高速缓存块的乒乓效应(ping-pong effect)。)。在多处理机系统中,不同的处理器可能需要同一个数据块的不同部分在多处理机系统中,不同的处理器可能需要同一个数据块的不同部分(不是相同的字

45、节),尽管实际数据不共享(处理器有各自的高速缓(不是相同的字节),尽管实际数据不共享(处理器有各自的高速缓存),但如果一个处理器对该块的其他部分写入,由于高速缓存的一致存),但如果一个处理器对该块的其他部分写入,由于高速缓存的一致性协议,这个块在其他高速缓存上的拷贝就要全部进行更新或者使无效,性协议,这个块在其他高速缓存上的拷贝就要全部进行更新或者使无效,这就是所谓的这就是所谓的“假共享假共享”,它对系统的性能有负面的影响。,它对系统的性能有负面的影响。43SCHEDULEFORKJOIN主线程主线程主线程主线程循循环环n 任务调度任务调度 SCHEDULEl SCHEDULE(static,

46、chunk)静态分配,任务块的大小不变,由静态分配,任务块的大小不变,由 chunk 指定指定l SCHEDULE(dynamic,chunk)动态分配,任务块的大小不变,由动态分配,任务块的大小不变,由 chunk 指定指定l SCHEDULE(guided,chunk)动态分配,任务块的大小可变,最大不超过动态分配,任务块的大小可变,最大不超过 chunk l SCHEDULE(runtime)具体调度方式到运行时才能确定具体调度方式到运行时才能确定 44SCHEDULE方式方式SCHEDULE(static,chunk)SCHEDULE(static)l 循环任务被划分为循环任务被划分为

47、 chunk 大小的子任务,然后被轮转的分配给各个线程大小的子任务,然后被轮转的分配给各个线程l 省略省略 chunk,则循环任务被划分成(近似)相同大小的子任务,每个线程,则循环任务被划分成(近似)相同大小的子任务,每个线程被分配一个子任务;被分配一个子任务;例:例:假如线程数为假如线程数为 4,总任务量为,总任务量为 40,则,则schudule(static)schudule(static,4)T0T1 T2T3T0T1T2T3T0T1T2T3T0T145SCHEDULE方式方式l 循环任务被划分为循环任务被划分为 chunk 大小的子任务大小的子任务,然后基于先来先服务方式分配然后基于

48、先来先服务方式分配给各线程给各线程;l 当省略当省略 chunk 时,默认值为时,默认值为 1 SCHEDULE(dynamic)SCHEDULE(dynamic,chunk)SCHEDULE(guided,chunk)SCHEDULE(guided)l 类似于类似于 dynamic 调度,但调度,但子任务一子任务一开始开始比较比较大,然后大,然后子任务子任务越来越越来越小小l chunk 指定指定最小的最小的任务的任务的大小大小,省略时默认值为省略时默认值为 1SCHEDULE(runtime)l 调度延迟到运行时,调度方式取决于环境变量调度延迟到运行时,调度方式取决于环境变量 OMP_SC

49、HEDULE 的值的值46SCHEDULE图例图例静态调度开销最小,能用静态调度的话尽量用静态调度静态调度开销最小,能用静态调度的话尽量用静态调度47SCHEDULE图例图例48DO 举例举例PROGRAM mainimplicit noneinteger(4),parameter:n=100000000real(8):A(n),B(n)integer:i!$OMP PARALLEL NUM_THREADS(4)!$OMP DO DO i=1,n B(i)=sqrt(dble(i)A(i)=2*B(i)ENDDO!$OMP END DO!$OMP END PARALLELwrite(*,(1X

50、,2(A,E12.6)A(n)=,A(n),B(n)=,B(n)END PROGRAM main49DO 举例举例PROGRAM mainuse omp_lib !使用使用 OpenMP 的的 Fortran 模块模块implicit noneinteger(4),parameter:n=10000000real(8):A(n),B(n),tinteger:it=OMP_GET_WTIME()!获取墙上时间获取墙上时间!$OMP PARALLEL DO NUM_THREADS(4)DO i=1,n B(i)=sqrt(dble(i)A(i)=2*B(i)ENDDO!$OMP END PARAL

51、LEL DOt=OMP_GET_WTIME()-twrite(*,(1X,2(A,E12.6)A(n)=,A(n),B(n)=,B(n)write(*,(1X,A,E10.3)time=,tEND PROGRAM main50数据竞争数据竞争!$OMP PARALLEL DO DO i=1,n x=A(i)B(i)=2*sin(x)ENDDO!$OMP END PARALLEL DO错误代码:错误代码:x 是共享变量,所有线程都需要访问是共享变量,所有线程都需要访问 x(修改和引用),这就是数据竞争。(修改和引用),这就是数据竞争。修改方案:将变量修改方案:将变量 x 设为私有设为私有!$OM

52、P PARALLEL DO private(x)DO i=1,n x=A(i)B(i)=2*sin(x)ENDDO!$OMP END PARALLEL DO51PRIVATE/SHAREDPRIVATE(list)指定一个或多个变量为私有变量,即在每个线程指定一个或多个变量为私有变量,即在每个线程中都创建一个同名中都创建一个同名局部变量局部变量,但没有初始值,但没有初始值SHARED(list)指定一个或多个变量为共享变量,即所有线程都指定一个或多个变量为共享变量,即所有线程都可以访问这些变量可以访问这些变量DEFAULT(.)指定并行域内的变量的缺省属性,可设为指定并行域内的变量的缺省属性,

53、可设为 private,shared,none,默认是,默认是 sharedFIRSTPRIVATE(list)指定一个或多个变量为私有变量,指定一个或多个变量为私有变量,并且私有变量并且私有变量在进入并行域时,将主线程中的同名变量的值作在进入并行域时,将主线程中的同名变量的值作为初值为初值LASTPRIVATE(list)指定将线程中的私有变量的指定将线程中的私有变量的“最后最后”的值在并行的值在并行处理结束后复制到主线程中的同名变量中处理结束后复制到主线程中的同名变量中确定并行域内数据的公有或私有非常重要:影响程序的性能和正确性确定并行域内数据的公有或私有非常重要:影响程序的性能和正确性5

54、2PRIVATE/SHAREDl 如何决定哪些变量是共享哪些是私有?如何决定哪些变量是共享哪些是私有?例:例:每个线程初始共享数组的一列每个线程初始共享数组的一列!$OMP PARALLEL DO PRIVATE(i,col),SHARED(A,n)col=omp_get_thread_num()+1 do i=1,n A(i,col)=1.0 end do!$OMP END PARALLEL DOl 通常循环变量、临时变量、写变量一般是私有的;通常循环变量、临时变量、写变量一般是私有的;l 数组变量、仅用于读的变量通常是共享的数组变量、仅用于读的变量通常是共享的l 缺省所有变量是共享的缺省所

55、有变量是共享的l DEFAULT(none):所有变量必须显式指定是私有或共享:所有变量必须显式指定是私有或共享53REDUCTIONl 规约操作规约操作 REDUCTION指定一个或多个变量是私有的,并且在并行处理结束后对这些变量执行指定一个或多个变量是私有的,并且在并行处理结束后对这些变量执行指定的归约操作(如求和),然后将结果返回给主线程中的同名变量指定的归约操作(如求和),然后将结果返回给主线程中的同名变量mysum=0;$OMP PARALLEL REDUCTION(+:mysum),PRIVATE(i,col)col=omp_get_thread_num()+1 do i=1,n

56、mysum=mysum+A(i,col)end do$OMP END PARALLELl 在在 Reduction 子句中,编译器为每个线程创建变量子句中,编译器为每个线程创建变量 mysum 的私有副本的私有副本l 当循环完成后,将这些值加在一起并把结果放到原始变量当循环完成后,将这些值加在一起并把结果放到原始变量 mysum 中中l Reduction 中的中的 op 操作可以是:操作可以是:+,-,*,.and.,.or.,.eqv.,.neqv.和内置函数和内置函数 max,min,iand,ior,ieor 54REDUCTION+*-.and.or.eqv.neqv010.true

57、.false.true.false.maxminiand(位运算)(位运算)ior(位运算)(位运算)ieor(位运算)(位运算)smallest representable numberlargest representable numberall bits on00 l 规约操作时私有变量的初始值规约操作时私有变量的初始值55ixaih举例:举例:PI1204 d1xx n 中点法:中点法:11()2nbiiaixxf x dxhf bahn n 梯形法:梯形法:11()2nbiiaifxfxf x dxh 56PI 串行程序串行程序program mainimplicit nonerea

58、l(8),parameter:pi=3.14159265358979323846D0real(8):mypi,h,mysum=0.0D0,xinteger:n,in=1000000h=1.0D0/ndo i=1,n x=h*(dble(i)-0.5D0)mysum=mysum+f(x)enddomypi=h*mysumcontains function f(x)real(8):f,x f=4.d0/(1.d0+x*x)end function fend program57PI 并行程序并行程序program main !使用使用 PARALLEL 制导指令,制导指令,SPMD 模式模式 imp

59、licit noneinteger,parameter:n_threads=4real(8),parameter:pi=3.14159265358979323846D0real(8):mypi=0.0D0,h,mysum(n_threads)=0.0D0,xinteger:n=1000000,i,myidh=1.0D0/n!$OMP PARALLEL NUM_THREADS(n_threads)PRIVATE(myid,i,x)myid=omp_get_thread_num()+1;do i=myid,n,n_threads x=h*(dble(i)-0.5D0)mysum(myid)=mys

60、um(myid)+f(x)enddo!$OMP END PARALLELdo i=1,n_threads mypi=mypi+mysum(i)enddomypi=h*mypicontains function f(x)real(8):f,x f=4.d0/(1.d0+x*x)end function fend program58PI 并行程序并行程序program main !使用制导指令使用制导指令 DOimplicit noneinteger,parameter:n_threads=4real(8),parameter:pi=3.14159265358979323846D0real(8):

61、mypi=0.D0,h,mysum(n_threads)=0.0D0,x,t0,t1integer:n=1000000,i,myidh=1.0D0/n!$OMP PARALLEL NUM_THREADS(n_threads)PRIVATE(myid,i,x)myid=omp_get_thread_num()+1;!$OMP DO do i=1,n x=h*(dble(i)-0.5D0)mysum(myid)=mysum(myid)+f(x)enddo!$OMP END DO!$OMP END PARALLELdo i=1,n_threads mypi=mypi+mysum(i)end domy

62、pi=h*mypicontains function f(x)real(8):f,x f=4.d0/(1.d0+x*x)end function fend program59PI 并行程序并行程序program main !使用使用 REDUCTIONimplicit noneinteger,parameter:n_threads=4real(8),parameter:pi=3.14159265358979323846D0real(8):mypi=0.D0,h,mysum,x,t0,t1integer:n=1000000,i,myidh=1.0D0/n!$OMP PARALLEL NUM_TH

63、READS(n_threads)PRIVATE(myid,i,x)&!$OMP REDUCTION(+:mysum)myid=omp_get_thread_num()+1;do i=myid,n,n_threads x=h*(dble(i)-0.5D0)mysum=mysum+f(x)enddo!$OMP END PARALLELmypi=h*mysumcontains function f(x)real(8):f,x f=4.d0/(1.d0+x*x)end function fend program60作业作业n 编写编写梯形法梯形法计算计算 PI 的串行和并行程序(的串行和并行程序(n=108)l 在每个程序的第一行以注解语句形式写上学号与姓名,如在每个程序的第一行以注解语句形式写上学号与姓名,如 !1234567890-张三张三l 程序分别命名为程序分别命名为 pi_trap.f90 (串行程序串行程序)pi_trap_openmp.f90 (SPMD并行)并行)pi_trap_openmp_do.f90 (DO指令并行)指令并行)pi_trap_openmp_reduction.f90(REDUCTION并行)并行)l 10月月8日日前将程序发送至前将程序发送至 l 邮件主题:邮件主题:学号学号-姓名姓名

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!