Oracle Solaris Studio 12.2:OpenMP API 用户指南

第 3 章 实现定义的行为

本章说明 OpenMP 3.0 规范中依赖实现的特定行为。

3.1 任务调度点

非绑定 (untied) 任务区域中的任务调度点与绑定 (tied) 任务区域中的任务调度点出现在相同的点。因此在非绑定 (untied) 任务区域中,任务调度点仅出现在以下位置:

3.2 内存模型

当多个线程异步访问同一变量时,无法保证这些线程执行的内存访问互为原子操作。一些依赖实现的因素和依赖应用程序的因素会对访问是否为原子操作产生影响。某些变量占用的内存空间可能比目标平台上最大的原子内存操作所占用的空间大。某些变量的存储方式可能是未对齐的或者其对齐方式是未知的,因此编译器或运行时系统可能需要使用多个 load/store 操作来访问变量。有时,使用多个 load/store 操作会让代码序列的运行速度更快。

3.3 内部控制变量

实现定义了以下内部控制变量:

3.4 线程的动态调整

实现提供了动态调整线程数量的功能。缺省情况下会启用动态调整。通过将 OMP_DYNAMIC 环境变量设置为 FALSE,或使用适当的参数调用 omp_set_dynamic() 例程,可以禁用动态调整。

当线程遇到并行构造时,此实现提供的线程数将根据 OpenMP 3.0 Specification(OpenMP 3.0 规范)中的算法 2.1(第 35-36 页)来确定。在异常情况下,例如当缺少系统资源时,提供的线程数将少于算法 2.1 中所述的线程数。在这些情况下,如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

3.5 循环指令

用于计算折叠 (collapsed) 循环的迭代计数的整数类型为 long

run-sched-var 内部控制变量设置为 auto 时,schedule(runtime) 子句的效果为 static(不指定块大小)。

3.6 构造

3.6.1 SECTIONS

sections 构造中的结构化块在静态(不指定块大小)方式下分配给组中的线程,从而使每个线程获得的连续结构化块数量大致相等。

3.6.2 SINGLE

遇到 single 构造的第一个线程将会执行该构造。

3.6.3 ATOMIC

此实现通过使用一个名为 critical 的特殊构造封闭目标语句来替换所有 atomic 指令。这将会在程序中的所有原子区域间强制进行独占访问,无论这些区域是否更新相同或不同的存储位置。

3.7 例程

3.7.1 omp_set_schedule()

Solaris Studio 特定的 sunw_mp_sched_reserved 调度的行为与 static(不指定块大小)相同。

3.7.2 omp_set_max_active_levels()

如果从活动并行区域中调用 omp_set_max_active_levels(),则调用将被忽略。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

如果 omp_set_max_active_levels() 的参数不是非负整数,则调用将被忽略。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

3.7.3 omp_get_max_active_levels()

可以从程序中的任何位置调用 omp_get_max_active_levels()。调用将返回 max-active-levels-var 内部控制变量的值。

3.8 环境变量

变量名称 

实现 

OMP_SCHEDULE

如果为 OMP_SCHEDULE 指定的调度类型不是有效类型(staticdynamicguidedauto)之一,则将忽略该环境变量,并将使用缺省调度(static(不指定块大小))。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

如果为 OMP_SCHEDULE 环境变量指定的调度类型为 staticdynamicguided,但是指定的块大小为负整数,则使用的块大小将如下:对于 static,将不使用块大小;对于 dynamicguided,块大小将为 1。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

OMP_NUM_THREADS

如果变量的值不是正整数,则将会忽略该环境变量,并且如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

如果变量的值大于该实现可支持的线程数,则将执行以下操作:  

-如果启用了线程数的动态调整,则线程数将会减少,并且如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

-另一方面,如果禁用了线程数的动态调整,则将发出错误消息,并且程序将会停止。 

OMP_DYNAMIC

如果为 OMP_DYNAMIC 指定的值既不是 TRUE 也不是 FALSE,则将忽略该值,并将使用缺省值 TRUE。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

OMP_NESTED

如果为 OMP_NESTED 指定的值既不是 TRUE 也不是 FALSE,则将忽略该值,并将使用缺省值 FALSE。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

OMP_STACKSIZE

如果为 OMP_STACKSIZE 提供的值不符合指定格式,则将忽略该值,并将使用缺省值(对于 32 位应用程序为 4 MB,对于 64 位应用程序为 8 MB)。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

OMP_WAIT_POLICY

线程的 ACTIVE 行为是旋转。线程的 PASSIVE 行为是经过一段可能的旋转之后休眠

OMP_MAX_ACTIVE_LEVELS

如果为 OMP_MAX_ACTIVE_LEVELS 指定的值不是非负整数,则将忽略该值,并将使用缺省值 (4)。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

OMP_THREAD_LIMIT

如果为 OMP_THREAD_LIMIT 指定的值不是正整数,则将忽略该值,并将使用缺省值 (1024)。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。

3.9 Fortran 问题

以下内容仅适用于 Fortran。

3.9.1 THREADPRIVATE 指令

如果要在两个连续的活动并行区域之间保持的线程(初始线程除外)的 threadprivate 对象中的数据值条件不能全部成立,则第二个区域中的可分配数组的分配状态可能为“当前未分配”。

3.9.2 SHARED 子句

如果将共享变量传递到非内在过程,可能导致该共享变量的值在过程引用之前被复制到临时存储中,并在过程引用之后又从临时存储中复制到实元参数存储中。仅当 OpenMP 3.0 规范第 88 页的 2.9.3.2 节中的条件 a、b、c 成立时,才会发生这种向临时存储复制数据以及从临时存储向外复制数据的情况,这三个条件如下:

3.9.3 运行时库定义

此实现中同时提供了头文件 omp_lib.h 和模块文件 omp_lib

在 Solaris 平台中,采用参数的 OpenMP 运行时库例程是通过通用接口扩展的,因此可以适应不同 Fortran KIND 类型的参数。