OpenMP-API-用户指南.pdf

上传人:本田雅阁 文档编号:2487310 上传时间:2019-04-03 格式:PDF 页数:72 大小:608.26KB
返回 下载 相关 举报
OpenMP-API-用户指南.pdf_第1页
第1页 / 共72页
OpenMP-API-用户指南.pdf_第2页
第2页 / 共72页
OpenMP-API-用户指南.pdf_第3页
第3页 / 共72页
OpenMP-API-用户指南.pdf_第4页
第4页 / 共72页
OpenMP-API-用户指南.pdf_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《OpenMP-API-用户指南.pdf》由会员分享,可在线阅读,更多相关《OpenMP-API-用户指南.pdf(72页珍藏版)》请在三一文库上搜索。

1、Sun Microsystems, Inc. 请将关于本文档的意见和建议提交至:http:/ OpenMP API 用户指南 Sun Studio 11 文件号码 819-4818-10 2005 年 11 月,修订版 A 版权所有 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利。 美国政府权利 商业用途。政府用户应遵循 Sun Microsystems, Inc. 的标准许可协议,以及 FAR (Federal Acquisition Regulat

2、ions,即 “联邦 政府采购法规” )的适用条款及其补充条款。必须依据许可证条款使用。 本发行版可能包含由第三方开发的内容。 本产品的某些部分可能是从 Berkeley BSD 系统衍生出来的, 并获得了加利福尼亚大学的许可。 UNIX 是 X/Open Company, Ltd. 在美国和其他国 家/地区独家许可的注册商标。 Sun、Sun Microsystems、Sun 徽标、Java 和 JavaHelp 是 Sun Microsystems, Inc. 在美国和其他国家/地区的商标或注册商标。所有的 SPARC 商 标的使用均已获得许可,它们是 SPARC Internationa

3、l, Inc. 在美国和其他国家/地区的商标或注册商标。标有 SPARC 商标的产品均基于由 Sun Microsystems, Inc. 开发的体系结构。 本服务手册所介绍的产品以及所包含的信息受美国出口控制法制约,并应遵守其他国家/地区的进出口法律。严禁将本产品直接或间接地用于核 设施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户。严禁出口或转口到美国 禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民。 本文档按 “原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适

4、用性或非侵权性的默示保证,均不承担任何责任,除非 此免责声明的适用范围在法律上无效。 iii 目录 阅读本书之前ix 印刷约定ix Shell 提示符x 支持的平台x 访问 Sun Studio 软件和手册页xi 访问编译器和工具文档xiii 访问相关的 Solaris 文档xv 开发者资源xvi 联系 Sun 技术支持xvi Sun 欢迎您提出意见xvi 1.OpenMP API 简介11 1.1哪里有 OpenMP 规范11 1.2本章所使用的特殊约定12 2.嵌套并行操作21 2.1执行模型21 2.2控制嵌套并行操作22 2.2.1OMP_NESTED22 2.2.2SUNW_MP_M

5、AX_POOL_THREADS23 iv OpenMP API 用户指南 2005 年 11 月 2.2.3SUNW_MP_MAX_NESTED_LEVELS24 2.3在嵌套并行区域中使用 OpenMP 库例程27 2.4有关使用嵌套并行操作的一些提示210 3.自动确定变量的作用域31 3.1自动确定作用域数据范围子句31 3.1.1_AUTO 子句31 3.1.2DEFAULT(_AUTO) 子句32 3.2作用域规则32 3.2.1标量变量的作用域规则32 3.2.2数组的作用域规则33 3.3关于自动确定作用域的通用注释33 3.3.1Fortran 95 的自动确定作用域规则: 3

6、3 3.3.2C/C+ 的自动确定作用域规则: 33 3.4检查自动确定作用域的结果34 3.5当前实现的已知限制38 4.实现定义的行为41 5.OpenMP 编译51 5.1要使用的编译器选项51 5.2Fortran 95 OpenMP 验证53 5.3OpenMP 环境变量54 5.4处理器绑定57 5.5栈和栈大小510 6.转换为 OpenMP61 6.1转换传统 Fortran 指令61 6.1.1转换 Sun 风格的 Fortran 指令62 6.1.2转换 Cray 风格的 Fortran 指令63 目录v 6.2转换传统 C Pragma64 6.2.1传统 C Pragm

