非绑定 (untied) 任务区域中的任务调度点与绑定 (tied) 任务区域中的任务调度点出现在相同的点。因此在非绑定 (untied) 任务区域中,任务调度点仅出现在以下位置:
遇到的任务构造
遇到的任务等待构造
遇到的屏障指令
隐式屏障区域
非绑定 (untied) 任务区域末尾
当多个线程异步访问同一变量时,无法保证这些线程执行的内存访问互为原子操作。一些依赖实现的因素和依赖应用程序的因素会对访问是否为原子操作产生影响。某些变量占用的内存空间可能比目标平台上最大的原子内存操作所占用的空间大。某些变量的存储方式可能是未对齐的或者其对齐方式是未知的,因此编译器或运行时系统可能需要使用多个 load/store 操作来访问变量。有时,使用多个 load/store 操作会让代码序列的运行速度更快。
实现定义了以下内部控制变量:
nthreads-var:控制为遇到的并行区域请求的线程数。nthreads-var 的初始值为 1。
dyn-var:控制是否为遇到的并行区域启用线程数动态调整。dyn-var 的初始值为 TRUE(即启用动态调整)。
run-sched-var:控制运行时调度子句针对循环区域使用的调度。run-sched-var 的初始值为 static(不指定块大小)。
def-sched-var:控制实现定义的循环区域缺省调度。def-sched-var 的初始值为 static(不指定块大小)。
stacksize-var:控制 OpenMP 实现创建的线程的栈大小。stacksize-var 的初始值为 4 MB(对于 32 位应用程序)和 8 MB(对于 64 位应用程序)。
wait-policy-var:控制等待线程的所需行为。wait-policy-var 的初始值为 PASSIVE。
thread-limit-var:控制参与 OpenMP 程序的最大线程数量。thread-limit-var 的初始值为 1024。
max-active-levels-var:控制嵌套活动并行区域的最大数量。max-active-levels-var 的初始值为 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() 注册回调函数,则将发出警告消息。
用于计算折叠 (collapsed) 循环的迭代计数的整数类型为 long。
将 run-sched-var 内部控制变量设置为 auto 时,schedule(runtime) 子句的效果为 static(不指定块大小)。
sections 构造中的结构化块在静态(不指定块大小)方式下分配给组中的线程,从而使每个线程获得的连续结构化块数量大致相等。
遇到 single 构造的第一个线程将会执行该构造。
此实现通过使用一个名为 critical 的特殊构造封闭目标语句来替换所有 atomic 指令。这将会在程序中的所有原子区域间强制进行独占访问,无论这些区域是否更新相同或不同的存储位置。
Sun 特定的 sunw_mp_sched_reserved 调度的行为与 static(不指定块大小)相同。
如果从活动并行区域中调用 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() 注册回调函数,则将发出警告消息。
可以从程序中的任何位置调用 omp_get_max_active_levels()。调用将返回 max-active-levels-var 内部控制变量的值。
变量名称 |
实现 |
---|---|
OMP_SCHEDULE |
如果为 OMP_SCHEDULE 指定的调度类型不是有效类型(static、dynamic、guided 或 auto)之一,则将忽略该环境变量,并将使用缺省调度(static(不指定块大小))。如果将 SUNW_MP_WARN 设置为 TRUE,或者通过调用 sunw_mp_register_warn() 注册回调函数,则将发出警告消息。 如果为 OMP_SCHEDULE 环境变量指定的调度类型为 static、dynamic 或 guided,但是指定的块大小为负整数,则使用的块大小将如下:对于 static,将不使用块大小;对于 dynamic 和 guided,块大小将为 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() 注册回调函数,则将发出警告消息。 |
以下内容仅适用于 Fortran。
如果要在两个连续的活动并行区域之间保持的线程(初始线程除外)的 threadprivate 对象中的数据值条件不能全部成立,则第二个区域中的可分配数组的分配状态可能为“当前未分配”。
如果将共享变量传递到非内在过程,可能导致该共享变量的值在过程引用之前被复制到临时存储中,并在过程引用之后又从临时存储中复制到实元参数存储中。仅当 OpenMP 3.0 规范第 88 页的 2.9.3.2 节中的条件 a、b 和 c 成立时,才会发生这种向临时存储复制数据以及从临时存储向外复制数据的情况,即:
实元参数为以下参数之一:
共享变量
共享变量的子对象
与共享变量关联的对象
与共享变量子对象关联的对象
实元参数也可以是以下参数之一:
数组段
带有向量下标的数组段
假定形状数组
指针数组
此实元参数的关联哑元参数是显式形状数组或假定大小数组。
此实现中同时提供了头文件 omp_lib.h 和模块文件 omp_lib。
在 Solaris 平台中,采用参数的 OpenMP 运行时库例程是通过通用接口扩展的,因此可以适应不同 Fortran KIND 类型的参数。