版权所有 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利 美国政府权利 - 商业软件 政府用户应遵循 Sun Microsystems, Inc. 的标准许可

Size: px
Start display at page:

Download "版权所有 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利 美国政府权利 - 商业软件 政府用户应遵循 Sun Microsystems, Inc. 的标准许可"

Transcription

1 OpenMP API 用户指南 Sun Studio 10 Sun Microsystems, Inc. 文件号码 年 1 月, 修订 ( 版 ) A 请将有关本文档的意见和建议提交至 :

2 版权所有 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利 美国政府权利 - 商业软件 政府用户应遵循 Sun Microsystems, Inc. 的标准许可协议, 以及 FAR (Federal Acquisition Regulations, 即 联邦政府采购法规 ) 的适用条款及其补充条款 使用须遵守许可证条款 本发行可包含第三方开发的材料 本产品的某些部分可能是从 Berkeley BSD 系统衍生出来的, 并获得了加利福尼亚大学的许可 UNIX 是由 X/Open Company, Ltd. 在美国和其他国家 / 地区独家许可的注册商标 Sun Sun Microsystems Sun 徽标 Java 和 JavaHelp 是 Sun Microsystems, Inc. 在美国和其他国家 / 地区的商标或注册商标 所有的 SPARC 商标均需获得授权才能使用, 它们是 SPARC International, Inc. 在美国和其他国家 / 地区的商标或注册商标 标有 SPARC 商标的产品均基于由 Sun Microsystems, Inc. 开发的体系结构 本产品受美国出口管制法律控制, 并可能受其他国家 / 地区的进出口法律的制约 严禁将本产品直接或间接地用于核设施 导弹 生化武器或海上核设施, 也不能直接或间接地出口给核设施 导弹 生化武器或海上核设施的最终用户 严禁出口或转口到美国禁运的国家 / 地区以及美国禁止出口清单中所包含的实体, 包括但不限于被禁止的个人以及特别指定的国家 / 地区的公民 本文档按 原样 提供, 对于所有明示或默示的条件 陈述和担保, 包括对适销性 适用性或非侵权性的默示保证, 均不承担任何责任, 除非此免责声明的适用范围在法律上无效 请回收

3 目录 开始之前 ix 印刷约定 ix Shell 提示符 x 受支持的平台 x 访问 Sun Studio 软件和手册页 xi 访问编译器和工具文档 xiii 访问相关的 Solaris 文档 xv 开发人员资源 xv 与 Sun 技术支持联系 xv Sun 欢迎您提出意见和建议 xvi 1. OpenMP API 概述 哪里有 OpenMP 规范 本章所使用的特殊约定 指令格式 条件编译 PARALLEL 并行区域构造 工作共享构造 DO 和 for 构造 SECTIONS 构造 1 6 iii

4 1.6.3 SINGLE 构造 Fortran WORKSHARE 构造 合并的并行工作共享构造 PARALLEL DO 和 parallel for 构造 PARALLEL SECTIONS 构造 PARALLEL WORKSHARE 构造 同步构造 MASTER 构造 CRITICAL 构造 BARRIER 构造 ATOMIC 构造 FLUSH 构造 ORDERED 构造 数据环境指令 THREADPRIVATE 指令 OpenMP 指令子句 数据作用域子句 调度子句 NUM_THREADS 子句 指令中出现的子句 OpenMP 运行时库例程 Fortran OpenMP 例程 C/C++ OpenMP 例程 运行时线程管理例程 管理同步锁定的例程 计时例程 嵌套并行操作 执行模型 2 1 iv OpenMP API 用户指南 2005 年 1 月

5 2.2 控制嵌套并行操作 OMP_NESTED SUNW_MP_MAX_POOL_THREADS SUNW_MP_MAX_NESTED_LEVELS 在嵌套并行区域中使用 OpenMP 库函数 有关使用嵌套并行操作的一些提示 Fortran 中的自动作用域 自动作用域数据范围子句 AUTO 子句 DEFAULT( AUTO) 子句 作用域规则 标量变量的作用域规则 数组的作用域规则 关于自动作用域的通用注释 检查自动作用域的结果 当前实现的已知限制 实现定义的行为 OpenMP 编译 要使用的编译器选项 Fortran 95 OpenMP 验证 OpenMP 环境变量 处理器绑定 栈和栈大小 转换为 OpenMP 转换传统 Fortran 指令 转换 Sun 风格的 Fortran 指令 6 1 目录 v

6 6.1.2 转换 Cray 风格的 Fortran 指令 转换传统 C Pragma 传统 C Pragma 与 OpenMP 间的问题 性能注意事项 一般性建议 伪共享及其避免方法 何为伪共享? 减少伪共享 操作系统调节功能 7 5 索引索引 1 vi OpenMP API 用户指南 2005 年 1 月

7 表 表 1-1 Pragma 及可以出现的子句 1 18 表 5-1 OpenMP 环境变量 5 5 表 5-2 多重处理环境变量 5 6 表 6-1 将 Sun 并行化指令转换为 OpenMP 6 1 表 6-2 DOALL 限定符子句和等效的 OpenMP 子句 6 2 表 6-3 SCHEDTYPE 调度和等效的 OpenMP schedule 6-2 表 6-4 Cray 风格的 DOALL 限定符子句的等效 OpenMP 子句 6 3 表 6-5 将传统 C 并行化 Pragma 转换为 OpenMP 6 4 表 6-6 taskloop 可选子句和等效的 OpenMP 子句 6 4 表 6-7 SCHEDTYPE 调度和等效的 OpenMP schedule 6-5 vii

8 viii OpenMP API 用户指南 2005 年 1 月

9 开始之前 OpenMP API 用户指南 概述了用于生成多重处理应用程序的 OpenMP Fortran 95 C 和 C++ 应用程序接口 (API) Sun Studio 编译器支持 OpenMP API 本指南专供科学工作者 工程技术人员以及具有 Fortran C 或 C++ 语言及 OpenMP 并行编程模型的应用知识的程序员使用 通常, 还假定他们熟悉 Solaris 操作环境或 UNIX 印刷约定 表 P-1 字体约定 字体含义示例 AaBbCc123 AaBbCc123 命令 文件和目录的名称 ; 计算机屏幕输出 输入的内容, 以便与计算机屏幕输出相区别 编辑您的.login 文件 使用 ls -a 列出所有文件 % You have mail. % su Password: AaBbCc123 书名 新词或术语以及要强调的词 请阅读 用户指南 的第 6 章 这些称作类选项 您必须是超级用户才能执行此操作 AaBbCc123 命令行占位符文本 ; 用实际名称或值替换 要删除文件, 请键入 rm filename ix

10 表 P-2 代码约定 代码符号含义表示法代码示例 [ ] 括号包含可选参数 O[n] -O4, -O { } 大括号包含所需选项的选项集合 分隔变量的 或 - 符号, 只能选择其一 : 与逗号一样, 冒号有时可用于分隔参数 d{y n} B{dynamic static} Rdir[:dir] -dy -Bstatic -R/local/libs:/U/a 省略号表示一系列省略 -xinline=f1[, fn] -xinline=alpha,dos Shell 提示符 Shell 提示符 C shell machine-name% C shell 超级用户 machine-name# Bourne shell 和 Korn shell $ Bourne shell 和 Korn shell 的超级用户 # 受支持的平台 此 Sun Studio 发行版本支持使用如下 SPARC 和 x86 系列处理器架构的系统 : UltraSPARC ARC64 AMD64 Pentium 和 Xeon EM64T 可从以下位置获得硬件兼容性列表, 在列表中可以查看您正在使用的 Solaris 操作系统版本所支持的系统 : 这些文档中给出了平台类型间所有实现的区别 在本文档中, 术语 x86 指采用兼容 AMD64 或 Intel Xeon/Pentium 产品系列处理器的 64 位和 32 位系统 有关受支持的系统, 请参阅硬件兼容性列表 x OpenMP API 用户指南 2005 年 1 月

11 访问 Sun Studio 软件和手册页 编译器和工具以及它们的手册页并没有安装到标准的 /usr/bin/ 和 /usr/share/man 目录中 要访问编译器和工具, 必须正确设置 PATH 环境变量 ( 请参阅第 xi 页 访问编译器和工具 ) 要访问手册页, 必须正确设置 MANPATH 环境变量 ( 请参阅第 xii 页 访问手册页 ) 关于 PATH 变量的更多信息, 请参阅 csh(1) sh(1) 和 ksh(1) 手册页 关于 MANPATH 变量的更多信息, 请参阅 man(1) 手册页 关于设置 PATH 变量和 MANPATH 变量以访问此发行版本的更多信息, 请参阅安装指南或询问系统管理员 注 本节中的信息假设 Sun ONE Studio 编译器和工具安装在 /opt 目录中 如果软件没有安装在 /opt 目录中, 请询问系统管理员以获取系统中的等效路径 访问编译器和工具 使用下列步骤来决定是否需要更改 PATH 变量以访问编译器和工具 决定是否需要设置 PATH 环境变量 1. 通过在命令提示符后输入下列内容以显示 PATH 变量的当前值 % echo $PATH 2. 查看输出中是否有包含 /opt/sunwspro/bin/ 的路径字符串 如果找到该路径, 您的 PATH 变量已经设置好, 可以访问编译器和工具了 如果没有找到该路径, 按照下一步中的说明来设置 PATH 环境变量 设置 PATH 环境变量以访问编译器和工具 1. 如果使用的是 C shell, 请编辑起始.cshrc 文件 如果使用的是 Bourne shell 或 Korn shel, 请编辑起始.profile 文件 2. 将下列内容添加到 PATH 环境变量 如果已安装 Forte Developer 软件 Sun ONE Studio 软件或 Sun Studio 软件的其他发行版本, 则将以下路径添加到这些安装的路径之前 /opt/sunwspro/bin 开始之前 xi

12 访问手册页 使用下列步骤来决定是否需要更改 MANPATH 变量以访问手册页 决定是否需要设置 MANPATH 环境变量 1. 通过在命令提示符后输入下列内容以请求 dbx 手册页 % man dbx 2. 如果有输出的话, 请查看输出 如果 dbx(1) 手册页无法找到或者显示的手册页不是用于安装软件的当前版本, 请按照下一步中的说明来设置 MANPATH 环境变量 设置 MANPATH 环境变量以访问手册页 1. 如果使用的是 C shell, 请编辑起始.cshrc 文件 如果使用的是 Bourne shell 或 Korn shel, 请编辑起始.profile 文件 2. 将下列内容添加到 MANPATH 环境变量 /opt/sunwspro/man 访问集成开发环境 Sun Studio 集成开发环境 (IDE) 提供了创建 编辑 生成 调试和分析 C C++ 或 Fortran 应用程序性能的模块 启动 IDE 的命令是 sunstudio 有关该命令的详细信息, 请参阅 sunstudio(1) 手册页 IDE 是否能够正确操作取决于 IDE 能否找到核心平台 sunstudio 命令查找两个位置的核心平台 : 该命令首先在缺省安装目录 /opt/netbeans/3.5v 中查找 如果该命令在缺省目录未找到核心平台, 则它将假设包含 IDE 的目录和包含核心平台的目录均安装在同一位置上 例如, 如果包含 IDE 的目录的路径是 /foo/sunwspro, 该命令将在 /foo/netbeans/3.5v 中查找核心平台 如果核心平台未安装在 sunstudio 命令查找它的任一位置上, 客户端系统上的每个用户必须将环境变量 SPRO_NETBEANS_HOME 设置为安装核心平台的位置 (/installation_directory/netbeans/3.5v) xii OpenMP API 用户指南 2005 年 1 月