7、a 与 OpenMP 间的问题65 7.性能注意事项71 7.1一般性建议71 7.2伪共享及其避免方法74 7.2.1何为伪共享?74 7.2.2减少伪共享75 7.3操作系统优化功能75 A.子句在指令中的放置A1 索引索引 1 vi OpenMP API 用户指南 2005 年 11 月 vii 表 表 5-1OpenMP 环境变量54 表 5-2多重处理环境变量55 表 6-1将 Sun 并行化指令转换为 OpenMP62 表 6-2DOALL 限定符子句和等效的 OpenMP 子句62 表 6-3SCHEDTYPE 调度和等效的 OpenMP schedule 子句63 表 6-4C

8、ray 风格的 DOALL 限定符子句的等效 OpenMP 子句63 表 6-5将传统 C 并行化 Pragma 转换为 OpenMP64 表 6-6taskloop 可选子句和等效的 OpenMP 子句65 表 6-7SCHEDTYPE 调度和等效的 OpenMP schedule65 表 A-1拥有子句的 PragmaA1 viii OpenMP API 用户指南 2005 年 11 月 ix 阅读本书之前 OpenMP API 用户指南 概述了用于生成多重处理应用程序的 OpenMP Fortran 95、 C 和 C+ 应用程序接口 (API)。 Sun Studio 编译器支持 Op

9、enMP API。 本指南专供具有 Fortran、C 或 C+ 语言及 OpenMP 并行编程模型工作经验的科学工作 者、工程技术人员以及编程人员使用。通常,还假定他们熟悉 Solaris 操作环境或 UNIX。 印刷约定 表表 P-1 字体约定 字体字体1 1 浏览器的设置可能会与这些设置不同。 含义示例含义示例 AaBbCc123 命令、 文件和目录的名称;计算机屏 幕输出。 编辑 .login 文件。 使用 ls -a 列出所有文件。 % You have mail. AaBbCc123 用户键入的内容, 与计算机屏幕输出 的显示不同。 % su Password: AaBbCc123

10、 保留未译的新词或术语以及要强调 的词。 要使用实名或值替换的命令行 变量。 这些称为 class 选项。 要删除文件,请键入 rm filename。 新词术语强调新词或术语以及要强调的词。您必须成为超级用户才能执行此操作。 书名书名阅读 用户指南的第 6 章。 x OpenMP API 用户指南 2005 年 11 月 Shell 提示符 支持的平台 此 Sun Studio 发行版本支持使用 SPARC 和 x86 系列处理器体系结构(UltraSPARC、 SPARC64、 AMD64、 Pentium 和 Xeon EM64T)的系统。通过访问 http:/ 中的硬件兼容性列表,可以

11、了解您在使用的 Solaris 操作系统版本的支持系统。这些文档列出了实现各个平台类型的所有差别。 在本文档中,这些与 x86 有关的术语具有以下含义: “x86” 是指较大的 64 位和 32 位 x86 兼容产品系列。 “x64” 表示有关 AMD64 或 EM64T 系统的特定 64 位信息。 “32 位 x86”表示有关基于 x86 的系统的特定 32 位信息。 有关所支持的系统,请参见硬件兼容性列表。 表表 P-2 代码约定 代码符号含义表示法代码示例代码符号含义表示法代码示例 方括号包含可选参数。 On-O4, -O 花括号中包含所需选项的选项 集合。 dy|n-dy | 分隔变量

12、的 “|” 或 “-” 符号, 只能选择其一。 Bdynamic|static-Bstatic : 与逗号一样,分号有时可用于 分隔参数。 Rdir:dir-R/local/libs:/U/a 省略号表示一系列的省略。 -xinline=f1,fn-xinline=alpha,dos Shell 提示符提示符 C shell machine-name% C shell 超级用户 machine-name# Bourne shell 和 Korn shell $ Bourne shell 和 Korn shell 超级用户 # 阅读本书之前xi 访问 Sun Studio 软件和手册页 Sun

