OpenMP编程基础.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenMP编程基础.doc

OpenMP 编程基础 2014-04-03 11:25:49|??分类:?并行计算|举报|字号?订阅 ??????? 可以说 OpenMP 制导指令将 C 语言扩展为一个并行语言,但 OpenMP 本身不是一种独立的并行语言,而是为多处理器上编写并行程序而设计的、指导共享内存、多线程并行的编译制导指令和应用程序编程接口(API),可在 C/C++和 Fortran(77、90 和 95)中应用,并在串行代码中以编译器可识别的注释形式出现。OpenMP 标准是由一些具有国际影响力的软件和硬件厂商共同定义和提出,是一种在共享存储体系结构的可移植编程模型,广泛应用于 Unix、Linux、 Windows 等多种平台上。 本章讲述与 C 语言绑定的 OpenMP1并行程序设计的基础知识,包括 OpenMP 基本要素、 编译制导指令(Compiler Directive)、运行库函数(Runtime Library)和环境变量(Environment Variables)。 ? 2.1?? OpenMP 基本概念 ? 首先来了解 OpenMP 的执行模式和三大要素。 ? 2.1.1???? 执行模式 ? OpenMP 的执行模型采用 fork-join 的形式,其中 fork 创建新线程或者唤醒已有线程;join 即多线程的会合。fork-join 执行模型在刚开始执行的时候,只有一个称为“主线程”的运行线 程存在。主线程在运行过程中,当遇到需要进行并行计算的时候,派生出线程来执行并行任务。 在并行执行的时候,主线程和派生线程共同工作。在并行代码执行结束后,派生线程退出或者阻塞,不再工作,控制流程回到单独的主线程中。?? OpenMP 的编程者需要在可并行工作的代码部分用制导指令向编译器指出其并行属性,而且这些并行区域可以出现嵌套的情况,如图 2.1 所示。下面对术语并行域(Paralle region)作如下定义:在成对的 fork 和 join 之间的区域,称为并行域,它既表示代码也表示执行时间区间。对 OpenMP 线程作如下定义:在 OpenMP 程序中用于完成计算任务的一个执行流的执行实体,可以是操作系统的线程也可以是操作系统上的进程。 ? 2.1.2???? OpenMP 编程要素 ? OpenMP 编程模型以线程为基础,通过编译制导指令来显式地指导并行化,OpenMP 为编 程人员提供了三种编程要素来实现对并行化的完善控制。它们是编译制导、API 函数集和环境 变量。 ? 编译制导 在 C/C++程序中,OpenMP 的所有编译制导指令是以#pragma omp 开始,后面跟具体的功能指令(或命令),其具有如下形式: #pragma omp? 指令 [子句[,? 子句]? ?] 支持 OpenMP 的编译器能识别、处理这些制导指令并实现其功能。其中指令或命令是可 以单独出现的,而子句则必须出现在制导指令之后。制导指令和子句按照功能可以大体上分成四类: 1)并行域控制类; 2)任务分担类; 3)同步控制类; 4)数据环境类。 并行域控制类指令用于指示编译器产生多个线程以并发执行任务,任务分担类指令指示编译器如何给各个并发线程分发任务,同步控制类指令指示编译器协调并发线程之间的时序约束关系,数据环境类指令处理并行域内外的变量共享或私有属性以及边界上的数据传送操作等。 下面简单地介绍一下制导指令和相关的子句,现在不必完全弄懂它们的作用,只需大概了解即可,后面还将有详细的使用说明。此处的内容可以作为学习过程中的速查表。 1)版本为 2.5 的 OpenMP 规范中的指令有以下这些: ?parallel:用在一个结构块之前,表示这段代码将被多个线程并行执行; for:用于 for 循环语句之前,表示将循环计算任务分配到多个线程中并行执行,以实现任务分担,必须由编程人员自己保证每次循环之间无数据相关性; parallel? for:parallel? 和 for 指令的结合,也是用在 for 循环语句之前,表示 for循环体的代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能; sections:用在可被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用 section 指令标出(注意区分 sections 和 section); parallel sections:parallel 和 sections 两个语句的结合,类似于 parallel for; single:用在并行域内,表示一段只被单个线程执行的代码; critical:用在一段代码临界区之前,保证每次只有一个 OpenMP 线程进入; ?flush:保证各个 OpenMP 线程的数据映像的一致性; barrier:

文档评论(0)

ziyouzizai + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档