13 IDE 的每个用户还必须将 /installation_directory/sunwspro/bin 添加到其他任何 Forte Developer 软件 Sun ONE Studio 软件或 Sun Studio 软件发行版本路径前面的 $PATH 中 路径 /installation_directory/netbeans/3.5v/bin 不可添加到用户的 $PATH 中 访问编译器和工具文档 您可以访问下列位置的文档 : 可以在随软件一起安装的文档索引 file:/opt/sunwspro/docs/index.html 中 ( 位于本地系统或网络上 ) 获取文档 如果软件没有安装在 /opt 目录中, 请询问系统管理员以获取系统中的等效路径 大多数的手册都可以从 docs.sun.com sm web 站点上获得 下列书目只能从您所安装的软件中找到 : 标准 C++ 库类参考 标准 C++ 库用户指南 Tools.h++ 类库参考 Tools.h++ 用户指南 发行说明可以从 docs.sun.com web 站点上获得 在 IDE 中通过 帮助 菜单或窗口和对话框上的 帮助 按钮可以访问 IDE 所有组件的联机帮助 您可以通过因特网在 docs.sun.com web 站点 ( 上阅读 打印和购买 Sun Microsystems 的各种手册 如果找不到手册, 请参阅和软件一起安装在本地系统或网络中的文档索引 注 Sun 对本文档中提到的第三方 Web 站点的可用性不承担任何责任 对于此类站点或资源中的 ( 或通过它们获得的 ) 任何内容 广告 产品或其他材料, Sun 并不表示认可, 也不承担任何责任 对于因使用或依靠此类站点或资源中的 ( 或通过它们获得的 ) 任何内容 产品或服务而造成的或连带产生的实际或名义损坏或损失, Sun 概不负责, 也不承担任何责任 开始之前 xiii

14 使用易读格式的文档 该文档以易读格式提供, 以方便残障用户使用辅助技术进行阅读 您还可以按照下表所描述的信息找到文档的易读版本 如果软件没有安装在 /opt 目录中, 请询问系统管理员以获取系统中的等效路径 文档类型手册 ( 第三方手册除外 ) 第三方手册 : 标准 C++ 库类参考 标准 C++ 库用户指南 Tools.h++ 类库参考 Tools.h++ 用户指南 自述文件和手册页联机帮助发行说明 易读版本的格式和位置 HTML, 位于 HTML, 位于安装的软件中的文档索引 file:/opt/sunwspro/docs/index.html HTML, 位于安装的软件中的文档索引 file:/opt/sunwspro/docs/index.html 通过 IDE 中的 帮助 菜单可以使用 HTML HTML, 位于 相关编译器和工具文档 下表描述的相关文档可以在 file:/opt/sunwspro/docs/index.html 和 上获得 如果软件没有安装在 /opt 目录中, 请询问系统管理员以获取系统中的等效路径 文档标题 Fortran 编程指南 Fortran 库参考 Fortran 用户指南 C 用户指南 C++ 用户指南数值计算指南 描述 描述如何在 Solaris 环境中编写高效 Fortran 代码 ; 输入 / 输出 库 性能 调试和并行处理 详细说明 Fortran 库和内部例程 描述 f95 编译器的编译时环境和命令行选项 还包括关于将以前的 f77 程序迁移到 f95 的说明 描述 cc 编译器的编译时环境和命令行选项 描述 CC 编译器的编译时环境和命令行选项 描述关于浮点计算数值精确性的问题 xiv OpenMP API 用户指南 2005 年 1 月

15 访问相关的 Solaris 文档 下表描述了可从 docs.sun.com web 站点上获得的相关文档 文档集合文档标题描述 Solaris 参考手册集合 请参阅手册页部分的标题 提供关于 Solaris 操作环境的信 息 Solaris 软件开发人员集合 链接程序和库指南 描述了 Solaris 链接编辑器和运 行时链接程序的操作 Solaris 软件开发人员集合 多线程编程指南 涵盖 POSIX 和 Solaris 线程 API 使用同步对象进行程序设计 编译多线程程序和多线程程 序的查找工具 开发人员资源 访问 以查找以下经常更新的资源 : 关于编程技术和最佳方法的文章 短小编程提示的知识库 编译器和工具组件的文档以及与软件同时安装的文档的更正 支持等级信息 用户论坛 可下载代码样例 新技术预览您可以在 上找到开发人员的额外资源 与 Sun 技术支持联系 如果您有关于本产品的技术问题而本文档未予以解答, 请访问 : 开始之前 xv

16 Sun 欢迎您提出意见和建议 Sun 致力于提高文档质量, 并欢迎您提出宝贵的意见和建议 请将您的意见发送至以下 URL: 请在电子邮件的主题行中注明文档的文件号码 ( ) 当您提供意见和建议时, 可能需要在表单中提供文档英文版本的标题和文件号码 本文档英文版本的文件号码和标题是 : , OpenMP API User's Guide xvi OpenMP API 用户指南 2005 年 1 月

17 第 1 章 OpenMP API 概述 OpenMP 应用程序接口是与多家计算机供应商联合开发的 针对共享内存多处理器体系结构的可移植并行编程模型 其规范由 OpenMP 体系结构审核委员会 创立并公布 有关 OpenMP 的更多信息 ( 包括教程和其他资源 ), 请访问其网站 : OpenMP API 是 Solaris 操作系统平台上所有 Sun Studio 编译器的建议并行编程模型 有关将传统 Fortran 和 C 并行化指令转换为 OpenMP 指令的指导, 请参阅第 6 章 本章概述组成 OpenMP 2.0 版应用程序接口 并由 Sun Studio Fortran 95 C 和 C++ 编译器实现的指令 运行时库例程及环境变量 1.1 哪里有 OpenMP 规范 简洁起见, 本章中提供的材料有意略去了许多详细信息, 只是一个概述 随时都可参阅 OpenMP 规范文档来了解完整的详细信息 Fortran 和 C/C++ OpenMP 2.0 规范可以在 OpenMP 官方网站 上获得 1.2 本章所使用的特殊约定 在以下表格和示例中, Fortran 指令和源代码虽以大写形式出现, 但实际上不区分大小写 结构化块指无进或出传输的 Fortran 或 C/C++ 语句块 方括号 [...] 内的构造为可选构造 1-1

18 本手册中, Fortran 指 Fortran 95 语言和编译器 f95 本手册中, 指令 和 pragma 互换使用 1.3 指令格式 每个指令行中只能指定一个指令名, 且该指令名应用于随后的程序语句 Fortran: Fortran 固定格式可以接受三个指令 标记, 而自由格式只能接受一个 在下面的 Fortran 示例中, 将使用自由格式 C/C++: C 和 C++ 使用以 #pragma omp 开头的标准预处理指令 OpenMP 2.0 Fortran 固定格式 : C$OMP directive-name optional_clauses...!$omp directive-name optional_clauses... *$OMP directive-name optional_clauses... 标记必须从第一列开始 ; 续行的第 6 列必须含非空白或非零字符 指令行第 6 列后可以有注释, 注释以感叹号 (!) 开头 行中! 后的其余内容都会被忽略 自由格式 :!$OMP directive-name optional_clauses... 可以出现在行内任何位置, 之前只能使用空白 ; 行尾的和号 (&) 用于标识续行 指令行中可以有注释, 注释以感叹号 (!) 开头 行中其余内容都会被忽略 OpenMP 2.0 C/C++ #pragma omp directive-name optional_clauses... 每个 pragma 必须以换行符结尾, 并遵循标准的 C 和 C++ 编译器编译指示约定 Pragma 区分大小写 子句出现的顺序并不重要 # 前后和字间可以有空白 指令应用于随后的语句, 该语句必须为结构化块 1-2 OpenMP API 用户指南 2005 年 1 月

19 1.4 条件编译 OpenMP API 定义预处理程序符号 _OPENMP 用于条件编译 此外,OpenMP Fortran API 也接受条件编译标记 OpenMP 2.0 Fortran 固定格式 :!$ fortran_95_statement C$ fortran_95_statement *$ fortran_95_statement c$ fortran_95_statement 标记必须从第 1 列开始, 且不能包含中间空白 启用 OpenMP 编译时, 该标记用两个空白代替 行内其余内容必须符合标准的 Fortran 固定格式约定 示例 : C !$ 10 iam = OMP_GET_THREAD_NUM() +!$ 1 index 自由格式 :!$ fortran_95_statement 此标记可以出现在任意列, 之前只能为空白, 且必须以单个字形式出现 Fortran 自由格式约定应用于行的其余内容 示例 : C !$ iam = OMP_GET_THREAD_NUM() + &!$& index Fortran 预处理程序 : 启用 OpenMP 时编译会定义预处理程序符号 _OPENMP #ifdef _OPENMP iam = OMP_GET_THREAD_NUM()+index #endif OpenMP 2.0 C/C++ C/C++ 预处理程序 : 启用 OpenMP 时编译会定义宏 _OPENMP #ifdef _OPENMP iam = omp_get_thread_num() + index; #endif 第 1 章 OpenMP API 概述 1-3

20 1.5 PARALLEL 并行区域构造 PARALLEL 指令定义并行区域, 该区域多个线程以并行方式执行的程序区域 OpenMP 2.0 Fortran!$OMP PARALLEL [clause[[,]clause]...] 结构化块!$OMP END PARALLEL OpenMP 2.0 C/C++ #pragma omp parallel [clause[[,]clause]...] 结构化块 有许多特殊条件和限制 有关详细信息, 强烈建议编程人员参阅相应的 OpenMP 规范文档 表 1-1 列出了可随此构造出现的子句 1.6 工作共享构造 工作共享构造在遇到该构造的线程组成员中分配封装代码区域的执行 要使工作共享构造以并行方式执行, 构造必须封装在并行区域内 这些指令及其所应用到的代码有许多特殊条件和限制 有关详细信息, 强烈建议编程人员参阅相应的 OpenMP 规范文档 1-4 OpenMP API 用户指南 2005 年 1 月

21 1.6.1 DO 和 for 构造 指定随后的 DO 或 for 循环的迭代应该以并行方式执行 OpenMP 2.0 Fortran!$OMP DO [clause[[,] clause]...] do_loop [!$OMP END DO [NOWAIT]] DO 指令指定其后紧跟的 DO 循环的迭代应以并行方式执行 循环迭代将分配到执行绑定了循环的并行区域的线程组中的已有线程 此指令必须出现在并行区域内才有效 OpenMP 2.0 C/C++ #pragma omp for [clause[[,]clause]...] for-loop for pragma 指定其后紧跟的 for- loop 的迭代应以并行方式执行 循环迭代将分配到执行绑定了循环的并行区域的线程组中的已有线程 此 pragma 必须出现在并行区域内才有效 for pragma 对相应 for 循环的结构有限制, 且必须有规范格式 : for (initexpr; var logicop b; increxpr) 其中 : initexpr 为以下之一 : var = lb integer_type var = lb increxpr 为以下表达式形式之一 : ++var var++ --var var-- var += incr var -= incr var = var + incr var = incr + var var = var - incr var 是有符号整型变量, 被隐式设置为供 for 范围专用 切勿修改 for 语句体内的 var 除非指定 lastprivate, 否则其值在循环后不确定 logicop 为以下逻辑操作符之一 : < <= > >= lb b 和 incr 是循环不变量整型表达式 对 < 或 <= 和 > 或 >= 作为 for 语句中的 logicalop 使用尚有其他限制 有关详细信息, 请参阅 OpenMP C/C++ 规范 表 1-1 列出了可随此构造出现的子句 第 1 章 OpenMP API 概述 1-5

22 1.6.2 SECTIONS 构造 SECTIONS 构造用于封装要在组内的线程中分配的一组结构化代码块 每个块由组内的线程执行一次 每段均以 SECTION 指令开头, 该指令对第一段为可选指令 OpenMP 2.0 Fortran!$OMP SECTIONS [clause[[,] clause]...] [!$OMP SECTION] 结构化块 [!$OMP SECTION 结构化块 ]...!$OMP END SECTIONS [NOWAIT] OpenMP 2.0 C/C++ #pragma omp sections [clause[[,]clause]...] { [#pragma omp section ] 结构化块 [#pragma omp section... } 结构化块 ] 表 1-1 列出了可随此构造出现的子句 SINGLE 构造 用 SINGLE 封装的结构化块只由组内的一个线程来执行 除非指定 NOWAIT, 否则组内未执行 SINGLE 块的线程会在块结尾处等待 OpenMP 2.0 Fortran!$OMP SINGLE [clause[[,] clause]...] 结构化块!$OMP END SINGLE [end-modifier] 1-6 OpenMP API 用户指南 2005 年 1 月

23 OpenMP 2.0 C/C++ #pragma omp single [clause[[,] clause]...] 结构化块表 1-1 列出了可随此构造出现的子句 Fortran WORKSHARE 构造 WORKSHARE 构造将执行封装代码块的工作划分为独立的工作单元, 并使组内的线程共享工作, 这样每个单元便只执行一次 OpenMP 2.0 Fortran!$OMP WORKSHARE 结构化块!$OMP END WORKSHARE [NOWAIT] 没有与 Fortran WORKSHARE 构造等效的 C/C++ 指令 1.7 合并的并行工作共享构造 合并的并行工作共享构造是指定包含一个工作共享构造的并行区域的捷径 这些指令及其所应用到的代码有许多特殊条件和限制 有关完整的详细信息, 请参阅相应的 OpenMP 规范文档 以下说明只是概述, 内容并不详尽 表 1-1 列出了可随这些构造出现的子句 第 1 章 OpenMP API 概述 1-7

24 1.7.1 PARALLEL DO 和 parallel for 构造 指定包含单个 DO 或 for 循环的并行区域的捷径 等价于 PARALLEL 指令后紧跟 DO 或 for 指令 除 NOWAIT 修饰符外, 子句可以是 PARALLEL 和 DO/for 指令可接受的任意子句 OpenMP 2.0 Fortran!$OMP PARALLEL DO [clause[[,] clause]...] do_loop [!$OMP END PARALLEL DO ] OpenMP 2.0 C/C++ #pragma omp parallel for [clause[[,] clause]...] for-loop PARALLEL SECTIONS 构造 指定包含单个 SECTIONS 指令的并行区域的捷径 等效于 PARALLEL 指令后紧跟 SE CTIONS 指令 除 NOWAIT 修饰符外, 子句可以是 PARALLEL 和 SECTIONS 指令可接受的任意子句 OpenMP 2.0 Fortran!$OMP PARALLEL SECTIONS [clause[[,] clause]...] [!$OMP SECTION] 结构化块 [!$OMP SECTION 结构化块 ]...!$OMP END PARALLEL SECTIONS 1-8 OpenMP API 用户指南 2005 年 1 月

25 OpenMP 2.0 C/C++ #pragma omp parallel sections [clause[[,] clause]...] { [#pragma omp section ] 结构化块 [#pragma omp section... } 结构化块 ] PARALLEL WORKSHARE 构造 Fortran PARALLEL WORKSHARE 构造为指定包含单个 WORKSHARE 指令的并行区域提供了一条捷径 clause 可以是 PARALLEL 指令可接受的子句之一 OpenMP 2.0 Fortran!$OMP PARALLEL WORKSHARE [clause[[,] clause]...] 结构化块!$OMP END PARALLEL WORKSHARE 没有等效的 C/C++ 指令 1.8 同步构造 以下构造指定线程同步 有关这些构造的特殊条件和限制非常多, 无法在此处完全概述 有关完整的详细信息, 强烈建议编程人员参阅相应的 OpenMP 规范文档 第 1 章 OpenMP API 概述 1-9

26 1.8.1 MASTER 构造 只有组内的主线程才执行此指令所封装的块 其他线程会跳过此块, 然后继续执行 主构造的入口或出口处无暗含障碍 OpenMP 2.0 Fortran!$OMP MASTER 结构化块!$OMP END MASTER OpenMP 2.0 C/C++ #pragma omp master 结构化块 CRITICAL 构造 每次限一个线程可访问结构化块 可选的 name 参数标识临界区域 所有未命名的 CRITICAL 指令都映射到同一名称 临界段名称是程序的全局实体, 必须唯一 对于 Fortran, 如果 name 出现在 CRITICAL 指令中, 便也必须出现在 END CRITICAL 指令中 对于 C/C++, 用于给临界区域命名的标识符有外部链接, 且其所在的名字空间与标签 标记 成员及普通标识符所使用的名字空间不同 OpenMP 2.0 Fortran!$OMP CRITICAL [(name)] 结构化块!$OMP END CRITICAL [(name)] OpenMP 2.0 C/C++ #pragma omp critical [(name)] 结构化块 1-10 OpenMP API 用户指南 2005 年 1 月

27 1.8.3 BARRIER 构造 同步组内的所有线程 每个线程都等到组内所有其他线程都到达此点为止 OpenMP 2.0 Fortran!$OMP BARRIER OpenMP 2.0 C/C++ #pragma omp barrier 组内的所有线程都遇到障碍后, 组内的每个线程便都开始执行 BARRIER 指令后的语句 请注意, 由于 barrier pragma 不使用 C/C++ 语句作为其语法的一部分, 因此有对其在程序内位置的限制 有关详细信息, 请参阅 C/C++ OpenMP 规范 ATOMIC 构造 确保特定内存位置自动更新, 而不要将其交由不确定的多个同时写入线程来支配 OpenMP 2.0 Fortran!$OMP ATOMIC 表达式语句 该指令只应用于随后紧跟的表达式语句, 且语句必须采用以下这些形式之一 : x = x operator expression x = expression operator x x = intrinsic(x, expr-list) x = intrinsic(expr-list, x) 其中 : x 为内在类型的标量 expression 为不引用 x 的标量表达式 expr-list 为不引用 x 非空 以逗号分隔的标量表达式列表 ( 有关详细信息, 请参阅 OpenMP 2.0 Fortran 规范 ) intrinsic 为 MAX MIN IAND IOR 或 IEOR 之一 operator 为 + - * /.AND..OR..EQV..NEQV. 之一 第 1 章 OpenMP API 概述 1-11

28 OpenMP 2.0 C/C++ #pragma omp atomic 表达式语句 该指令只应用于随后紧跟的表达式语句, 且语句必须采用以下这些形式之一 : x binop = expr x++ ++x x-- --x 其中 : x 为带标量类型的左值表达式 expr 为不引用 x 的带标量类型的表达式 binop 不是重载操作符, 也不是以下操作符之一 :+ * - / & ^ << 或 >> 此实现在临界区域中封装表达式语句来替换所有 ATOMIC 指令 FLUSH 构造 线程可见的 Fortran 变量或 C 对象被写回到出现此指令的内存位置 FLUSH 指令只提供执行线程和全局内存内操作间的一致性 可选的 variable-list 由需要刷新的变量或对象的列表组成, 变量或对象间以逗号分隔 不带 variable-list 的 FLUSH 指令会同步所有线程可见的共享变量或对象 OpenMP 2.0 Fortran!$OMP FLUSH [(variable-list)] OpenMP 2.0 C/C++ #pragma omp flush [(variable-list)] 请注意, 由于 flush pragma 不使用 C/C++ 语句作为其语法的一部分, 因此有对其在程序内位置的限制 有关详细信息, 请参阅 C/C++ OpenMP 规范 1-12 OpenMP API 用户指南 2005 年 1 月

29 1.8.6 ORDERED 构造 封装的块按迭代在循环的顺序执行中的执行顺序执行 OpenMP 2.0 Fortran!$OMP ORDERED 结构化块!$OMP END ORDERED 封装的块按迭代在循环的顺序执行中的执行顺序执行 它只会出现在 DO 或 PARALLEL DO 指令的动态范围内 ORDERED 子句必须在封装该块的最近 DO 指令中指定 每次迭代时, DO 指令应用到的循环不能执行同一 ordered 指令超过一次, 且不能执行超过一个 ordered 指令 OpenMP 2.0 C/C++ #pragma omp ordered 结构化块 封装的块按迭代在循环的顺序执行中的执行顺序执行 它只能出现在指定了 ordered 子句的 for 或 parallel for 指令的动态范围内 每次迭代时, 有 for 构造的循环不能执行同一 ordered 指令超过一次, 且不能执行超过一个 ordered 指令 1.9 数据环境指令 以下指令用于在并行构造执行期间控制数据环境 THREADPRIVATE 指令 将对象列表 (Fortran 公共块和命名变量 C 和 C++ 命名变量 ) 设置为某线程专用, 但在线程内为全局性 有关完整的详细信息和限制, 请参阅 OpenMP 规范 OpenMP 2.0 Fortran!$OMP THREADPRIVATE(list) 公共块名必须出现在斜杠间 要设置某公共块为 THREADPRIVATE, 此指令必须出现在该块的每个 COMMON 声明后 第 1 章 OpenMP API 概述 1-13

30 OpenMP 2.0 C/C++ #pragma omp threadprivate (list) 文件 名字空间或块作用域处的 list 中的每个变量都必须引用词典上位于 pragma 之前的文件 名称空间或块作用域处的变量声明 1.10 OpenMP 指令子句 本节概述可以出现在 OpenMP 指令中的数据作用域和调度子句 数据作用域子句 有几个指令接受允许用户在构造范围内控制变量的作用域属性的子句 如果未给指令指定数据作用域子句, 则受指令影响的变量的缺省作用域为 SHARED Fortran:list 是以逗号分隔 可在作用域单元中访问的命名变量或公共块列表 公共块名必须出现在斜杠内 ( 例如, /ABLOCK/) 对这些作用域子句的使用有一些重要的限制 有关完整的详细信息, 请参阅 OpenMP 规范的相应章节 表 1-1 列出可出现这些子句的指令 PRIVATE 子句 private(list) 将可选的以逗号分隔的 list 中的变量声明为供组内各线程专用 SHARED 子句 shared(list) 组内所有线程都共享 list 中出现的变量, 并访问同一存储区域 1-14 OpenMP API 用户指南 2005 年 1 月

31 DEFAULT 子句 Fortran DEFAULT(PRIVATE SHARED NONE) C/C++ default(shared none) 指定并行区域内所有变量的作用域属性 THREADPRIVATE 变量不受此子句影响 未指定时使用 DEFAULT(SHARED) 可以使用 private firstprivate lastprivate reduction 及 shared 子句覆盖变量的缺省数据共享属性 FIRSTPRIVATE 子句 firstprivate(list) 列表中的变量为 PRIVATE 此外, 变量的专用副本从构造前便已存在的原始对象中初始化得来 LASTPRIVATE 子句 lastprivate(list) 列表中的变量为 PRIVATE 此外,LASTPRIVATE 子句在 DO 或 for 指令中出现时, 执行序列末位的最后一个迭代的线程会更新原始对象 在 SECTIONS 指令中, 执行按词汇顺序位于最后的 SECTION 的线程会更新原始对象 COPYIN 子句 Fortran COPYIN(list) COPYIN 子句只应用于变量 公共块和声明为 THREADPRIVATE 的公共块中的变量 在并行区域中,COPYIN 指定组主线程中的数据复制到并行区域开头的线程专用副本中 C/C++ copyin(list) COPYIN 子句只应用于声明为 THREADPRIVATE 的变量 在并行区域中,COPYIN 指定组主线程中的数据复制到并行区域开头的线程专用副本中 第 1 章 OpenMP API 概述 1-15

32 COPYPRIVATE 子句 Fortran COPYPRIVATE(list) 使用专用变量将值或指向共享对象的指针从组的一个成员广播给其他成员 COPYPRIVATE 子句只能在 END SINGLE 指令中出现 广播发生在执行与 single 关联的结构化块后, 组中任何线程在构造尾部留下障碍前 list 中的变量决不可在指定 COPYPRIVATE 的 SINGLE 构造的 PRIVATE 或 FIRSTPRIVATE 子句中出现 C/C++ copyprivate(list) 使用专用变量将值从组的一个成员广播给其他成员 copyprivate 子句只能在 single 指令中出现 广播发生在执行与 single 关联的结构化块后, 组中任何线程在构造尾部留下障碍前 list 中的变量决不可在同一 single 指令的 private 或 firstprivate 子句中出现 REDUCTION 子句 Fortran REDUCTION(operator intrinsic:list) operator 为以下操作符之一 :+ * -.AND..OR..EQV..NEQV. intrinsic 为下列值之一 :MAX MIN IAND IOR IEOR list 中的变量必须为内在类型的命名变量 C/C++ reduction(operator:list) operator 为以下操作符之一 : + * - & ^ && REDUCTION 子句专供约简变量只在约简语句中使用的区域中使用 list 中的变量在封装上下文中必须为 SHARED 为每个线程创建每个变量的专用副本, 仿佛它便是 PRIVATE 在约简尾部, 将原始值与每个专用副本的最终值合并来更新共享变量 有关 REDUCTION 子句和构造完整的详细信息和限制, 请参阅 OpenMP 规范的相应章节 调度子句 SCHEDULE 子句指定 Fortran DO 循环或 C/C++ for 循环中的迭代是如何在组中的线程间分配的 表 1-1 显示哪些指令允许 SCHEDULE 子句 1-16 OpenMP API 用户指南 2005 年 1 月

33 对这些调度子句的使用有一些重要的限制 有关完整的详细信息, 请参阅 Fortran 规范中的 节和 C/C++ 规范中的 节 schedule(type [,chunk]) 指定如何在组的线程间分配 DO 或 for 循环的迭代 type 可以是 STATIC DYNAMIC GUIDED 或 RUNTIME 之一 缺少 SCHEDULE 子句时, Sun Studio 编译器使用 STATIC 调度 chunk 必须为整型表达式 STATIC 调度 schedule(static[,chunk]) 迭代被分为由 chunk 指定大小的块 这些块按线程号顺序, 以循环方式静态地分配给组中的线程 未指定时系统会选择 chunk, 迭代会被划分为大小近似相同的连续块, 每个线程分配一块 DYNAMIC 调度 schedule(dynamic[,chunk]) 迭代被分为由 chunk 指定大小的块, 并分配给等待的线程 每个线程都完成其迭代空间块时, 会动态地获取下一组迭代 未指定 chunk 时, 缺省值为 GUIDED 调度 schedule(guided[,chunk]) 使用 GUIDED 时, 每分发一个迭代块, 块大小便以指数方式递减一次 chunk 指定每次分发的最小迭代数 ( 块大小是由取决于实现的公式确定的 ; 请参阅第 4-2 页 GUIDE D: 确定块大小 ) 未指定 chunk 时, 缺省值为 RUNTIME 调度 schedule(runtime) 调度被延迟到运行时为止 调度类型和块大小将根据 OMP_SCHEDULE 环境变量的值来确定 ( 缺省值为 SCHEDULE(STATIC) 第 1 章 OpenMP API 概述 1-17

34 NUM_THREADS 子句 OpenMP API 在 PARALLEL PARALLEL SECTIONS PARALLEL DO PARALLEL for 和 PARALLEL WORKSHARE 指令上提供了 NUM_THREADS 子句 num_threads(scalar_integer_expression) 指定某线程进入并行区域时组内所创建的线程数 scalar_integer_expression 是请求的线程数, 它会代替通过先前调用 OMP_SET_NUM_THREADS 库函数定义的线程数或 OMP_NUM_THREADS 环境变量的值 如果启用了动态线程管理, 请求便是要使用的最大线程数 请注意, num_threads 不应用于后续区域 指令中出现的子句 表 1-1 显示了可以在以下指令和 pragma 中出现的子句 : PARALLEL DO for SECTIONS SINGLE PARALLEL DO parallel for PARALLEL SECTIONS PARALLEL WORKSHARE 表 1-1 Pragma 及可以出现的子句 子句 /Pragma PARALLEL DO/for SECTIONS SINGLE PARALLEL DO/for PARALLEL SECTIONS IF PRIVATE SHARED FIRSTPRIVATE LASTPRIVATE DEFAULT REDUCTION COPYIN PARALLEL WORKSHARE OpenMP API 用户指南 2005 年 1 月

35 表 1-1 Pragma 及可以出现的子句 ( 续 ) 子句 /Pragma PARALLEL DO/for SECTIONS SINGLE COPYPRIVATE 1 ORDERED SCHEDULE NOWAIT PARALLEL DO/for PARALLEL SECTIONS NUM_THREADS 1. 仅限 Fortran:COPYPRIVATE 可以在 END SINGLE 指令中出现 2. 对于 Fortran, NOWAIT 修饰符只出现在 END DO END SECTIONS END SINGLE 或 END WORKSHARE 指令中 3. 只有 Fortran 支持 WORKSHARE 和 PARALLEL WORKSHARE PARALLEL WORKSHARE OpenMP 运行时库例程 OpenMP 提供了一组用来控制和查询并行执行环境的可调用的库例程 一组通用锁定例程和两个可移植计时器例程 Fortran 和 C/C++ OpenMP 规范中有完整的详细信息 Fortran OpenMP 例程 Fortran 运行时库例程是外部过程 在以下概述中, int_expr 是标量整型表达式 ; logical_expr 是标量逻辑表达式 返回 INTEGER(4) 和 LOGICAL(4) 的 OMP_ 函数不是内在函数, 必须进行正确声明 否则, 编译器将假定其为 REAL 如 Fortran OpenMP 规范中所述, 以下概述的 OpenMP Fortran 运行时库例程的接口声明由 Fortran 的包含文件 omp_lib.h 和 Fortran MODULE omp_lib 提供 在引用这些库例程的每个程序单元中提供一个 INCLUDE 'omp_lib.h' 语句或 #include "omp_lib.h" 预处理程序指令或 USE omp_lib 语句 使用 -Xlist 编译将报告所有类型不匹配情况 整型参数 omp_lock_kind 定义在 OMP_*_LOCK 例程中用于简单锁定变量的 KIND 类型参数 第 1 章 OpenMP API 概述 1-19

36 整型参数 omp_nest_lock_kind 定义在 OMP_*_NEST_LOCK 例程中用于可嵌套锁定变量的 KIND 类型参数 整型参数 openmp_version 被定义为使用 YYYYMM 格式的预处理程序宏 _OPENMP 其中 YYYY 和 MM 是 OpenMP Fortran API 版本的年和月名称 C/C++ OpenMP 例程 C/C++ 运行时库函数是外部函数 头 <omp.h> 声明可用于控制和查询并行执行环境的两种类型的几个函数以及可用于同步数据访问的锁定函数 类型 omp_lock_t 是能够代表锁定可用或线程拥有锁定的对象类型 这些锁定称为简单锁定 类型 omp_nest_lock_t 是能够代表锁定可用或线程拥有锁定的对象类型 这些锁定称为可嵌套锁定 运行时线程管理例程 有关详细信息, 请参阅相应的 OpenMP 规范 OMP_SET_NUM_THREADS 例程 设置用于未使用 num_threads() 子句指定后续并行区域的线程数 此调用只影响调用线程所遇到的同一级或内部嵌套级别的后续并行区域 Fortran SUBROUTINE OMP_SET_NUM_THREADS(int_expr) C/C++ #include <omp.h> void omp_set_num_threads(int num_threads); OMP_GET_NUM_THREADS 例程 返回当前组中正在执行从中调用其的并行区域的线程的数量 Fortran INTEGER(4) FUNCTION OMP_GET_NUM_THREADS() 1-20 OpenMP API 用户指南 2005 年 1 月

37 C/C++ #include <omp.h> int omp_get_num_threads(void); OMP_GET_MAX_THREADS 例程 如果在程序中此处遇到未使用 num_threads() 子句指定的活动并行区域, 则返回将用于组成线程组的最大线程数 Fortran INTEGER(4) FUNCTION OMP_GET_MAX_THREADS() C/C++ #include <omp.h> int omp_get_max_threads(void); OMP_GET_THREAD_NUM 例程 返回组内执行对此函数调用的线程的号码 此号码位于 0 和 OMP_GET_NUM_THRE ADS()-1 之间, 0 为主线程 Fortran INTEGER(4) FUNCTION OMP_GET_THREAD_NUM() C/C++ #include <omp.h> int omp_get_thread_num(void); OMP_GET_NUM_PROCS 例程 返回程序可用的处理器数 Fortran INTEGER(4) FUNCTION OMP_GET_NUM_PROCS() C/C++ #include <omp.h> int omp_get_num_procs(void); 第 1 章 OpenMP API 概述 1-21

38 OMP_IN_PARALLEL 例程 确定线程是否在并行区域的动态范围内执行 Fortran LOGICAL(4) FUNCTION OMP_IN_PARALLEL() 如果在活动并行区域的动态范围内调用, 则返回.TRUE., 否则将返回.FALSE. C/C++ #include <omp.h> int omp_in_parallel(void); 如果在活动并行区域的动态范围内调用, 则返回非零值 ; 否则, 返回零值 活动并行区域是指 IF 子句求值为 TRUE 的并行区域 OMP_SET_DYNAMIC 例程 启用或禁用可用线程数的动态调整 ( 缺省情况下启用动态调整 ) 此调用只影响调用线程所遇到的同一级或内部嵌套级别的后续并行区域 Fortran SUBROUTINE OMP_SET_DYNAMIC(logical_expr) logical_expr 的求值为.TRUE 时启用动态调整 ; 否则, 禁用动态调整 C/C++ #include <omp.h> void omp_set_dynamic(int dynamic); 如果 dynamic 的求值为非零值, 启用动态调整 ; 否则, 禁用动态调整 OMP_GET_DYNAMIC 例程 确定在程序中此处是否启用了动态线程调整 Fortran LOGICAL(4) FUNCTION OMP_GET_DYNAMIC() 启用了动态线程调整时返回.TRUE. ; 否则, 返回.FALSE. C/C++ #include <omp.h> int omp_get_dynamic(void); 1-22 OpenMP API 用户指南 2005 年 1 月

39 启用了动态线程调整时返回非零值 ; 否则, 返回零值 OMP_SET_NESTED 例程 启用或禁用嵌套并行操作 此调用只影响调用线程所遇到的同一级或内部嵌套级别的后续并行区域 Fortran SUBROUTINE OMP_SET_NESTED(logical_expr) logical_expr 的求值为.TRUE. 时启用嵌套并行操作 ; 否则, 禁用嵌套并行操作 C/C++ #include <omp.h> void omp_set_nested(int nested); nested 的求值为非零值时启用嵌套并行操作 ; 否则, 禁用嵌套并行操作 缺省情况下, 禁用嵌套并行操作 有关嵌套并行操作的信息, 请参阅第 2 章 OMP_GET_NESTED 例程 确定在程序中此处是否启用了嵌套并行操作 Fortran LOGICAL(4) FUNCTION OMP_GET_NESTED() 启用嵌套并行操作时返回.TRUE. ; 否则, 返回.FALSE. C/C++ #include <omp.h> int omp_get_nested(void); 启用嵌套并行操作时返回非零值 ; 否则, 返回零值 有关嵌套并行操作的信息, 请参阅第 2 章 管理同步锁定的例程 支持两种类型的锁定 : 简单锁定和可嵌套锁定 可以在解锁前使用同一线程多次锁定可嵌套锁定, 如果简单锁定已处于锁定状态, 便不能再行锁定 简单锁定变量只能传递给简单锁定例程, 嵌套锁定变量只能传递给嵌套锁定例程 第 1 章 OpenMP API 概述 1-23

40 Fortran: 锁定变量 var 只能通过这些例程进行访问 为此, 请使用参数 OMP_LOCK_KIND 和 OMP_NEST_LOCK_KIND ( 在 omp_lib.h INCLUDE 文件和 omp_lib MODULE 中定义 ) 例如, INTEGER(KIND=OMP_LOCK_KIND) ::var INTEGER(KIND=OMP_NEST_LOCK_KIND) :: nvar C/C++: 简单锁定变量的类型必须为 omp_lock_t, 且只能通过这些函数来访问 所有简单函数都需要指向 omp_lock_t 类型的参数 嵌套锁定变量的类型必须是 omp_nest_lock_t, 同样所有嵌套锁定函数也都需要指向 omp_nest_lock_t 类型的参数 OMP_INIT_LOCK 和 OMP_INIT_NEST_LOCK 例程 为后续调用初始化锁定变量 Fortran SUBROUTINE OMP_INIT_LOCK(var) SUBROUTINE OMP_INIT_NEST_LOCK(nvar) C/C++ #include <omp.h> void omp_init_lock(omp_lock_t *lock); void omp_init_nest_lock(omp_nest_lock_t *lock); OMP_DESTROY_LOCK 和 OMP_DESTROY_NEST_LOCK 例程 删除锁定变量 Fortran SUBROUTINE OMP_DESTROY_LOCK(var) SUBROUTINE OMP_DESTROY_NEST_LOCK(nvar) C/C++ #include <omp.h> void omp_destroy_lock(omp_lock_t *lock); 1-24 OpenMP API 用户指南 2005 年 1 月

41 void omp_destroy_nest_lock(omp_nest_lock_t *lock); OMP_SET_LOCK 和 OMP_SET_NEST_LOCK 例程 强制正在执行的线程等到指定的锁定可用为止 锁定可用时, 线程会被授予对锁定的所有权 Fortran SUBROUTINE OMP_SET_LOCK(var) SUBROUTINE OMP_SET_NEST_LOCK(nvar) C/C++ #include <omp.h> void omp_set_lock(omp_lock_t *lock); void omp_set_nest_lock(omp_nest_lock_t *lock); OMP_UNSET_LOCK 和 OMP_UNSET_NEST_LOCK 例程 释放正在执行的线程对锁定的所有权 线程不拥有该锁定时, 行为不确定 Fortran SUBROUTINE OMP_UNSET_LOCK(var) SUBROUTINE OMP_UNSET_NEST_LOCK(nvar) C/C++ #include <omp.h> void omp_unset_lock(omp_lock_t *lock); void omp_unset_nest_lock(omp_nest_lock_t *lock); OMP_TEST_LOCK 和 OMP_TEST_NEST_LOCK 例程 OMP_TEST_LOCK 会尝试设置与锁定变量关联的锁定 调用不会阻碍线程的执行 如果锁定设置成功,OMP_TEST_NEST_LOCK 返回新嵌套计数 ; 否则, 返回 0 调用不会阻碍线程的执行 Fortran LOGICAL(4) FUNCTION OMP_TEST_LOCK(var) 设置了锁定时返回.TRUE. ; 否则, 返回.FALSE. 第 1 章 OpenMP API 概述 1-25

42 INTEGER(4) FUNCTION OMP_TEST_NEST_LOCK(nvar) 锁定设置成功时返回嵌套计数 ; 否则, 返回零 C/C++ #include <omp.h> int omp_test_lock(omp_lock_t *lock); 锁定设置成功时返回非零值 ; 否则, 返回零值 int omp_test_nest_lock(omp_nest_lock_t *lock); 锁定设置成功时返回锁定嵌套计数 ; 否则, 返回零 计时例程 两个函数支持可移植挂钟计时器 OMP_GET_WTIME 例程 返回挂钟 自过去任意时刻以来 经过的时间 ( 秒 ) Fortran REAL(8) FUNCTION OMP_GET_WTIME() C/C++ #include <omp.h> double omp_get_wtime(void); OMP_GET_WTICK 例程 返回连续时钟滴答声之间的秒数 Fortran REAL(8) FUNCTION OMP_GET_WTICK() C/C++ #include <omp.h> double omp_get_wtick(void); 1-26 OpenMP API 用户指南 2005 年 1 月

43 第 2 章 嵌套并行操作 本章讨论 OpenMP 嵌套并行操作特性 2.1 执行模型 OpenMP 采用 fork-join ( 分叉 - 合并 ) 并行执行模式 线程遇到并行构造时, 就会创建由其自身及其他一些额外 ( 可能为零个 ) 线程组成的线程组 遇到并行构造的线程成为新组中的主线程 组中的其他线程称为组的从属线程 所有组成员都执行并行构造内的代码 如果某个线程完成了其在并行构造内的工作, 它就会在并行构造末尾的隐式屏障处等待 当所有组成员都到达该屏障时, 这些线程就可以离开该屏障了 主线程继续执行并行构造之后的用户代码, 而从属线程则等待被召集加入到其他组 OpenMP 并行区域之间可以互相嵌套 如果禁用嵌套并行操作, 则由遇到并行区域内并行构造的线程所创建的新组仅包含遇到并行构造的线程 如果启用嵌套并行操作, 则新组可以包含多个线程 OpenMP 运行时库维护一个线程池, 该线程池中的线程可用作并行区域中的从属线程 当线程遇到并行构造并需要创建包含多个线程的线程组时, 该线程将检查该池, 从池中获取空闲线程, 将其作为组的从属线程 如果池中没有足够的空闲线程, 则主线程获取的从属线程可能会比所需的要少 组完成执行并行区域时, 从属线程就会返回到池中 2.2 控制嵌套并行操作 通过在执行程序前设置各种环境变量, 可以在运行时控制嵌套并行操作 2-1

44 2.2.1 OMP_NESTED 可通过设置 OMP_NESTED 环境变量或调用 omp_set_nested() 函数 ( 第 1-23 页第 节的 OMP_SET_NESTED 例程 ) 来启用或禁用嵌套并行操作 以下示例说明在启用嵌套并行操作时包含多个执行嵌套并行区域的线程的组 嵌套并行操作示例 #include <omp.h> #include <stdio.h> void report_num_threads(int level) { #pragma omp single { printf("level %d:number of threads in the team - %d\n", level, omp_get_num_threads()); } } 代码样例 2-1 int main() { omp_set_dynamic(0); #pragma omp parallel 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-2 OpenMP API 用户指南 2005 年 1 月

45 % 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: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 比较禁用嵌套并行操作时运行相同程序的输出结果 : % 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 the team - 1 Level 2:number of threads in the team - 1 Level 3:number of threads in the team SUNW_MP_MAX_POOL_THREADS OpenMP 运行时库维护一个线程池, 该线程池中的线程可用作并行区域中的从属线程 设置 SUNW_MP_MAX_POOL_THREADS 环境变量可控制池中线程的数量 缺省值是 1023 线程池只包含运行时库创建的非用户线程 它不包含主线程或用户程序显式创建的任何线程 如果将此环境变量设置为零, 则线程池为空, 并且的并行区域均由一个线程执行 第 2 章嵌套并行操作 2-3

46 以下示例说明如果池中没有足够的线程, 并行区域可能获取较少的线程 代码与上面的代码相同 使所有并行区域同时处于活动状态所需的线程数为 8 个 池需要包含至少 7 个空闲线程 如果将 SUNW_MP_MAX_POOL_THREADS 设置为 5, 则四个最里面的并行区域中的两个区域可能无法获取所请求的所有从属线程 一种可能的结果如下所示 % 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 threads in the team - 1 Level 3:number of threads in the team SUNW_MP_MAX_NESTED_LEVELS 环境变量 SUNW_MP_MAX_NESTED_LEVELS 控制需要多个线程的嵌套并行区域的最大深度 活动嵌套深度大于此环境变量值的任何并行区域将仅由一个线程来执行 如果并行区域是具有假 IF 子句的 OpenMP 并行区域, 则不会将该区域视为活动区域 以下代码将创建 4 级嵌套并行区域 如果将 SUNW_MP_MAX_NESTED_LEVELS 设置为 2, 则嵌套深度为 3 和 4 的嵌套并行区域将由单个线程来执行 2-4 OpenMP API 用户指南 2005 年 1 月

47 #include <omp.h> #include <stdio.h> #define DEPTH 5 void report_num_threads(int level) { #pragma omp single { printf("level %d:number of threads in the team - %d\n", level, omp_get_num_threads()); } } 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); } 使用最大嵌套级别 4 来编译和运行此程序会产生以下可能的输出 ( 实际结果取决于操作系统调度线程的方式 ) 第 2 章嵌套并行操作 2-5

48 % 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 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:number of threads in the team - 2 Level 4:number of threads in the team - 2 使用设置为 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:number 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 OpenMP API 用户指南 2005 年 1 月

49 2.3 在嵌套并行区域中使用 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 章嵌套并行操作 2-7

50 并行区域中的 OpenMP 函数调用 #include <stdio.h> #include <omp.h> 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 */ 代码样例 2-2 /* 以下语句将打印 * * 0: 2 4 * 1: 2 6 * * omp_get_num_threads() 返回组中的线程数 * 因此, 对于 * 组中的两个线程来说情况是相同的 */ printf("%d:%d %d\n", omp_get_thread_num(), omp_get_num_threads(), omp_get_max_threads()); /* 将创建两个内部的并行区域 * 一个区域带有包含 4 个线程的组 ; * 另一个区域带有包含 6 个线程的组 */ #pragma omp parallel { #pragma omp master { /* 以下语句将打印 * * 内部 : 4 * 内部 : 6 */ printf("inner:%d\n", omp_get_num_threads()); } omp_set_num_threads(7); /* line C */ } 2-8 OpenMP API 用户指南 2005 年 1 月

51 /* 将再次创建两个内部的并行区域, * 一个区域带有包含 4 个线程的组 ; * 另一个区域带有包含 6 个线程的组 * * C 行的 omp_set_num_threads(7) 调用 * 此处无效, 因为它只影响 * 与 C 行在相同级别或内部嵌套级别 * 的并行区域 */ } #pragma omp parallel { printf("count me.\n"); } } return(0); 编译和运行此程序会产生一种以下可能的结果 : % a.out 0: 2 4 Inner: 4 1: 2 6 Inner: 6 count me. count me. count me. count me. count me. count me. count me. count me. count me. count me. 第 2 章嵌套并行操作 2-9

52 2.4 有关使用嵌套并行操作的一些提示 嵌套并行区域提供一种直接的方法来允许多个线程参与到计算中 例如, 假定您的程序包含两级并行操作, 并且每个级别的并行操作等级为 2 同时, 您的系统有 4 个 CPU, 您要使用所有 4 个 CPU 来加快此程序的执行速度 如果只并行化其中任意一个级别, 则只需使用两个 CPU 您想要并行化两个级别 嵌套并行区域容易创建过多的线程, 从而占用过多的系统资源 适当地设置 SUNW_MP_MAX_POOL_THREADS 和 SUNW_MP_MAX_NESTED_LEVELS 以限制使用的线程数, 防止系统资源枯竭 创建嵌套并行区域会增加开销 如果在外部级别有足够的并行操作并且负载平衡, 则通常在计算外部级别使用所有线程比在内部级别创建嵌套区域更有效 例如, 假定您的程序包含两级并行操作 外部级别的并行操作等级为 4, 并且负载平衡 您的系统具有四个 CPU, 您要使用所有四个 CPU 来加快此程序的执行速度 那么, 通常将所有 4 个线程用于外部级别比将 2 个线程用于外部并行区域而将其他 2 个线程用作内部并行区域的从属线程的性能要好 2-10 OpenMP API 用户指南 2005 年 1 月

53 第 3 章 Fortran 中的自动作用域 在 OpenMP 并行区域内声明变量的作用域属性称为作用域 通常, 如果将一个变量的作用域确定为 SHARED, 则所有线程共享该变量的一个副本 如果将一个变量的作用域确定为 PRIVATE, 则每个线程拥有其自己的变量副本 OpenMP 拥有丰富的数据环境 除了 SHARED 和 PRIVATE 之外, 还可以将变量的作用域声明为 FIRSTPRIVATE LASTPRIVATE, REDUCTION 或 THREADPRIVATE OpenMP 要求用户声明在并行区域中使用的每个变量的作用域 这是一个单调乏味, 极易出错的过程, 并且公认是使用 OpenMP 并行化程序过程中最艰难的部分 Fortran 95 编译器的 Sun Studio 9 发行版 f95 提供了自动作用域功能 该编译器不仅可以分析并行区域的执行和同步模式, 而且可以基于一组作用域规则确定变量的作用域 3.1 自动作用域数据范围子句 自动作用域数据范围子句是 Sun 对 Fortran OpenMP 规范的扩展 通过使用以下两种子句之一, 用户可以指定要自动确定作用域的变量 AUTO 子句 AUTO ( 变量列表 ) 该编译器将确定在并行区域内列出的各个变量的作用域 ( 注意 AUTO 之前的两个下划线 ) AUTO 子句出现在 PARALLEL PARALLEL DO PARALLEL SECTIONS 或 PARALLEL WORKSHARE 指令中 如果变量列在 AUTO 子句中, 则不能在其他任何数据作用域子句中将其指定 3-1

54 3.1.2 DEFAULT( AUTO) 子句 将此并行区域中缺省作用域设置为 AUTO DEFAULT( AUTO) 子句出现在 PARALLEL PARALLEL DO PARALLEL SECTIONS 或 PARALLEL WORKSHARE 指令中 3.2 作用域规则 在自动作用域下, 编译器应用以下规则来确定并行区域中变量的作用域 这些规则并不适用于由 OpenMP 规范隐式确定作用域的变量, 如共享任务 DO 循环的循环索引变量 标量变量的作用域规则 S1: 如果对于组中执行区域的线程而言, 在并行区域中使用变量的环境是自由的数据争用 1 条件, 则变量的作用域为 SHARED S2: 如果在每个执行并行区域的线程中, 变量始终在相同线程读取之前写入, 则将变量的作用域确定为 PRIVATE 如果变量的作用域确定为 PRIVATE, 并且在其写入并行区域之前读取, 而其构造为 PARALLEL DO 或 PARALLEL SECTIONS, 则将其作用域确定为 LASTPRIVATE S3: 如果在编译器识别的约简操作中使用变量, 则将该变量的作用域确定为具有此特定操作类型的 REDUCTION 数组的作用域规则 A1: 对于组中执行区域的线程而言, 如果在并行区域中使用变量的环境是自由的数据争用条件, 则数组的作用域为 SHARED 1. 当两个线程可以同时访问相同的共享变量 ( 其中至少有一个线程可以修改该变量 ) 时, 存在数据争用 要删除数据争用条件, 请将访问放入临界段或将线程同步 3-2 OpenMP API 用户指南 2005 年 1 月

55 3.3 关于自动作用域的通用注释 如果用户指定以下由 AUTO( 变量列表 ) 或 DEFAULT( AUTO) 自动确定作用域的变量, 则编译器将按照 OpenMP 规范中的隐含作用域规则确定变量的作用域 THREADPRIVATE 变量 Cray 指针对象 循环迭代变量只能在区域词汇范围内的顺序循环或绑定到区域的共享任务 DO 循环中使用 隐含的 DO 或 FORALL 索引 变量只能在绑定到区域的工作共享构造中使用, 并且在每个这种构造的数据作用域属性子句中指定 自动确定没有隐含作用域的变量的作用域时, 编译器将根据上述规则, 按照显示的顺序检查变量的用法 如果符合某个规则, 编译器将按照匹配的规则确定变量的作用域 如果不符合某个规则, 编译器将尝试使用下一个规则 如果编译器找不到符合的规则, 该变量作用域的自动确定将失败 自动确定变量的作用域失败后, 变量的作用域将被确定为 SHARED, 并且绑定并行区域将被序列化, 如同指定了 IF (.FALSE.) 子句 作用域的自动确定失败的原因有两个 一个原因是使用的变量不匹配任何规则 第二个原因是源代码对于编译器来说过于复杂, 因而无法执行全面的分析 函数调用 复杂的数组子脚本 内存别名和用户实现的同步都是常见原因 ( 请参阅第 3-7 页第 3.5 节的 当前实现的已知限制 ) 3.4 检查自动作用域的结果 使用编译器注释检查自动作用域结果, 并且查看并行区域是否因为自动作用域失败而序列化 使用 -g 调试选项进行编译时, 编译器将生成内联注释 可以使用 er_src 命令查看这个生成的注释, 如代码样例 3-2 所示 (er_src 命令作为 Sun Studio 软件的一部分提供 ; 有关详细信息, 请参阅 er_src(1) 手册页或 Sun Studio 性能分析器 手册 ) 第 3 章 Fortran 中的自动作用域 3-3

56 使用 -vpara 选项进行编译是一个良好的开端 如果自动作用域失败, 将打印一条警告消息 ( 如代码样例 3-1 所示 ) 使用 -vpara 进行编译 >cat t.f INTEGER X(100), Y(100), I, T C$OMP PARALLEL DO DEFAULT( AUTO) DO I=1, 100 T = Y(I) CALL FOO(X) X(I) = T*T END DO C$OMP END PARALLEL DO END >f95 -xopenmp -xo3 -vpara -c t.f "t.f", line 3:Warning: 并行区域已序列化因为下列变量的自动作用域失败 - x 代码样例 OpenMP API 用户指南 2005 年 1 月

57 使用编译器注释 >cat t.f INTEGER X(100), Y(100), I, T C$OMP PARALLEL DO DEFAULT( AUTO) DO I=1, 100 T = Y(I) X(I) = T*T END DO C$OMP END PARALLEL DO END 代码样例 3-2 >f95 -xopenmp -xo3 -g -c t.f >er_src t.o 源文件 :./t.f 目标文件 :./t.o 加载对象 :./t.o 1. INTEGER X(100), Y(100), I, T 2. OpenMP 构造中的专用变量如下 :t,i OpenMP 构造中的共享变量如下 :y,x OpenMP 构造中自动作用域为 PRIVATE 的变量如下 : i, t OpenMP 构造中自动作用域为 SHARED 的变量如下 : y, x 3. C$OMP PARALLEL DO DEFAULT( AUTO) 由显式用户指令并行化以下循环 4. DO I=1, 100 以下循环调度时的稳态循环计数 = 3 以下循环展开了 2 次以下循环每次迭代具有 1 次加载 1 次存储 0 次预取 0 次浮点加 0 次浮点减和 0 次浮点除 5. T = Y(I) 6. X(I) = T*T 7. END DO 8. C$OMP END PARALLEL DO END 第 3 章 Fortran 中的自动作用域 3-5

58 接下来, 使用一个更复杂的示例来解释自动作用域规则的应用方式 更复杂的示例 1. REAL FUNCTION FOO (N, X, Y) 2. INTEGER N, I 3. REAL X(*), Y(*) 4. REAL W, MM, M W = C$OMP PARALLEL DEFAULT( AUTO) C$OMP SINGLE 11. M = C$OMP END SINGLE MM = C$OMP DO 17. DO I = 1,N 18. T = X(I) 19. Y(I) = T 20. IF ( MM.GT.T) THEN 21. W = W + T 22. MM = T 23. END IF 24. END DO 25. C$OMP END DO C$OMP CRITICAL 28. IF ( MM.GT.M ) THEN 29. M = MM 30. END IF 31. C$OMP END CRITICAL C$OMP END PARALLEL FOO = W - M RETURN 38. END 代码样例 3-3 函数 FOO() 包含一个并行区域, 其包含一个 SINGLE 构造 一个工作共享 DO 构造和一个 CRITICAL 构造 如果我们忽略所有 OpenMP 并行构造, 则并行区域中使用的代码如下 : 3-6 OpenMP API 用户指南 2005 年 1 月

59 1. 将数组 X 中的值复制到数组 Y 2. 查找 X 中的最大正数, 并将其存储在 M 中 3. X 一些元素的值累积为变量 W 让我们来看一看编译器如何使用上述规则来查找并行区域中变量的适当作用域 在并行区域中使用下列变量 :I N MM T W M X 和 Y 编译器将确定以下内容 标量 I 是工作共享 DO 循环的循环索引 OpenMP 规范要求将 I 的作用域确定为 PRIVATE 标量 N 在并行区域中是只读的, 因此不会造成数据争用, 按照以下规则 S1, 将其作用域确定为 SHARED 执行并行区域的任何线程将执行语句 14, 该语句将标量 MM 的值设置为 0.0 这种写入方式将造成数据争用, 因此规则 S1 不适用 在同一线程中读取 MM 之前出现这种写入方式, 因此按照规则 S2 将 MM 的作用域确定为 PRIVATE 同样, 将标量 T 的作用域确定为 PRIVATE 读取标量 W, 然后写入语句 21, 因此规则 S1 和 S2 不适用 加法运算是关联 相互通信的, 因此按照规则 S3 将 W 的作用域确定为 REDUCTION(+) 标量 M 写入语句 11, 该语句位于 SINGLE 构造内 SINGLE 构造末尾的隐式屏障可确保不在读取语句 28 或写入语句 29 的同时写入语句 11, 而后面两者不会同时发生, 因为它们都位于同一 CRITICAL 构造内 没有两个线程可以同时访问 M 因此, 在并行区域中写入和读取 M 不会造成数据争用, 按照规则 S1, 将 M 的作用域确定为 SHARED 数组 X() 是只读的, 并且没有写入区域, 因此按照规则 A1 将其作用域确定为 SHARE D 写入数组 Y() 分布在线程之间, 没有两个线程可以写入相同的 Y() 元素 因为不存在数据争用, 因此按照规则 A1 将 Y() 的作用域确定为 SHARED 3.5 当前实现的已知限制 此处介绍了 Sun Studio 9 Fortran 95 编译器中自动作用域的已知限制 只识别 OpenMP 指令, 并且只能在分析中使用 不识别 OpenMP API 函数调用 例如, 如果程序使用 OMP_SET_LOCK() 和 OMP_UNSET_LOCK() 来实现临界段, 则编译器不能检测到是否存在临界段 如果可能的话, 使用 CRITICAL 和 END CRITICAL 指令 只有在 OpenMP 同步指令中指定的同步 ( 如 BARRIER 和 MASTER) 才能被识别, 并且在分析中使用 不识别用户实现的同步, 如忙等待 使用 -xopenmp=noopt 编译时不支持自动作用域 第 3 章 Fortran 中的自动作用域 3-7

60 3-8 OpenMP API 用户指南 2005 年 1 月

61 第 4 章 实现定义的行为 本章说明 OpenMP 2.0 Fortran 和 C/C++ 规范中依赖实现的某些特定问题 有关最新版编译器的最新信息, 请参阅 C C++ 和 Fortran 自述文件 调度在缺少显式 OMP_SCHEDULE 环境变量或显式 SCHEDULE 子句的情况下, 缺省值为 static 调度 线程数如果没有显式 num_threads() 子句 对 omp_set_num_threads() 函数的调用或 OMP_NUM_THREADS 环境变量的显式定义, 组中缺省线程数为 1 线程的动态调整如果启用了动态调整, 则将组内的线程数被调整为以下值中的最小值 : 用户请求的线程数 1 + 池中可用线程数可用处理器数如果禁用了动态调整, 则组内的线程数为以下值中的最小值 : 用户请求的线程数 1 + 池中可用线程数如果提供的线程数少于用户所请求的数量, 并且将 SUNW_MP_WARN 设置为 TRUE 或者通过调用 sunw_mp_register_warn() 来注册回调函数, 则会报告警告消息 在异常情况下, 如缺少系统资源, 提供的线程数少于上述值 在这些情况下, 如果禁用了动态调整并将 SUNW_MP_WARN 设置为 TRUE 或者通过调用 sunw_mp_register_warn() 来注册回调函数, 则会报告警告消息 有关线程池和嵌套并行操作执行模型的更多信息, 请参阅第 2 章 4-1

62 嵌套并行操作支持嵌套并行操作 可以由多个线程来执行嵌套并行区域 缺省情况下, 禁用嵌套并行操作 要启用它, 请设置 OMP_NESTED 环境变量或调用 omp_set_nested() 函数 请参阅第 2 章 ATOMIC 指令此实现在临界区域中封装目标语句来替换所有 ATOMIC 指令和 pragma GUIDED: 确定块大小如果未指定 chunksize, 则 SCHEDULE(GUIDED) 的缺省块大小为 1 OpenMP 运行时库使用以下公式来计算使用 GUIDED 调度的循环的块大小 chunksize = unassigned_iterations / (weight * num_threads) 其中 : unassigned_iterations 是循环中尚未分配给任何线程的迭代数 ; weight 是可由用户在运行时使用 SUNW_MP_GUIDED_WEIGHT 环境变量设置的浮点常量 ( 第 5-5 页第 5.3 节的 OpenMP 环境变量 ) 如果未指定, 则当前的缺省设置假定 weight 为 2.0 ; num_threads 是用于执行循环的线程数 加权值的选择会影响分配给循环中线程的迭代的初始块和后续块的大小, 并且直接影响负载平衡 实验结果表明缺省加权值 2.0 通常效果比较好 但是, 某些应用程序使用其他加权值可能会获得较好的效果 显式线程程序使用 POSIX 或 Solaris 线程的程序可以包含 OpenMP 指令或调用包含 OpenMP 指令的例程 运行时警告 设置 SUNW_MP_WARN 环境变量 ( 第 5-5 页第 5.3 节的 OpenMP 环境变量 ) 就会启用由 OpenMP 多任务库执行的运行时有效性检查 4-2 OpenMP API 用户指南 2005 年 1 月

63 例如, 因为线程在不同的屏障处等待, 所以以下代码陷入无限循环, 必须从终端使用 Control-C 来终止它 : % cat bad1.c #include <omp.h> #include <stdio.h> int main(void) { omp_set_dynamic(0); omp_set_num_threads(4); #pragma omp parallel { int i = omp_get_thread_num(); if (i % 2) { printf("at barrier 1.\n"); #pragma omp barrier } } return 0; } % cc -xopenmp -xo3 bad1.c %./a.out run the program At barrier 1. At barrier 1. program hung in endless loop Control-C to terminate execution 但是, 如果在执行前设置了 SUNW_MP_WARN, 运行时库将检测该问题 : % setenv SUNW_MP_WARN TRUE %./a.out At barrier 1. At barrier 1. WARNING (libmtsk):threads at barrier from different directives. Thread at barrier from bad1.c:11. Thread at barrier from bad1.c:17. Possible Reasons: Worksharing constructs not encountered by all threads in the team in the same order. Incorrect placement of barrier directives. 第 4 章实现定义的行为 4-3

64 C 编译器还提供了一个函数, 可用于在检测到错误时注册回调函数 只要检测到错误, 就会调用注册的回调函数, 并将指向错误消息字符串的指针作为参数传递给它 int sunw_mp_register_warn(void (*func) (void *) ) 要访问此函数的原型, 您需要添加 #include <sunw_mp_misc.h> 4-4 OpenMP API 用户指南 2005 年 1 月

65 例如 : % cat bad2.c #include <omp.h> #include <sunw_mp_misc.h> #include <stdio.h> void handle_warn(void *msg) { printf("handle_warn:%s\n", (char *)msg); } void set(int i) { static int k; #pragma omp critical { k++; } #pragma omp barrier } int main(void) { int i, rc; omp_set_dynamic(0); omp_set_num_threads(4); if (sunw_mp_register_warn(handle_warn)!= 0) { printf ("Installing callback failed\n"); } #pragma omp parallel for for (i = 0; i < 20; i++) { set(i); } return 0; } % cc -xopenmp -xo3 bad2.c % a.out handle_warn:warning (libmtsk):at bad2.c:21 Barrier is not permitted in dynamic extent of for / DO. 如果 OpenMP 运行时库检测到错误, 则将 handle_warn() 安装为回调处理程序函数 本示例中的处理程序只打印从库传递给它的错误消息, 但可以将其用于捕获某些错误 第 4 章实现定义的行为 4-5

66 4-6 OpenMP API 用户指南 2005 年 1 月

67 第 5 章 OpenMP 编译 本章介绍如何利用 OpenMP API 编译程序 要在多线程环境下运行并行化的程序, 必须在执行程序前设置 OMP_NUM_THREADS 环境变量 这通知运行时系统程序可以创建的最大线程数 缺省值为 1 一般将 OMP_NUM_THREADS 的值设置为不大于目标平台上可用的处理器数 可以将 OMP_DYNAMIC 设置为 FALSE 以使用 OMP_NUM_THREADS 指定的线程数 编译器自述文件包含与其 OpenMP 实现有关的限制和已知缺陷方面的信息 使用 -xhelp=readme 标志调用编译器, 或将 HTML 浏览器指向已安装软件的文档索引所在的以下路径, 可直接查看自述文件 file:/opt/sunwspro/docs/index.html 5.1 要使用的编译器选项 要使 OpenMP 指令可以进行显式并行化, 请使用 cc CC 或 f95 选项标志 -xopenmp 编译程序 此标志可带有可选关键字参数 (f95 编译器将 -xopenmp 和 -openmp 均按同义字接受 ) 5-1

68 -xopenmp 标志接受下列关键字子选项 -xopenmp=parallel -xopenmp=noopt -xopenmp=stubs -xopenmp=none 启用 OpenMP pragma 的识别 -xopenmp=parallel 的最低优化级别是 -xo3 如有必要, 编译器将优化级别从较低级别更改为 -xo3, 并发出警告 启用 OpenMP pragma 的识别 如果级别低于 -xo3, 编译器不会提高级别 如果将优化级别显式地设置为低于 -xo3 的级别, 如 -xo2 -openmp=noopt, 编译器会报告错误 如果没有使用 -openmp=noopt 指定优化级别, 则识别 OpenMP 编译指示, 并相应地并行化程序, 但不执行优化 ( 此子选项只适用于 cc 和 f95 ; 指定时 CC 会发出警告, 且不执行 OpenMP 并行化 ) 不再支持此选项 OpenMP 桩模块库是为了方便起见提供给用户的 要编译调用 OpenMP 库函数但忽略 OpenMP pragma 的 OpenMP 程序, 请不要使用 -xopenmp 选项编译该程序, 并使用 libompstubs.a 库链接对象文件 例如, % cc omp_ignore.c -lompstubs 不支持同时使用 libompstubs.a 和 OpenMP 运行时库 libmtsk.so 进行链接, 这种链接方式可能会导致出现意外行为 禁用 OpenMP 编译指示的识别, 并且不更改优化级别 附加说明 : 如果未在命令行指定 -xopenmp, 编译器会假定使用 -xopenmp=none( 禁用对 OpenMP pragma 的识别 ) 如果指定 -xopenmp 时不带关键字子选项, 编译器会假定使用 -xopenmp=parallel 不要将 -xopenmp 与 -xparallel 或 -xexplicitpar 在命令行上一并指定 指定 -xopenmp=parallel 或 noopt 将把 _OPENMP 预处理程序标记定义为 YYYYMM 格式 ( 具体地讲,C/C++ 定义为 L,Fortran 95 定义为 ) 使用 dbx 调试 OpenMP 程序时, 请使用 -xopenmp=noopt -g 进行编译 5-2 OpenMP API 用户指南 2005 年 1 月

69 -xopenmp 的缺省优化级别在未来版本中可能会发生变化 显式地指定适当的优化级别可避免出现编译警告消息 如果是 Fortran 95, -xopenmp -xopenmp=parallel -xopenmp=noopt 会自动添加 -stackvar 如果在构建动态 (.so) 库时使用 -xopenmp 进行编译, 则必须在链接可执行文件时同时指定 -xopenmp, 并且用于创建可执行文件的编译器至少必须与使用 -xopenmp 构建动态库的编译器版本相同 使用带有 -xopenmp 不同版本的编译器来创建可执行文件和库将导致出现意外行为 5.2 Fortran 95 OpenMP 验证 使用 f95 编译器的全局程序检查功能可以实现对 Fortran 95 程序的 OpenMP 指令的静态 过程间验证 使用 -XlistMP 标志进行编译来启用 OpenMP 检查 ( 来自 -XlistMP 的诊断消息会出现在一个单独的文件中, 该文件的名称由源文件名和.lst 扩展名构成 ) 编译器将诊断下列违规和并行化抑制因素 : 并行指令规范中的违规, 包括不当嵌套 因使用数据而被过程间依存分析检测出的并行化抑制因素 过程间指针分析检测出的并行化抑制因素 第 5 章 OpenMP 编译 5-3

70 例如, 使用 -XlistMP 编译源文件 ord.f 会生成诊断文件 ord.lst: FILE "ord.f" 1!$OMP PARALLEL 2!$OMP DO ORDERED 3 do i=1,100 4 call work(i) 5 end do 6!$OMP END DO 7!$OMP END PARALLEL 8 9!$OMP PARALLEL 10!$OMP DO 11 do i=1, call work(i) 13 end do 14!$OMP END DO 15!$OMP END PARALLEL 16 end 17 subroutine work(k) 18!$OMP ORDERED ^ **** ERR-OMP:It is illegal for an ORDERED directive to bind to a directive (ord.f, line 10, column 2) that does not have the ORDERED clause specified. 19 write(*,*) k 20!$OMP END ORDERED 21 return 22 end 本例中,WORK 子例程中的 ORDERED 指令收到有关第二个 DO 指令的诊断, 因为该指令缺少 ORDERED 子句 5-4 OpenMP API 用户指南 2005 年 1 月

71 5.3 OpenMP 环境变量 OpenMP 规范定义了四个用来控制 OpenMP 程序执行的环境变量 下表对它们进行了概括 尽管其他多重处理环境变量也影响 OpenMP 程序的执行, 但它们不是 OpenMP 规范 表 5-1 环境变量 OpenMP 环境变量 功能 OMP_SCHEDULE 为指定了 RUNTIME 调度类型的 DO PARALLEL DO parallel for for 及指令 /pragma 设置调度类型 未定义时使用缺省值 STATIC 值为 type[,chunk] 示例 :setenv OMP_SCHEDULE "GUIDED,4" OMP_NUM_THREADS PARALLEL OMP_DYNAMIC OMP_NESTED 或 并行区域执行时设置需使用的线程数 NUM_THREADS 子句或 OMP_SET_NUM_THREADS() 调用可以覆盖该线程数 未设置时使用缺省值 1 值为正整数 为与传统程序兼容, 设置 PARALLEL 环境变量和设置 OMP_NUM_THREADS 环境变量的效果相同 但如果将这两个环境变量都设置为不同的值, 运行时库会发出一个错误消息 示例 :setenv OMP_NUM_THREADS 16 为并行区域的执行启用或禁用对可用线程数的动态调整 未设置时使用缺省值 TRUE 值为 TRUE 或 FALSE 示例 :setenv OMP_DYNAMIC FALSE 启用或禁用嵌套并行操作 值为 TRUE 或 FALSE 缺省值为 FALSE 示例 :setenv OMP_NESTED FALSE 的一部分 下表对它们进行了概括 第 5 章 OpenMP 编译 5-5

72 表 5-2 多重处理环境变量 环境变量 SUNW_MP_WARN SUNW_MP_THR_IDLE SUNW_MP_PROCBIND SUNW_MP_MAX_POOL_THREADS 功能 控制 OpenMP 运行时库发出的警告消息 设置为 TRUE 时, 运行时库会给 stderr 发出警告消息 ; 设置为 FALSE 时禁用警告消息 缺省值为 FALSE OpenMP 运行时库可以检查很多常见的 OpenMP 违规行为, 如错误的嵌套和死锁 运行时检查会增加程序执行的开销 请参阅第 4-2 页 运行时警告 示例 : setenv SUNW_MP_WARN TRUE 控制执行程序的并行部分的每个帮助程序线程的任务结束状态 可以将值设置为 SPIN SLEEP ns 或者 SLEE P nms 缺省为 SLEEP - 线程在完成并行任务后进入休眠状态, 直到有新的并行任务到达为止 选择 SLEEP time 指定完成并行任务后帮助程序线程应旋转等待的时间 如果在线程空转期间此线程有新任务到达, 此线程会立即执行新任务 否则, 线程便进入休眠状态, 新任务到达时再被唤醒 time 可以秒 (ns) 或只使用 (n) 或毫秒 (nms) 为单位指定 不带参数的 SLEEP 在完成并行任务后即将线程置于休眠状态 SLEEP SLEEP (0) SLEEP (0s) 和 SLEEP (0ms) 均等价 示例 : setenv SUNW_MP_THR_IDLE SLEEP (50ms) SUNW_MP_PROCBIND 环境变量可用于将 OpenMP 程序的 LWP ( 轻量进程 ) 绑定到处理器 虽然可以通过处理器绑定来增强性能, 但是如果将多个 LWP 绑定到相同的处理器, 则将导致性能下降 详细信息, 请参阅第 5-7 页第 5.4 节的 处理器绑定 指定线程池的最大大小 线程池只包含 OpenMP 运行时库创建的非用户线程 它不包含主线程或用户程序显式创建的任何线程 如果将此环境变量设置为零, 则线程池为空, 并且将由一个线程执行所有的并行区域 如果未指定, 则缺省值是 1023 有关详细信息, 请参阅第 2-1 页第 2.2 节的 控制嵌套并行操作 5-6 OpenMP API 用户指南 2005 年 1 月

73 表 5-2 多重处理环境变量 ( 续 ) 环境变量 SUNW_MP_MAX_NESTED_LEVELS STACKSIZE SUNW_MP_GUIDED_WEIGHT 功能 指定活动嵌套并行区域的最大深度 活动嵌套深度大于此环境变量值的任何并行区域将仅由一个线程来执行 如果并行区域是具有假 IF 子句的 OpenMP 并行区域, 则不会将该区域视为活动区域 如果未指定, 则缺省值是 4 有关详细信息, 请参阅第 2-1 页第 2.2 节的 控制嵌套并行操作 设置每个线程的栈大小 值以千字节为单位 缺省线程栈大小在 32 位 SPARC V8 和 x86 平台上为 4 兆字节, 在 64 位 SPARC V9 和 x86 平台上为 8 兆字节 示例 : setenv STACKSIZE 8192 将线程栈大小设置为 8 兆字节 设置加权因子, 这些因子用于确定在使用 GUIDED 调度的循环中为线程分配的块的大小 该值应该是正浮点数, 并且应用于在程序中使用 GUIDED 调度的所有循环 如果未设置, 则假定的缺省值为 处理器绑定 处理器绑定与静态调度一起使用时, 将有益于展示某个数据重用模式的应用程序, 在该应用程序中, 由并行区域中的线程访问的数据将位于上一次所调用并行区域的本地缓存中 缺省情况下, 轻量进程 LWP 不会绑定到处理器 此任务会移交到 Solaris OS, 通过它来调度处理器上的 LWP OpenMP 运行时库 libmtsk 中的多任务例程始终使用一对一的线程模型 ; 即每个线程均与一个 LWP 相对应 SUNW_MP_PROCBIND 环境变量指定的值表示 LWP 将绑定到的 逻辑 处理器标识符 (ID) 逻辑处理器 ID 是从 0 开始的连续整数, 与实际的处理器 ID 可能相同, 也可能不相同 如果在线可用 n 个处理器, 则它们的虚拟处理器 ID 是 n-1, 采用 psrinfo(1m) 显示的顺序 逻辑处理器 ID 和实际处理器 ID 之间的映射取决于系统 在大多数系统上, 实际处理器 ID 是有序的 ; 然而, 删除系统板可能会造成范围内出现空缺 在某些系统上, ID 采用 4 个为一组的形式, 其中每组开头之间的间隙是 32 ; 因此, 处理器的编号可以为 , 依次类推 libmtsk 创建的线程数是由用户程序中的环境变量和 / 或 API 调用决定的 SUNW_MP_PROCBIND 指定一组逻辑处理器, 如下所述 LWP 以循环的方式绑定到这组逻辑处理器上 如果 LWP 的数量比处理器少, 则一些处理器就不会绑定 LWP 如果 LWP 的数量比处理器多, 则一些处理器会绑定多个 LWP 第 5 章 OpenMP 编译 5-7

74 为 SUNW_MP_PROCBIND 指定的值可以是下列值之一 : 字符串 TRUE 或 FALSE ( 或小写字母 ) 例如, % setenv SUNW_MP_PROCBIND false 非负整数 例如, % setenv SUNW_MP_PROCBIND 2 由一个或多个空格来分隔两个或多个非负整数的列表 例如, % setenv SUNW_MP_PROCBIND " " 两个非负整数 n1 和 n2 之间由减号 ( - ) 分隔 ; n1 必须小于或等于 n2 例如, % setenv SUNW_MP_PROCBIND "0-6" 如果为 SUNW_MP_PROCBIND 指定的值是 FALSE, 则不执行处理器绑定 这是缺省行为 如果为 SUNW_MP_PROCBIND 指定的值是 TRUE, 则该值就相当于整数 0 如果为 SUNW_MP_PROCBIND 指定的值是非负整数, 则该整数指定 LWP 应该绑定到的起始逻辑处理器 ID LWP 将以循环的方式绑定到处理器, 以指定的逻辑处理器 ID 开头, 并且在逻辑处理器 ID n-1 之后环绕逻辑处理器 ID 0 如果为 SUNW_MP_PROCBIND 指定的值是两个或多个非负整数的列表, 则 LWP 将以循环的方式绑定到指定的逻辑处理器 ID 将不会使用列表以外的 ID 如果为 SUNW_MP_PROCBIND 指定的值是两个用减号 ( - ) 分隔的非负整数, 则 LWP 将以循环的方式绑定到处理器, 处理器位于以第一个逻辑处理器 ID 开头, 并以第二个逻辑处理器 ID 结尾的范围内 将不会使用此范围之外的 ID 如果为 SUNW_MP_PROCBIND 指定的值不符合上述形式之一, 或如果指定无效的逻辑处理器 ID, 则将忽略环境变量 SUNW_MP_PROCBIND, 并且 LWP 将不绑定到处理器 如果已启用警告, 则在这种情况下将发出一条警告消息 5.5 栈和栈大小 正在执行的程序为执行该程序的初始线程保留主内存栈, 并为每个从属线程保留不同的栈 栈是临时内存地址空间, 用于保留子程序或函数引用调用期间的参数和自动变量 主栈的缺省大小一般约为 8 兆字节 使用 f95 -stackvar 选项编译 Fortran 程序会强制将局部变量和数组像自动变量一样在栈中分配 显式并行化的程序暗指对 OpenMP 程序使用 -stackvar, 因为该选项会提高优化器在循环中并行化调用的能力 ( 请参阅 Fortran 用户指南 中有关 -stackvar 标志的论述 ) 但如果分配给栈的内存不足, 这样会导致栈溢出 使用 limit C-shell 命令或 ulimit ksh/sh 命令来显示或设置主栈的大小 5-8 OpenMP API 用户指南 2005 年 1 月

75 OpenMP 程序的每个从属线程均具有其自身的线程栈 此栈模拟初始 ( 或主 ) 线程栈, 但归线程专有 线程的 PRIVATE 数组和变量 ( 线程的局部变量 ) 在线程栈中分配 在 32 位 SPARC V8 和 x86 平台上的缺省大小为 4 兆字节 ; 在 64 位 SPARC V9 和 x86 平台上为 8 兆字节 帮助程序线程栈的大小使用 STACKSIZE 环境变量来设置 demo% setenv STACKSIZE demo% STACKSIZE=16384 demo% export STACKSIZE <- 将线程栈大小设置为 16 兆字节 (C shell) <- 相同, 使用 Bourne/Korn shell 可能需要反复试验才能确定最佳栈大小 如果栈小到不足以满足线程的运行需要, 可能会导致邻近线程中发生静态数据损坏或段故障 如果无法确定是否有栈溢出, 请使用 -xcheck=stkovf 标志编译 Fortran C 或 C++ 程序来强制栈溢出时发生段故障 这样便可以在发生数据损坏前停止程序 第 5 章 OpenMP 编译 5-9

76 5-10 OpenMP API 用户指南 2005 年 1 月

77 第 6 章 转换为 OpenMP 本章提供使用 Sun 或 Cray 指令和 pragma 将传统程序转换为 OpenMP 的指导 6.1 转换传统 Fortran 指令 传统 Fortran 程序使用 Sun 或 Cray 风格的并行化指令 Fortran 编程指南 的并行化一章中有对这些指令的描述 转换 Sun 风格的 Fortran 指令 以下表格提供与 Sun 并行化指令及其子子句近似等效的 OpenMP 指令和子子句 这些只是建议值 表 6-1 将 Sun 并行化指令转换为 OpenMP Sun 指令 C$PAR DOALL [qualifiers] 等效 OpenMP 指令!$omp parallel do [qualifiers] 6-1

78 表 6-1 将 Sun 并行化指令转换为 OpenMP ( 续 ) Sun 指令 等效 OpenMP 指令 C$PAR DOSERIAL 无完全等效指令 可以使用 :!$omp master loop!$omp end master C$PAR DOSERIAL* 无完全等效指令 可以使用 :!$omp master loopnest!$omp end master C$PAR TASKCOMMON block[,...]!$omp threadprivate (/block/[,...]) DOALL 指令可带有下列可选限定符子句 表 6-2 DOALL 限定符子句和等效的 OpenMP 子句 Sun DOALL 子句 PRIVATE(v1,v2,...) SHARED(v1,v2,...) MAXCPUS(n) READONLY(v1,v2,...) 等效的 OpenMP PARALLEL DO 子句 private(v1,v2,...) shared(v1,v2,...) num_threads(n). 无完全等效指令 无完全等效指令 使用 firstprivate(v1,v2,...) 可以获得相同效果 STOREBACK(v1,v2,...) lastprivate ( v1,v2,...) SAVELAST REDUCTION(v1,v2,...) 无完全等效指令 使用 lastprivate(v1,v2,...) 可以获得相同效果 reduction(operator:v1,v2,...) 必须提供约简操作符和变量列表 SCHEDTYPE(spec) schedule(spec) ( 请参阅表 6-3) SCHEDTYPE(spec) 子句接受下列调度规范 表 6-3 SCHEDTYPE 调度和等效的 OpenMP schedule SCHEDTYPE(spec) SCHEDTYPE(STATIC) 等效的 OpenMP schedule(spec) 子句 schedule(static) 6-2 OpenMP API 用户指南 2005 年 1 月

79 表 6-3 SCHEDTYPE 调度和等效的 OpenMP schedule ( 续 ) SCHEDTYPE(spec) 等效的 OpenMP schedule(spec) 子句 SCHEDTYPE(SELF(chunksize)) schedule(dynamic,chunksize) 缺省 chunksize 为 1 SCHEDTYPE(FACTORING(m)) 无完全等效指令 SCHEDTYPE(GSS(m)) schedule(guided, m) 缺省 m 为 Sun 风格的 Fortran 指令和 OpenMP 指令间的问题 私有变量作用域必须使用 OpenMP 加以显式声明 对于 Sun 指令, 编译器对未在 PRIVATE 或 SHARED 子句中显式确定作用域的变量使用其自己的缺省作用域规则 : 所有标量均按 PRIVATE 处理 ; 所有数组引用均按 SHARED 处理 对于 OpenMP, 除非 PARALLEL DO 指令中出现 DEFAULT(PRIVATE) 子句, 否则缺省数据作用域为 SHARED DEFAULT(NONE) 子句会使编译器标记那些未显式确定作用域的变量 有关在 Fortran 中自动确定作用域的信息, 请参阅第 3 章 由于没有 DOSERIAL 指令, 因此混合自动和显式 OpenMP 并行化的结果可能会不同 : 某些使用 Sun 指令不能自动并行化的循环可能会被自动并行化 OpenMP 提供并行区域和并行段来提供更丰富的并行操作模型 使用 Sun 指令来重新设计程序的并行操作策略, 以利用 OpenMP 的这些功能, 便有可能获得更高的性能 转换 Cray 风格的 Fortran 指令 Cray 风格的 Fortran 并行化指令与 Sun 风格的并行化指令几乎完全相同, 只不过标识这些指令的标记是!MIC$ 此外,!MIC$ DOALL 上的限定符子句集也不同 表 6-4 Cray 风格的 DOALL 限定符子句的等效 OpenMP 子句 Cray DOALL 子句 SHARED(v1,v2,...) PRIVATE(v1,v2,...) AUTOSCOPE SAVELAST 等效的 OpenMP PARALLEL DO 子句 SHARED(v1,v2,...) PRIVATE(v1,v2,...) 无等效子句 确定作用域必须是显式的, 或者使用 DEFAULT 子句或 AUTO 子句 无完全等效指令 使用 lastprivate 可以获得相同效果 MAXCPUS(n) num_threads(n). 无完全等效指令 GUIDED schedule(guided, m) 缺省 m 为 1 第 6 章转换为 OpenMP 6-3

并行计算

并行计算 OpenMP OpenMP OpenMP OpenMP OpenMP MPI OpenMP OpenMP 2006-10-9 2 OpenMP ( ) OpenMP RedHat Linux Intel C OpenMP 2006-10-9 3 OpenMP OpenMP OpenMP OpenMP 2006-10-9 4 RedHat Linux Intel C root intel8.1 chmod

More information

2011, Oracle / U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware

2011, Oracle / U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware Oracle Solaris Studio 12.3 OpenMP API E26443 2011 12 E26443-01 2011, Oracle / U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on

More information

版权所有 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,California 95054, U.S.A. 保留所有权利 美国政府权利 - 商业软件 政府用户应遵守 Sun Microsystems, Inc. 标准许可证协

版权所有 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,California 95054, U.S.A. 保留所有权利 美国政府权利 - 商业软件 政府用户应遵守 Sun Microsystems, Inc. 标准许可证协 OpenMP API 用户指南 Sun Studio 8 Sun Microsystems, Inc. www.sun.com 部件号 817-5814-10 2004 年 4 月, 修订版 A 请将关于本文档的意见发送至 :http://www.sun.com/hwdocs/feedback 版权所有 2004 Sun Microsystems, Inc., 4150 Network Circle,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 OpenMP 并行编程 ( 三 ) 运行库函数 环境变量 1 内容提要 OpenMP 库函数 OpenMP 环境变量 OpenMP 示例 2 库函数 OpenMP 库函数 (Runtime Library Routines) OMP_SET_NUM_THREADS(INT_VAR) OMP_GET_NUM_THREADS() OMP_GET_MAX_THREADS() OMP_GET_THREAD_NUM()

More information

并行算法实践

并行算法实践 OpenMP 编程指南 OpenMP 编程指南 OpenMP 概述 OpenMP 编程风络 OpenMP 编程简介 运行库例程与环境变量 OpenMP 计算实例 2 OpenMP 概述 OpenMP 应用编程接口 API 是在共享存储体系结构上的一个编程模型 包含编译制导 (Compiler Directive) 运行库例程 (Runtime Library) 和环境变量 (Environment

More information

Sun Fire V440 Server Administration Guide - zh_TW

Sun Fire V440 Server Administration Guide - zh_TW Sun Fire V440 Server 管 理 指 南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 650-960-1300 文 件 號 碼 :817-2818-10 2003 年 7 月, 修 訂 版 A 將 您 對 此 文 件 的 意 見 傳 送 到 :http://www.sun.com/hwdocs/feedback

More information

第7章-并行计算.ppt

第7章-并行计算.ppt EFEP90 10CDMP3 CD t 0 t 0 To pull a bigger wagon, it is easier to add more oxen than to grow a gigantic ox 10t 0 t 0 n p Ts Tp if E(n, p) < 1 p, then T (n) < T (n, p) s p S(n,p) = p : f(x)=sin(cos(x))

More information

智力测试故事

智力测试故事 II 980.00 ... 1... 1... 1... 2... 2... 2... 3... 3... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 8... 9... 9...10...10...10 I II...11...11...11...12...13...13...13...14...14...14...15...15...15...16...16...17...17...18...18...19...19...19...19...20...20...21...21...21

More information

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su Java Desktop System Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 819 0675 10 2005 2 2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun Sun Berkeley

More information

Sun StorEdge 3000 系列安装、操作和维护手册 (3310)

Sun StorEdge 3000 系列安装、操作和维护手册 (3310) Sun StorEdge 3000 系 列 安 装 操 作 和 维 护 手 册 Sun StorEdge 3310 SCSI 阵 列 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 650-960-1300 部 件 号 816-7960-11 2003 年 6 月, 修 订 版 A 有 关 本 文 档 的

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

I. 1-2 II. 3 III. 4 IV. 5 V. 5 VI. 5 VII. 5 VIII. 6-9 IX. 9 X XI XII. 12 XIII. 13 XIV XV XVI. 16

I. 1-2 II. 3 III. 4 IV. 5 V. 5 VI. 5 VII. 5 VIII. 6-9 IX. 9 X XI XII. 12 XIII. 13 XIV XV XVI. 16 125-0834I/1405/GH I. 1-2 II. 3 III. 4 IV. 5 V. 5 VI. 5 VII. 5 VIII. 6-9 IX. 9 X. 10-11 XI. 11-12 XII. 12 XIII. 13 XIV. 14-15 XV. 15-16 XVI. 16 I. * ++p ++ p ++ ++ * ++p ++ ++ ++p 1 2 ++ ++ ++ ++ ++ I.

More information

30,000,000 75,000,000 75,000, (i) (ii) (iii) (iv)

30,000,000 75,000,000 75,000, (i) (ii) (iii) (iv) 30,000,000 75,000,000 75,000,000 24 (i) (ii) (iii) (iv) # * 1,800,000 1,800,000 15% 3,400,000 3,400,000 15% 4,200,000 4,200,000 10% 8,600,000 8,600,000 10% 12,600,000 12,600,000 88% 10% 16,000,000 16,000,000

More information

2007, Oracle / Sun Microsystems, Inc. / Sun Microsystems, Inc. FAR Federal Acquisition Regulations Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Mi

2007, Oracle / Sun Microsystems, Inc. / Sun Microsystems, Inc. FAR Federal Acquisition Regulations Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Mi Sun Studio 12 820 3035 2007 9 2007, Oracle / Sun Microsystems, Inc. / Sun Microsystems, Inc. FAR Federal Acquisition Regulations Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Sun Solaris

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD University of California UNIX X/Open Company, Ltd.

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD University of California UNIX X/Open Company, Ltd. Java Desktop System 2 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 7758 10 2004 9 2004 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun Sun

More information

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su Linux Java Desktop System 3 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 819 1515 10 2005 8 2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun

More information

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su

2005 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / Sun Sun Microsystems Su StarSuite 8 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 819 1344 10 2005 6 2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun Sun Berkeley BSD

More information

奇闻怪录

奇闻怪录 ... 1... 1... 2... 3... 3... 4... 4... 5... 5... 6... 8... 9... 10... 10... 11... 11... 13... 13... 14... 14... 15... 16... 17... 21 I ... 22... 23... 23... 24... 25... 25... 26... 27... 28... 29 UFO...

More information

Microsoft Word - John_Ch_1202

Microsoft Word - John_Ch_1202 新 约 圣 经 伴 读 约 翰 福 音 目 录 说 明..I 序 言 : 圣 经 中 神 圣 启 示 的 三 层.II 按 时 分 粮 的 原 则..VIII 纲 目 XI 第 一 章..1 第 二 章 13 第 三 章 25 第 四 章 37 第 五 章 49 第 六 章 61 第 七 章 73 第 八 章 85 第 九 章 97 第 十 章..109 第 十 一 章..121 第 十 二 章..133

More information

Java Desktop System 呂衄盋 2 呂衄说柔

Java Desktop System 呂衄盋 2 呂衄说柔 Java Desktop System 2 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 7767 10 2004 10 2004 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun Sun

More information

全唐诗50

全唐诗50 ... 1... 1... 2... 2... 3... 3... 3... 4... 4... 5... 5... 6... 6... 6... 7... 7... 7... 8... 8... 8... 9 I II... 9...10...10...10...11...11...11...12...12...12...13...14...14...15...15...16...16...16...17,...17...18...18...19...19...19

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

施 的 年 度 維 修 工 程 已 於 4 月 15 日 完 成, 並 於 4 月 16 日 重 新 開 放 給 市 民 使 用 ii. 天 水 圍 游 泳 池 的 年 度 維 修 工 程 已 於 3 月 31 日 完 成, 並 於 4 月 1 日 重 新 開 放 給 市 民 使 用 iii. 元

施 的 年 度 維 修 工 程 已 於 4 月 15 日 完 成, 並 於 4 月 16 日 重 新 開 放 給 市 民 使 用 ii. 天 水 圍 游 泳 池 的 年 度 維 修 工 程 已 於 3 月 31 日 完 成, 並 於 4 月 1 日 重 新 開 放 給 市 民 使 用 iii. 元 地 委 會 文 件 2016/ 第 25 號 ( 於 6.5.2016 會 議 討 論 ) 康 樂 及 文 化 事 務 署 在 元 朗 區 內 舉 辦 的 康 樂 體 育 活 動 及 設 施 管 理 綜 合 匯 報 (2016 年 5 月 號 報 告 ) 目 的 本 文 件 旨 在 向 各 委 員 匯 報 康 樂 及 文 化 事 務 署 ( 康 文 署 ) 於 2016 年 2 月 至 5 月 在

More information

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM Oracle Solaris Studio 12.2 DLight 2010 9 2 2 3 DLight 3 3 6 13 CPU 16 18 21 I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AMP Apache MySQL

More information

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / SunSun MicrosystemsSun

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD UNIX X/Open Company, Ltd. / SunSun MicrosystemsSun SAP livecache Sun Cluster Solaris OS SPARC Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 7374 10 2004 4 A 2004 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA

More information

对联故事

对联故事 980.00 ... 1... 1... 2... 3... 3... 4... 4... 5... 5... 6... 7... 7... 8... 9...10...10...11...12...13...13...14...15...15...16...17 I II...18...18...19...19...20...21...21...22...22...23...24...25...25...26...26...27...28...29...29...30...30...31...32...32...33...34...34...35

More information

2015年廉政公署民意調查

2015年廉政公署民意調查 報 告 摘 要 2015 年 廉 政 公 署 周 年 民 意 調 查 背 景 1.1 為 了 掌 握 香 港 市 民 對 貪 污 問 題 和 廉 政 公 署 工 作 的 看 法, 廉 政 公 署 在 1992 至 2009 年 期 間, 每 年 均 透 過 電 話 訪 問 進 行 公 眾 民 意 調 查 為 更 深 入 了 解 公 眾 對 貪 污 問 題 的 看 法 及 關 注, 以 制 訂 適 切

More information

PowerPoint Presentation

PowerPoint Presentation 并行计算 Parallel Computing 主讲人徐云 Spring, 2019 第四篇并行程序设计 第十三章并行程序设计基础第十四章共享存储系统并行编程第十五章分布存储系统并行编程第十六章并行程序设计环境与工具 第十四章共享存储系统并行编程 14.1 ANSI X3H5 共享存储模型 14.2 POSIX 线程模型 14.3 OpenMP 模型 国家高性能计算中心 ( 合肥 ) 编程模型的作用

More information

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc 草 稿 致 省 級 管 理 單 位 之 推 薦 書 二 零 零 九 年 十 月 十 七 日 加 拿 大 中 醫 管 理 局 聯 盟 All rights reserved 序 言 加 拿 大 中 醫 管 理 局 聯 盟, 於 二 零 零 八 年 一 月 至 二 零 零 九 年 十 月 間, 擬 定 傳 統 中 醫 執 業 之 基 礎 文 件 由 臨 床 經 驗 豐 富 之 中 醫 師 教 育 者 及

More information

Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 版 權 所 有 Sun Microsystems, Inc. 對 於 本 文 件 所 述 技 術 擁 有

Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 版 權 所 有 Sun Microsystems, Inc. 對 於 本 文 件 所 述 技 術 擁 有 Sun Management Center 3.6 版 本 5 附 加 軟 體 版 本 說 明 適 用 於 Sun Fire Sun Blade Netra 及 Sun Ultra 系 統 Sun Microsystems, Inc. www.sun.com 文 件 號 碼 820-0131-10 2006 年 10 月, 修 訂 版 A 請 將 您 對 本 文 件 的 意 見 提 交 至 :http://www.sun.com/hwdocs/feedback

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

像 客 样 使 命令行 徐 东

像 客 样 使 命令行 徐 东 像 客 样 使 命令行 徐 东 1 1.1................................ 1 1.2................................. 3 1.3............................. 4 1.3.1 Linux............................ 5 1.3.2 macos............................

More information

Microsoft Word - COC HKROO App I _Chi_ Jan2012.doc

Microsoft Word - COC HKROO App I _Chi_ Jan2012.doc 附 錄 I 目 錄 項 目 貨 品 描 述 頁 數 (I) 活 動 物 ; 動 物 1 (II) 植 物 2 (III) 動 物 或 植 物 脂 肪 及 油 及 其 分 化 後 剩 餘 的 ; 經 處 理 可 食 的 脂 肪 ; 動 物 或 植 物 蠟 2 (IV) 經 配 製 的 食 品 ; 飲 料 酒 及 醋 ; 煙 草 及 製 成 的 煙 草 代 替 品 2 (V) 礦 產 5 (VI) 化

More information

中国石化齐鲁股份有限公司

中国石化齐鲁股份有限公司 2004 2004 3 4 6 9 13 14 15 22 24 26 49 1 2004 9 2 2004 SINOPEC QILU COMPANY LTD. 0533-3583728 lifan@qilu.com.cn 0533-7512530 baoweisong@163.net 0533-3583718 255086 qlsh600002@126.com http://www.qilu.com.cn

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

-i-

-i- -i- -ii- -iii- -iv- -v- -vi- -vii- -viii- -ix- -x- -xi- -xii- 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11

More information

Microsoft Word - 强迫性活动一览表.docx

Microsoft Word - 强迫性活动一览表.docx 1 1 - / 2 - / 3 - / 4 - / 5 - I. 1. / 2. / 3. 4. 5. 6. 7. 8. 9 10 11. 12. 2 13. 14. 15. 16. 17. 18. 19. 20 21. 22 23. 24. / / 25. 26. 27. 28. 29. 30. 31. II. 1. 2 3. 4 3 5. 6 7 8. 9 10 11 12 13 14. 15.

More information

1 2 6 8 15 36 48 55 58 65 67 74 76 150 152 1 3 1 2 4 2 2001 2000 1999 12 31 12 31 12 31 304,347 322,932 231,047 14,018 16,154 5,665 (i) 0.162 0.193 0.082 (ii) 0.165 0.227 0.082 (iii) 10.08 13.37 6.47 0.688

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

RDEC-RES

RDEC-RES RDEC-RES-089-005 RDEC-RES-089-005 VI I II III 6 IV 7 3 V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX 1 2 3 4 5 6 7 8 躰 ( 9 10 躰 11 12 躰 1 13 14 躰 15 16 躰 17 18 19 1 20 21 22 2 23 24 25 26

More information

(譯本)

(譯本) 檔 號 : LD SMW 86-1/2(C) 立 法 會 參 考 資 料 摘 要 最 低 工 資 條 例 ( 第 608 章 ) 僱 傭 條 例 ( 第 57 章 ) 2015 年 最 低 工 資 條 例 ( 修 訂 附 表 3) 公 告 2015 年 僱 傭 條 例 ( 修 訂 附 表 9) 公 告 引 言 A 在 二 零 一 五 年 一 月 六 日 的 會 議 上, 行 政 會 議 建 議, 行

More information

最简单的MPI程序 Hello world(C)

最简单的MPI程序 Hello world(C) 机群应用开发 并行编程原理及程序设计 Parallel Programming: Fundamentals and Implementation 戴荣 dair@dawning.com.cn 曙光信息产业有限公司 2006.4 2006 年 4 月共享存储编程 1/108 参考文献 黄铠, 徐志伟著, 陆鑫达等译. 可扩展并行计算技术, 结构与编程. 北京 : 机械工业出版社, P.33~56,P.227~237,

More information

兒 童 會 4 摩 爾 門 經 本 教 材 專 為 8-11 歲 的 兒 童 設 計 耶 穌 基 督 後 期 聖 徒 教 會 台 北 發 行 中 心 印 行

兒 童 會 4 摩 爾 門 經 本 教 材 專 為 8-11 歲 的 兒 童 設 計 耶 穌 基 督 後 期 聖 徒 教 會 台 北 發 行 中 心 印 行 兒 童 會 4 摩 爾 門 經 8-11 歲 兒 童 會 4 摩 爾 門 經 本 教 材 專 為 8-11 歲 的 兒 童 設 計 耶 穌 基 督 後 期 聖 徒 教 會 台 北 發 行 中 心 印 行 1997, 1997 by Intellectual Reserve, Inc. 1997 耶 穌 基 督 後 期 聖 徒 教 會 版 權 所 有 台 北 發 行 中 心 印 行 英 語 核 准 日

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

(b)

(b) 1. (a) (b) (c) 22 85155 (i) (ii) 2200 5 35% 20% 500 3,000 3015 50% 30 (i) (ii) (iii) (iii) 30% QFII 15% H (20)(5) (iv) (i)(ii) (iii) (iv) (v) 10 30 (vi) 5% (vii) (1) (1) 25%(1) (viii) (ix) 10% 20 45 20

More information

技术沙龙-OpenMP并行技术

技术沙龙-OpenMP并行技术 OpenMP 并行编程 中科院计算机网络信息中心 超级计算中心 内容提要 并行机体系结构 OpenMP 编程简介 OpenMP 编程制导 OpenMP 库函数 OpenMP 环境变量 OpenMP 计算实例 08:58 2 并行机体系结构及通信机制 SMP: 共享内存并行机 ( Shared Memory Processors ) 多个 处理器通过交叉开关 (Crossbar) 或总线与共享内存互连

More information

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO Linux muduo C++ (giantchen@gmail.com) 2012-09-30 C++ TCP C++ x86-64 Linux TCP one loop per thread Linux native muduo C++ IT 5 C++ muduo 2 C++ C++ Primer 4 W. Richard Stevens UNIX Sockets API echo Sockets

More information

H

H CGN Power Co., Ltd. * 1816 (1) 2014 (2) 2014 (3) 2014 (4) 2014 (5) 2014 (6) 2015 (7) 2015 (8) 2015 (9) (10) (11) H (12) (13) (14) (15) (16) (17) 2014 5 41 42 43 44 55 2015 5 26 88 JW 3 N-1 N-5 (i) 2015

More information

1. 2285 155 2200 35% 30 3015 50% 30 (i) (ii) (iii) [][]15% H (20)(5) (i)(ii) (iii)(iv) 30 5% (1) (1) 25% (1) 10% 2045 20 5% 20 50% 50% 151 20 10% 50% 25% 10% 10% (1)(2)(4)(5)15 1060 3045 H H H (i)(ii)

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

「保險中介人資格考試」手冊

「保險中介人資格考試」手冊 目 錄 內 容 頁 次 1. 引 言.. 1 2. 考 試.. 1 3. 報 考 詳 情.. 3 4. 註 冊 手 續.. 3 5. 考 試 費.. 4 6. 准 考 證.. 5 7. 選 擇 考 試 時 間.. 5 8. 電 腦 或 系 統 出 現 問 題..... 5 9. 考 試 規 則.. 5 10. 取 消 資 格.. 6 11. 核 實 考 生 身 分.. 6 12. 發 出 成 績 通

More information

IntelBook_cn.doc

IntelBook_cn.doc 5.2.3 线程同步 在 OpenMP 应用程序中, 由于是多线程执行, 必须要有必要的线程同步机制以保证程序在出现数据竞争的时候能够得出正确的结果, 并且在适当的时候控制线程的执行顺序, 以保证执行结果的确定性 OpenMP 支持两种不同类型的线程同步机制, 一种是互斥锁的机制, 可以用来保护一块共享的存储空间, 使得每一次访问这块共享内存空间的线程最多一个, 保证了数据的完整性 ; 另外一种同步机制是事件通知机制,

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

<4D F736F F D20BB4FAA46BFA4B2C4A447B4C15F D313038A67E5FBAEEA658B56FAE69B9EAAC49A4E8AED72D5FAED6A977A5BB5F >

<4D F736F F D20BB4FAA46BFA4B2C4A447B4C15F D313038A67E5FBAEEA658B56FAE69B9EAAC49A4E8AED72D5FAED6A977A5BB5F > 行 政 院 104 年 11 月 2 日 院 臺 綜 字 第 1040149345A 號 函 核 定 臺 東 縣 第 二 期 (105-108 年 ) 綜 合 發 展 實 施 方 案 ( 核 定 本 ) 臺 東 縣 政 府 中 華 民 國 1 0 4 年 1 1 月 臺 東 縣 第 二 期 (105-108 年 ) 綜 合 發 展 實 施 方 案 ( 核 定 本 ) 目 錄 第 一 章 前 言...

More information

全唐诗28

全唐诗28 ... 1... 1... 1... 2... 2... 2... 3... 3... 4... 4... 4... 5... 5... 5... 5... 6... 6... 6... 6... 7... 7... 7... 7... 8... 8 I II... 8... 9... 9... 9...10...10...10...11...11...11...11...12...12...12...13...13...13...14...14...14...15...15...15...16...16...16...17...17

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

「香港中學文言文課程的設計與教學」單元設計範本

「香港中學文言文課程的設計與教學」單元設計範本 1. 2. 3. (1) (6) ( 21-52 ) (7) (12) (13) (16) (17) (20) (21) (24) (25) (31) (32) (58) 1 2 2007-2018 7 () 3 (1070) (1019-1086) 4 () () () () 5 () () 6 21 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. ( ) 7 1. 2.

More information

<D6D0B9FAB9C5CAB757512E6D7073>

<D6D0B9FAB9C5CAB757512E6D7073> 黄 河 文 明 的 历 史 变 迁 丛 书 编 委 会 学 术 顾 问 李 学 勤 朱 绍 侯 姚 瀛 艇 郝 本 性 晁 福 林 王 巍 主 任 李 小 建 苗 长 虹 副 主 任 覃 成 林 高 有 鹏 牛 建 强 刘 东 勋 主 编 李 玉 洁 编 委 苗 书 梅 程 遂 营 王 蕴 智 张 新 斌 郑 慧 生 涂 白 奎 袁 俊 杰 薛 瑞 泽 陈 朝 云 孔 学 郑 贞 富 陈 彩 琴 石

More information

財 務 委 員 會 審 核 2014 至 2015 年 度 開 支 預 算 的 報 告 2014 年 7 月

財 務 委 員 會 審 核 2014 至 2015 年 度 開 支 預 算 的 報 告 2014 年 7 月 香 港 特 別 行 政 區 立 法 會 財 務 委 員 會 審 核 2014 至 2015 年 度 開 支 預 算 的 報 告 2014 年 7 月 財 務 委 員 會 審 核 2014 至 2015 年 度 開 支 預 算 的 報 告 2014 年 7 月 章 節 目 錄 頁 數 I 序 言 1-2 II 公 務 員 事 務 3-9 III 司 法 及 法 律 事 務 10-19 IV 財 經 事

More information

II II

II II I I II II III 1. 2. 3. III 4. IV 5. 6. 8. 9. 10. 12. IV V V VI VI VII VII VIII VIII IX IX X X XI XI XII XII 1 1 2 2 3 3 4 33 35 4 5 5 6 6 7 ( ) 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17

More information

Microsoft Word - Final Chi-Report _PlanD-KlnEast_V7_ES_.doc

Microsoft Word - Final Chi-Report _PlanD-KlnEast_V7_ES_.doc 九 龍 東 商 業 的 統 計 調 查 - 行 政 摘 要 - 2011 年 5 月 統 計 圖 行 政 摘 要...1 圖 I: 在 不 同 地 區 及 樓 宇 類 別 的 數 目 及 比 例...9 圖 II: 影 響 選 擇 地 點 的 因 素 的 重 要 程 度 對 比 就 現 時 所 在 地 點 各 項 因 素 的 滿 意 程 度...20 圖 III: 影 響 選 擇 樓 宇 的 因 素

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

<4D6963726F736F667420576F7264202D20B6ABD0CBD6A4C8AFB9C9B7DDD3D0CFDEB9ABCBBECAD7B4CEB9ABBFAAB7A2D0D0B9C9C6B1D5D0B9C9CBB5C3F7CAE9A3A8C9EAB1A8B8E5202032303134C4EA33D4C23131C8D5B1A8CBCDA3A92E646F63>

<4D6963726F736F667420576F7264202D20B6ABD0CBD6A4C8AFB9C9B7DDD3D0CFDEB9ABCBBECAD7B4CEB9ABBFAAB7A2D0D0B9C9C6B1D5D0B9C9CBB5C3F7CAE9A3A8C9EAB1A8B8E5202032303134C4EA33D4C23131C8D5B1A8CBCDA3A92E646F63> 东 兴 证 券 股 份 有 限 公 司 ( 住 所 : 北 京 市 西 城 区 金 融 大 街 5 号 ( 新 盛 大 厦 )12 15 层 ) 首 次 公 开 发 行 股 票 招 股 说 明 书 ( 申 报 稿 ) 保 荐 人 ( 主 承 销 商 ) 瑞 银 证 券 有 限 责 任 公 司 住 所 : 北 京 市 西 城 区 金 融 大 街 7 号 英 蓝 国 际 金 融 中 心 12 层 15

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

IntelBook_cn.doc

IntelBook_cn.doc 5.2.2 并行区域编程 上面我们曾经说过循环并行化实际上是并行区域编程的一个特例, 在这一小节我们将详细讨论非循环的并行区域编程 并行区域简单的说就是通过循环并行化编译制导语句使得一段代码能够在多个线程内部同时执行 本章的第一个例子就是一个并行区域的例子, 根据环境变量的设置, 该程序在相应的线程内部打印出信息 并行区域编译制导语句的格式与使用限制 在 C/C++ 语言中, 并行区域编写的格式如下所示

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

歡 迎 您 成 為 滙 豐 銀 聯 雙 幣 信 用 卡 持 卡 人 滙 豐 銀 聯 雙 幣 信 用 卡 同 時 兼 備 港 幣 及 人 民 幣 戶 口, 讓 您 的 中 港 消 費 均 可 以 當 地 貨 幣 結 算, 靈 活 方 便 此 外, 您 更 可 憑 卡 於 全 球 近 400 萬 家 特

歡 迎 您 成 為 滙 豐 銀 聯 雙 幣 信 用 卡 持 卡 人 滙 豐 銀 聯 雙 幣 信 用 卡 同 時 兼 備 港 幣 及 人 民 幣 戶 口, 讓 您 的 中 港 消 費 均 可 以 當 地 貨 幣 結 算, 靈 活 方 便 此 外, 您 更 可 憑 卡 於 全 球 近 400 萬 家 特 歡 迎 您 成 為 滙 豐 銀 聯 雙 幣 信 用 卡 持 卡 人 滙 豐 銀 聯 雙 幣 信 用 卡 同 時 兼 備 港 幣 及 人 民 幣 戶 口, 讓 您 的 中 港 消 費 均 可 以 當 地 貨 幣 結 算, 靈 活 方 便 此 外, 您 更 可 憑 卡 於 全 球 近 400 萬 家 特 約 商 戶 簽 賬, 尊 享 種 種 購 物 飲 食 及 娛 樂 消 費 優 惠 如 需 查 詢 滙

More information

建築污染綜合指標之研究

建築污染綜合指標之研究 1 2 3 4 5 (3) 6 7 (11) 8 9 10 11 12 250 13 14 15 16 17 18 V V 0 a a 0 Li 10 ( 10 ) a a 0 19 20 21 22 23 24 ( ) ( ) + 25 0 1 1 ( 1 ) ( 1 ) + ( 1 ) ( 1 ) + ( 1 ) ( 1 ) + ( 1 ) ( 1 ) + + 26 ( + 27 n i 1 28

More information

Sun Update Connection System Sun Microsystems, Inc Network Circle Santa Clara, CA U.S.A

Sun Update Connection System Sun Microsystems, Inc Network Circle Santa Clara, CA U.S.A Sun Update Connection System 1.0.8 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. 819 7286 10 2006 6 2006 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A.

More information

中国民用航空规章

中国民用航空规章 135 2004 12 16 CCAR-141 1 135 2 A...5 141.1...5 141.3...5 141.5...5 141.7...5 141.9...6 141.11...6 141.13...6 141.15...7 141.17...7 141.19...8 141.21...8 141.23...8 141.25...8 141.27...9 141.29...9 141.31...9

More information

我 非 常 希 望 该 小 组 的 建 议 尤 其 是 其 执 行 摘 要 能 受 到 将 于 2000 年 9 月 来 纽 约 参 加 千 年 首 脑 会 议 的 所 有 领 导 人 的 注 意 这 次 历 史 性 的 高 级 别 会 议 提 供 了 一 个 独 特 的 机 会 使 我 们 能 够

我 非 常 希 望 该 小 组 的 建 议 尤 其 是 其 执 行 摘 要 能 受 到 将 于 2000 年 9 月 来 纽 约 参 加 千 年 首 脑 会 议 的 所 有 领 导 人 的 注 意 这 次 历 史 性 的 高 级 别 会 议 提 供 了 一 个 独 特 的 机 会 使 我 们 能 够 联 合 国 A/55/305 大 会 安 全 理 事 会 Distr.: General 21 August 2000 Chinese Original: English 大 会 第 五 十 五 届 会 议 临 时 议 程 项 目 87 整 个 维 持 和 平 行 动 问 题 所 有 方 面 的 全 盘 审 查 安 全 理 事 会 第 五 十 五 年 2000 年 8 月 21 日 秘 书 长 给

More information

600795 2004 ... 1... 1... 2... 5... 9... 15... 15... 17... 25... 26... 31... 96 2004 1 2 3 1 GD POWER DEVELOPMENT CO.LTD GDPD 2 3 6-8 B 100034 010-58682200 010-58553800 E-mailchenjd@600795.com.cn 6-8 B

More information

Java Desktop System 2003 Sun Microsystems, Inc Network Circle Santa Clara, CA U.S.A. :

Java Desktop System 2003 Sun Microsystems, Inc Network Circle Santa Clara, CA U.S.A. : Java Desktop System 2003 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 4572 10 2003 12 2003 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

,, 17 075 200,, 170, 1, 40, 4 000, 5,,,, 100 600, 862,, 100, 2 /5,, 1 /5, 1 2,, 1 /5,,, 1 /2,, 800,,,,,,, 300,,,,,, 4 300,,,,, ,,,,,,,,,,, 2003 9 3 3. 22 24 4. 26 30 2 33 33 1. 34 61 1. 1 37 63 1. 2 44

More information

Microsoft PowerPoint - PC13.pptx

Microsoft PowerPoint - PC13.pptx 并行计算 结构 算法 编程 主讲教师 : 谢磊 第十三章共享存储系统编程 为什么要共享存储编程标准? 1 并行技术的再发展主要在于拓宽应用领域, 这其中编程方式至关重要 很多厂商和研究单位的支持, 各有特色, 无统一标准 消息传递的特点 用户需要考虑数据和计算的划分, 编程困难 现状 共享存储与消息传递 共享存储的特点 (1) 继承性 (2) 无须考虑数据的分布 (3) 指针的支持 (4) 进程迁移

More information

《小王子》 (法)圣埃克苏佩里 原著

《小王子》 (法)圣埃克苏佩里 原著 小 王 子 ( 法 ) 圣 埃 克 苏 佩 里 原 著 献 给 莱 翁 维 尔 特 请 孩 子 们 原 谅 我 把 这 本 书 献 给 了 一 个 大 人 我 有 一 条 正 当 的 理 由 : 这 个 大 人 是 我 在 世 界 上 最 好 的 朋 友 我 另 有 一 条 理 由 : 这 个 大 人 什 么 都 懂 ; 即 使 儿 童 读 物 也 懂 我 还 有 第 三 条 理 由 ; 这 个 大

More information

_Chi.ps, page Preflight ( _Chi.indd )

_Chi.ps, page Preflight ( _Chi.indd ) on conviction3 5 1. / 2. 14 3. 2 2 3 4. 372 12 5. 6. 1 7. 1 2 i ii iii iv 8. 9. 1 12 2 2 i ii iii i ii iii 3 iv http://www.pcpd.org.hk v i ii iii 4 i ii i / ii 5 1. 2. 3. i ii iii iv v vi 4. 5. 6 6. 7.

More information

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes 包管理理 工具 Helm 蔺礼强 Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7. Kubernetes

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

Microsoft Word - ????:?????????????

Microsoft Word - ????:????????????? 春 秋 航 空 股 份 有 限 公 司 ( 住 所 : 上 海 市 长 宁 区 定 西 路 1558 号 乙 ) 首 次 公 开 发 行 股 票 招 股 意 向 书 保 荐 人 ( 主 承 销 商 ) 瑞 银 证 券 有 限 责 任 公 司 住 所 : 北 京 市 西 城 区 金 融 大 街 7 号 英 蓝 国 际 金 融 中 心 12 层 15 层 春 秋 航 空 股 份 有 限 公 司 首 次

More information

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的 附 錄 美 國 國 家 兒 童 健 康 與 人 類 發 展 中 心 (NICHD) 偵 訊 指 導 手 冊 I. 開 場 白 1. 你 好, 我 的 名 字 是, 我 是 警 察 [ 介 紹 房 間 內 的 其 他 人, 不 過, 在 理 想 狀 態 下, 房 間 裡 不 該 有 其 他 人 ] 今 天 是 ( 年 月 日 ), 現 在 是 ( 幾 點 幾 分 ) 我 是 在 ( 地 點 ) 問 你

More information

[ ] [ ] Sino-French Life Insurance Co., LTD. ( ) ( ) ( )

[ ] [ ] Sino-French Life Insurance Co., LTD. ( ) ( ) ( ) Sino French Life Insurance Company Limited 2014 [ ] [ ] Sino-French Life Insurance Co., LTD. ( ) 2 8 1206 100022 ( ) 2005 12 23 ( ) 1 2 010-85288588-8 1 2014 12 31 ( ) 31/12/2014 31/12/2013 5 10,739,871.24

More information

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v)

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v) 1948 12 1 1986 1 1995 1995 3 1995 5 2003 4 2003 12 2015 82015 10 1 2004 2 1 (i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v) (vi) (vii)(viii) (ix) (x) (xi) 2013 8 15 (i) (ii) (iii)

More information

「保險中介人資格考試」手冊

「保險中介人資格考試」手冊 保 險 中 介 人 資 格 考 試 手 冊 目 錄 內 容 頁 次 1. 引 言.. 1 2. 考 試... 1 3. 報 考 詳 情... 3 4. 報 名 手 續... 4 5. 考 試 費... 5 6. 准 考 證... 5 7. 選 擇 考 試 時 間... 6 8. 電 腦 或 系 統 出 現 問 題...... 6 9. 考 試 規 則..... 6 10. 取 消 資 格... 7

More information

山东出版传媒招股说明书

山东出版传媒招股说明书 ( 山 东 省 济 南 市 英 雄 山 路 189 号 ) 首 次 公 开 发 行 股 票 ( 申 报 稿 ) 保 荐 机 构 ( 主 承 销 商 ) 中 银 国 际 证 券 有 限 责 任 公 司 ( 上 海 市 浦 东 银 城 中 路 200 号 中 银 大 厦 39 层 ) 首 次 公 开 发 行 股 票 ( 一 ) 发 行 股 票 类 型 : 人 民 币 普 通 股 (A 股 ) ( 二 )

More information

* r p . 4 6 12 3 5 7 8 9bk bm btbsbrbqbp bo bn bl [ ] [ ] [ ] [ ] [SET] 1 2 3 4 5 6 7. cmcl ck 8 9 0 bk bl bm bn bo 1 2 1 2+ - bp bq 8 2 4 6 br r bs p bt ck cl cm 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

- 2 - 获 豁 免 计 算 入 总 楼 面 面 积 及 / 或 上 盖 面 积 的 环 保 及 创 新 设 施 根 据 建 筑 物 条 例 的 规 定 4. 以 下 的 环 保 设 施 如 符 合 某 些 条 件, 并 由 有 关 人 士 提 出 豁 免 申 请, 则 可 获 豁 免 计 算 入

- 2 - 获 豁 免 计 算 入 总 楼 面 面 积 及 / 或 上 盖 面 积 的 环 保 及 创 新 设 施 根 据 建 筑 物 条 例 的 规 定 4. 以 下 的 环 保 设 施 如 符 合 某 些 条 件, 并 由 有 关 人 士 提 出 豁 免 申 请, 则 可 获 豁 免 计 算 入 屋 宇 署 地 政 总 署 规 划 署 联 合 作 业 备 考 第 1 号 环 保 及 创 新 的 楼 宇 引 言 为 了 保 护 和 改 善 建 筑 及 自 然 环 境, 政 府 推 广 建 造 环 保 及 创 新 的 楼 宇, 目 的 是 鼓 励 业 界 设 计 和 建 造 加 入 以 下 措 施 的 楼 宇 : (a) 采 用 楼 宇 整 体 使 用 周 期 方 法 规 划 设 计 建 造 和

More information

nbqw.PDF

nbqw.PDF 1 2 3 . 1. 2. 4. 7. 10. 11. 13. 25. 28. 30. 67 2002 1 1. : Tianjin Tianyao Pharmaceutical Co., Ltd. TJPC 2. 3. 109 300171 022-24160861 022-24160910 tjpc600488@vip.sina.com 4. B 109 300171 tjpc600488@vip.sina.com

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information