13、Studio 软件及其手册页未安装到 /usr/bin/ 和 /usr/share/man 标准目录中。 要访问该软件,必须正确设置 PATH 环境变量(请参见 第 xi 页的“访问软件” ) 。要访 问手册页,必须正确设置 MANPATH 环境变量 (请参见第 xii 页的 “访问手册页” ) 。 有关 PATH 变量的详细信息,请参见 csh(1)、 sh(1)、 ksh(1) 和 bash(1) 手册页。有关 MANPATH 变量的详细信息,请参见 man(1) 手册页。有关设置 PATH 变量和 MANPATH 变 量以访问此发行版本的详细信息,请参见安装指南或询问系统管理员。 注注

14、本节中的信息假设 Sun Studio 软件安装在 Solaris 平台上的 /opt 目录和 Linux 平 台上的 /opt/sun 目录中。如果未将软件安装在默认的目录中,请询问系统管理员以获 取系统中的相应路径。 访问软件 使用以下步骤决定是否需要更改 PATH 变量以访问该软件。 决定是否需要设置 PATH 环境变量 1. 通过在命令提示符后键入以下内容以显示 PATH 变量的当前值。 2. 在 Solaris 平台上,查看输出中是否包含有 /opt/SUNWspro/bin 的路径字符串。在 Linux 平台上,查看输出中是否包含有 /opt/sun/sunstudio11/bin

15、 的路径字符串。 如果找到该路径,则说明已设置了访问该软件的 PATH 变量。如果没有找到该路径,则按 照下一步中的说明设置 PATH 环境变量。 设置 PATH 环境变量以访问软件 在 Solaris 平台上, 将以下路径添加到 PATH 环境变量中。 如果以前安装了 Forte Developer 软件、Sun ONE Studio 软件、或其他发行版本的 Sun Studio 软件,则将以下路径添加到 这些软件安装路径之前。 /opt/SUNWspro/bin % echo $PATH xii OpenMP API 用户指南 2005 年 11 月 在 Linux 平台上,将以下路径添加

16、到 PATH 环境变量中。 /opt/sun/sunstudio10u1/bin 访问手册页 使用以下步骤决定是否需要更改 MANPATH 变量以访问手册页。 决定是否需要设置 MANPATH 环境变量 1. 通过在命令提示符后键入以下内容以请求 dbx 手册页。 2. 请查看输出 (如果有) 。 如果找不到 dbx(1) 手册页或者显示的手册页不是软件当前版本的手册页,请按照下一步 的说明来设置 MANPATH 环境变量。 设置 MANPATH 环境变量以实现对手册页的访问 在 Solaris 平台上,将以下路径添加到 MANPATH 环境变量中。 /opt/SUNWspro/man 在 L

17、inux 平台上,将以下路径添加到 MANPATH 环境变量中。 /opt/sun/sunstudio11/man 访问集成开发环境 Sun Studio 集成开发环境 (integrated development environment, IDE) 提供了创建、编 辑、生成、调试 C、 C+ 或 Fortran 应用程序并分析其性能的模块。 启动 IDE 的命令是 sunstudio。有关该命令的详细信息,请参见 sunstudio(1) 手册页。 IDE 是否可以正确操作取决于 IDE 能否找到核心平台。 sunstudio 命令会查找两个位 置的核心平台: 该命令首先查找 Solari

18、s 平台上的默认安装目录 /opt/netbeans/3.5V11 和 Linux 平台上的默认安装目录 /opt/sun/netbeans/3.5V11。 % man dbx 阅读本书之前xiii 如果该命令在默认目录中找不到核心平台,则它会假设包含 IDE 的目录和包含核心平 台的目录均安装在同一位置上。例如,在 Solaris 平台上,如果包含 IDE 的目录的路 径是 /foo/SUNWspro,则该命令会在 /foo/netbeans/3.5V11 中查找核心平台。 在 Linux 平台上,如果包含 IDE 的目录的路径是 /foo/sunstudio11,则该命令会 在 /foo/

