- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenMP并行编程介绍
一、OpenMP产生背景
OpenMP是国际上继MPI之后于I998年推出的工业标准。由DEC、IBM、lntel、KuckAssiciates、SGI等公司共同定义。它解决了不同并行计算机系统上应用系统难以移植的问题,将可移植性带到可缩放的、共享主存的程序设计之中。对不同的语言,有不同的OpenMP标准,现在基于C/C++和Fortran语言都已经更新至3.0版本。
OpenMP推出后,基本上每个包含共享体系结构的并行计算机的推出,都配置了该语言,而且多家厂商针对自己的体系结构特点还对OpenMP做了扩充,例如:COMPAQ公司扩充了分布、重分布、亲缘性调度等指标。OpenMP则应用于共享内存的并行计算平台,它是一组编译指导语句和可调用运行时库函数的集合,可被直接嵌入源程序而无需作较大的修改,编程简单,为任一现有软件的并行转换提供了一条渐进路径。
二、OpenMP原理与特征
OpenMP是一个为在共享存储的多处理机上编写并行程序而设计的应用编程接口,由一个小型的编译器命令集组成,包括一套编译制导语句和一个用来支持它的函数库。OpenMP是通过与标准Fortran,C和C++结合进行工作的,对于同步共享变量、合理分配负载等任务,都提供了有效的支持,具有简单通用、开发快速的特点。
OpenMP是可移植多线程应用程序开发的行业标准,在细粒度(循环级别)与粗粒度(函数级别)线程技术上具有很高的效率。对于将串行应用程序转换成并行应用程序,OpenMP指令是一种容易使用且作用强大的工具,它具有使应用程序因为在对称多处理器或多核系统上并行执行而获得大幅性能提升的潜力。OpmMP自动将循环线程化,提高多处理器系统上的应用程序性能。用户不必处理迭代划分、数据共享、线程调度及同步等低级别的细节。
OpenMP采用了共享存储中标准的并行模式fork—join,当程序开始执行时只有主线程存在,主线程执行程序的串行部分,通过派生出其他的线程来执行其他的并行部分。当重新执行程序的串行部分时,这些线程将终止。如图1所示。
三、OpenMP程序的设计与执行
书写OpenMP程序同书写C语言程序相似,只是在C程序中加入了OpenMP的编译指示,这些编译指示描述了程序应该以何种方式并行执行。加入了OpenMP指示的C程序可以由任意支持OpenMP的编译器编译,在不同平台的硬件上执行。OpenMP编译器命令以#pragma开始,在其后面是omp,名字和可选的子句,并用新行结束。某些子句可出现在不同的命令中,但需要对它们加以分别的定义。某些命令将作用于整个结构块,所谓的构造是由编译器命令及跟在其后的结构块所组成。在C/C++中,OpenMP指令使用格式是#pragma omp 指令[子句[子句]···]。
OpenMP编译制导包括并行域结构、共享任务结构、组合的并行共享任务和同步结构四类。并行域结构中并行域代码被所有的线程执行,通常使用#pragma omp parallel[子句[子句]···]这样的格式,常用的子句有firstprivate,if,lastprivate,private,reduction等。共享任务结构将它所包含的代码划分给线程组的各成员来执行,可分为并行for循环、并行sections、串行执行三种情况。并行for循环格式为#pragma ompfor[子句[[,]子句]···],一般用于for循环前,将循环分配到多个线程中并行执行。sections编译制导语句指定内部的代码被划分给线程组中的各线程,不同的section由不同的线程执行。用for语句来分摊是由系统自动进行,只要每次循环问没有时间上的差距,那么分摊是很均匀的,使用section来划分线程是一种手工划分线程的方式,最终并行性的好坏依赖于程序员 J。single编译制导语句用于内部部分代码不方便并行执行的情况,使用single编译制导语句指定这部分代码只有线程组中的一个线程执行,格式为#pragma ompsingle[子句[[,]子句]···],线程组中没有执行single语句的线程会一直等待代码块的结束,使用nowait子句除外。组合的并行共享任务分为parallel for和paralld sections编译制导语句,前者格式#pragma omp paralldfor[子句]表明一个并行域包含一个独立的for语句,后者格式#pragma omp parallel sections[子句?]表明一个并行域包含单独的一个sections语句。一般而言,因为使用parallel命令意味着需要多于一个线程,所以在使用命令前需要先建立线程组,同步结构中的编译指导语句有barrier,atomic,master,ordered,thread—private
文档评论(0)