19、netbeans/3.5V11 中查找核心平台。 如果核心平台未安装在 sunstudio 命令查找它的任一位置上,则客户端系统上的每个 用户必须将环境变量 SPRO_NETBEANS_HOME 设置为安装核心平台的位置 (/installation_directory/netbeans/3.5V11)。 在 Solaris 平台上,IDE 的每个用户还必须将 /installation_directory/SUNWspro/bin 添 加到其他任何 Forte Developer 软件、 Sun ONE Studio 软件或 Sun Studio 软件发行版 本路径前面的用户 $PATH 中

20、。在 Linux 平台上, IDE 的每个用户还必须将 /installation_directory/sunstudio11/bin 添加到其他任何 Sun Studio 软件发行版本 路径前面的用户 $PATH 中。 路径 /installation_directory/netbeans/3.5V11/bin 不能添加到用户的 $PATH 中。 访问编译器和工具文档 您可以访问以下位置的文档: 可以通过随软件一起安装在本地系统或网络中的文档索引获取文档, 位置为 Solaris 平 台上的 file:/opt/SUNWspro/docs/zh/index.html 和 Linux 平台上的

21、 file:/opt/sun/sunstudio11/docs/zh/index.html。 如果软件未安装在 Solaris 平台的 /opt 目录或 Linux 平台的 /opt/sun 目录中, 请 询问系统管理员以获取系统中的相应路径。 大多数的手册都可以从 sm Web 站点上获取。以下书目只能从 Solaris 平台上安装的软件中找到: 标准 C+ 库类参考 标准 C+ 库用户指南 Tools.h+ 类库参考 Tools.h+ 用户指南 适用于 Solaris 平台和 Linux 平台的发行说明可以从 Web 站点获取。 在 IDE 中通过“帮助”菜单以及许多窗口和对话框中的“帮

22、助”按钮,可以访问 IDE 的所有组件的联机帮助。 您可以通过 Internet 访问 Web 站点 (http:/) 以阅 读、打印和购买 Sun Microsystems 的各种手册。如果找不到手册,请参见与软件一起安 装在本地系统或网络中的文档索引。 xiv OpenMP API 用户指南 2005 年 11 月 注注 Sun 对本文档中提到的第三方 Web 站点的可用性不承担任何责任。 对于此类站点或 资源中的(或通过它们获得的)任何内容、广告、产品或其他资料,Sun 并不表示认可, 也不承担任何责任。对于因使用或依靠此类站点或资源中的 (或通过它们获得的)任何 内容、物品或服务而造

23、成的或连带产生的实际或名义损坏或损失,Sun 概不负责,也不承 担任何责任。 使用易读格式的文档 该文档采用易读格式提供, 以方便残障用户使用辅助技术进行阅读。 您还可以按照下表所 述,找到文档的易读版本。如果未将软件安装在 /opt 目录中,请询问系统管理员以获取 系统中的相应路径。 文档类型易读版本的格式和位置文档类型易读版本的格式和位置 手册 (第三方手册除外)HTML,位于 http:/ 第三方手册: 标准 C+ 库类参考 标准 C+ 库用户指南 Tools.h+ 类库参考 Tools.h+ 用户指南 安装软件所包含的 HTML,位于 Solaris 平台上的文档索引 file:/op

24、t/SUNWspro/docs/zh/index.html 中 自述文件HTML,位于开发者门户 http:/ ation/ss11/mr/READMEs 中 手册页安装软件所包含的 HTML,位于 Solaris 平台的文档索引 file:/opt/SUNWspro/docs/zh/index.html 和 Linux 平 台的文档索引 file:/opt/sun/sunstudio11/docs/index.html 中 联机帮助HTML,可通过 IDE 中的 “帮助”菜单和 “帮助”按钮访问 发行说明HTML,位于 http:/ 阅读本书之前xv 相关编译器和工具文档 下表描述的相关文档

25、可以通过 file:/opt/SUNWspro/docs/zh/index.html 和 http:/ 站点获取。如果未将软件安装在 /opt 目录中,请询问系统管 理员以获取系统中的相应路径。 访问相关的 Solaris 文档 下表描述了可从 Web 站点上获取的相关文档。 文档标题描述文档标题描述 Fortran 编程指南描述了如何在 Solaris 环境中编写高效的 Fortran 代码;并且描 述了输入 / 输出、库、性能、调试和并行处理信息。 Fortran 库参考详细说明了 Fortran 库和内部例程 Fortran 用户指南描述了 f95 编译器的编译时环境和命令行选项。还包

26、括了关于 将以前的 f77 程序迁移到 f95 中的说明。 C 用户指南描述了 cc 编译器的编译时环境和命令行选项。 C+ 用户指南描述了 CC 编译器的编译时环境和命令行选项。 数值计算指南描述了关于浮点计算数值精确性的问题。 文档集合文档标题描述文档集合文档标题描述 Solaris 参考手册集合请参见手册页部分的标题。提供有关 Solaris 操作系统的 信息。 Solaris 软件开发者集合链接程序和库指南描述了 Solaris 链接编辑器和 运行时链接程序的操作。 Solaris 软件开发者集合多线程编程指南涵盖 POSIX 和 Solaris 线程 API、 使用同步对象进行程序设

27、计、编译 多线程程序和多线程程序的查找工 具。 xvi OpenMP API 用户指南 2005 年 11 月 开发者资源 访问 http:/ 以查找以下经常更新的资源: 有关编程技术和最佳实例的文章 有关编程小技巧的知识库 有关编译器和工具组件的文档以及与软件安装在一起的文档的修正内容 有关支持级别的信息 用户论坛 可下载的代码样例 新技术预览 您可以通过访问 http:/ 找到其他开发者资源。 联系 Sun 技术支持 如果您遇到通过本文档无法解决的技术问题,请访问以下网址: http:/ Sun 欢迎您提出意见 Sun 致力于提高其文档的质量, 并十分乐意收到您的意见和建议。 您可以通过以

28、下网址提 交您的意见和建议: http:/ 请在您的电子邮件主题行中注明文档的文件号码 (819-4818-10)。 1-1 第第 1 章章 OpenMP API 简介 OpenMP 应用程序接口是与多家计算机供应商联合开发的、针对共享内存多处理器体 系结构的可移植并行编程模型。 其规范由 “OpenMP 体系结构审核委员会” 创立并公布。 OpenMP API 是 Solaris 操作系统平台上所有 Sun Studio 编译器的建议并行编程模 型。有关将传统 Fortran 和 C 并行化指令转换为 OpenMP 指令的指导,请参见第 6 章。 1.1哪里有 OpenMP 规范 本手册所提

29、供的材料描述了 OpenMP API 的 Sun Studio 实现所特有的问题。有关完整 的详细信息,请参阅 OpenMP 规范文档。本手册直接引用了 OpenMP 2.5 API 规范中的 部分。 C、 C+ 和 Fortran 95 的 OpenMP 2.5 规范可通过访问 OpenMP 官方网站 http:/www.openmp.org/ 获取。 有关 OpenMP 的其他信息 (包括教程和其他开发者资源)可通过访问 cOMPunity 网站 http:/punity.org/ 获取。 有关 Sun Studio 编译器发行版本及其 OpenMP API 实现的最新信息可通过访问 Su

30、n Developer Network 门户 http:/ 获取。 1-2 OpenMP API 用户指南 2005 年 11 月 1.2本章所使用的特殊约定 在以下表格和示例中,Fortran 指令和源代码虽以大写形式出现, 但实际上不区分大小写。 结构化块 指无进或出传输的 Fortran 或 C/C+ 语句块。 方括号 . 内的构造为可选构造。 本手册中, “Fortran” 指 Fortran 95 语言和编译器 f95。 本手册中, “指令”和 “Pragma” 互换使用。 2-1 第第 2 章章 嵌套并行操作 本章讨论 OpenMP 嵌套并行操作特性。 2.1执行模型 OpenMP

31、 采用 fork-join (分叉 - 合并)并行执行模式。线程遇到并行构造时,就会创建 由其自身及其他一些额外 (可能为零个)线程组成的线程组。遇到并行构造的线程成为 新组中的主线程。 组中的其他线程称为组的从属线程。 所有组成员都执行并行构造内的代 码。 如果某个线程完成了其在并行构造内的工作, 它就会在并行构造末尾的隐式屏障处等 待。当所有组成员都到达该屏障时,这些线程就可以离开该屏障了。主线程继续执行并行 构造之后的用户代码,而从属线程则等待被召集加入到其他组。 OpenMP 并行区域之间可以互相嵌套。如果禁用嵌套并行操作,则由遇到并行区域内并 行构造的线程所创建的新组仅包含遇到并行构

32、造的线程。 如果启用嵌套并行操作, 则新组 可以包含多个线程。 OpenMP 运行时库维护一个线程池,该线程池可用作并行区域中的从属线程。当线程遇 到并行构造并需要创建包含多个线程的线程组时, 该线程将检查该池, 从池中获取空闲线 程,将其作为组的从属线程。如果池中没有足够的空闲线程,则主线程获取的从属线程可 能会比所需的要少。组完成执行并行区域时,从属线程就会返回到池中。 2-2 OpenMP API 用户指南 2005 年 11 月 2.2控制嵌套并行操作 通过在执行程序前设置各种环境变量,可以在运行时控制嵌套并行操作。 2.2.1OMP_NESTED 可通过设置 OMP_NESTED 环

33、境变量或调用 omp_set_nested() 来启用或禁用嵌套并 行操作。 以下示例说明在启用嵌套并行操作时包含多个执行嵌套并行区域的线程的组。 代码示例代码示例 2-1 嵌套并行操作示例 #include #include void report_num_threads(int level) #pragma omp single printf(“Level %d:number of threads in the team - %dn“, level, omp_get_num_threads(); int main() omp_set_dynamic(0); #pragma omp para

34、llel num_threads(2) report_num_threads(1); #pragma omp parallel num_threads(2) report_num_threads(2); #pragma omp parallel num_threads(2) report_num_threads(3); return(0); 嵌套并行操作2-3 启用嵌套并行操作时,编译和运行此程序会产生以下输出: 比较禁用嵌套并行操作时运行相同程序的输出结果: 2.2.2SUNW_MP_MAX_POOL_THREADS OpenMP 运行时库维护一个线程池,该线程池可用作并行区域中的从属线程。

35、设置 SUNW_MP_MAX_POOL_THREADS 环境变量可控制池中线程的数量。默认值是 1023。 线程池只包含运行时库创建的非用户线程。它不包含初始线程或用户程序显式创建的任何 线程。如果将此环境变量设置为零,则线程池为空,并且的并行区域均由一个线程执行。 % setenv OMP_NESTED TRUE % a.out Level 1:number of threads in the team -2 Level 2:number of threads in the team -2 Level 2:number of threads in the team -2 Level 3:nu

36、mber of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threads in the team -2 % setenv OMP_NESTED FALSE % a.out Level 1:number of threads in the team -2 Level 2:number of threads in the team - 1 Level 3:number of threads in

37、the team - 1 Level 2:number of threads in the team - 1 Level 3:number of threads in the team - 1 2-4 OpenMP API 用户指南 2005 年 11 月 以下示例说明如果池中没有足够的线程, 并行区域可能获取较少的线程。 代码与上面的代 码相同。使所有并行区域同时处于活动状态所需的线程数为 8 个。池需要包含至少 7 个 线程。如果将 SUNW_MP_MAX_POOL_THREADS 设置为 5,则四个最里面的并行区域中的 两个区域可能无法获取所请求的所有从属线程。一种可能的结果如下所示。

38、2.2.3SUNW_MP_MAX_NESTED_LEVELS 环境变量 SUNW_MP_MAX_NESTED_LEVELS 控制需要多个线程的嵌套活动并行区域的最 大深度。 活动嵌套深度大于此环境变量值的任何活动并行区域将仅由一个线程来执行。如果并行 区域是 OpenMP 并行区域,且该并行区域的 IF 子句(如果指定)的值为 True,则视该 并行区域为活动区域。仅对活动并行区域进行计算。默认的最大活动嵌套级别数为 4。 以下代码将创建 4 个级别的嵌套并行区域。如果将 SUNW_MP_MAX_NESTED_LEVELS 设 置为 2,则嵌套深度为 3 和 4 的嵌套并行区域将由单个线程来执

39、行。 % setenv OMP_NESTED TRUE % setenv SUNW_MP_MAX_POOL_THREADS 5 % a.out Level 1:number of threads in the team -2 Level 2:number of threads in the team -2 Level 2:number of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threa

40、ds in the team - 1 Level 3:number of threads in the team - 1 嵌套并行操作2-5 使用最大嵌套级别 4 来编译和运行此程序会产生以下可能的输出。 (实际结果将取决于操 作系统调度线程的方式。 ) #include #include #define DEPTH 5 void report_num_threads(int level) #pragma omp single printf(“Level %d:number of threads in the team - %dn“, level, omp_get_num_threads();

41、 void nested(int depth) if (depth = DEPTH) return; #pragma omp parallel num_threads(2) report_num_threads(depth); nested(depth+1); int main() omp_set_dynamic(0); omp_set_nested(1); nested(1); return(0); 2-6 OpenMP API 用户指南 2005 年 11 月 使用设置为 2 的嵌套级别来运行产生以下可能的结果: 这些示例仅显示了一些可能的结果。实际结果将取决于操作系统调度线程的方式。 %

42、 setenv SUNW_MP_MAX_NESTED_LEVELS 4 % a.out |sort +2n Level 1:number of threads in the team -2 Level 2:number of threads in the team -2 Level 2:number of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threads in the team -2 Level 3:number of threads in the team -2

43、Level 3:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:number of threads in the team -2 Level 4:numbe

44、r of threads in the team -2 Level 4:number of threads in the team -2 % setenv SUNW_MP_MAX_NESTED_LEVELS 2 % a.out |sort +2n Level 1:number of threads in the team -2 Level 2:number of threads in the team -2 Level 2:number of threads in the team -2 Level 3:number of threads in the team - 1 Level 3:num

45、ber of threads in the team - 1 Level 3:number of threads in the team - 1 Level 3:number of threads in the team - 1 Level 4:number of threads in the team - 1 Level 4:number of threads in the team - 1 Level 4:number of threads in the team - 1 Level 4:number of threads in the team - 1 嵌套并行操作2-7 2.3在嵌套并

46、行区域中使用 OpenMP 库例程 在嵌套并行区域中调用以下 OpenMP 例程需要仔细斟酌。 - omp_set_num_threads() - omp_get_max_threads() - omp_set_dynamic() - omp_get_dynamic() - omp_set_nested() - omp_get_nested() “set” 调用只影响调用同一级或内部嵌套级别的线程所遇到的并行区域。它们不影响其他 线程遇到的并行区域,也不影响调用线程稍后在任何外部级别所遇到的并行区域。 “get” 调用将返回由调用线程设置的值。创建组后,从属线程将继承主线程的值。 2-8 Op

47、enMP API 用户指南 2005 年 11 月 代码示例代码示例 2-2 在并行区域中调用 OpenMP 例程 #include #include int main() omp_set_nested(1); omp_set_dynamic(0); #pragma omp parallel num_threads(2) if (omp_get_thread_num() = 0) omp_set_num_threads(4); /* 行 A */ else omp_set_num_threads(6); /* 行 B */ /* 以下语句将打印 * * 0: 2 4 * 1: 2 6 * * omp_get_num_threads() 返回组中的线程数 * 因此,对于 * 组中的两个线程来说情况是相同的。 */ printf(“%d:%d %dn“, omp_get_thread_num(), omp_get_num_threads(), omp_get_max_threads(); /* 将创建两个内部的并行区域 * 一个区域带有包含 4 个线程的组; * 另一个区域带有包含 6 个线程的组。 */ #pragma omp parallel #pragma omp master

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1