Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

2.2.2 Oracle Solaris Studio 环境变量

以下其他环境变量影响 OpenMP 程序的执行,但它们不是 OpenMP 规范的一部分。请注意,为以下环境变量指定的值为不区分大小写,可以采用大写或小写形式。

2.2.2.1 PARALLEL

为与传统程序兼容,设置 PARALLEL 环境变量的效果与设置 OMP_NUM_THREADS 的效果相同。

如果同时设置 PARALLELOMP_NUM_THREADS,则必须将它们设置为相同的值。

2.2.2.2 SUNW_MP_WARN

OpenMP 运行时库能够发出有关许多常见 OpenMP 违规的警告,例如区域嵌套错误、显式屏障位置错误、死锁、环境变量的设置无效等等。

环境变量 SUNW_MP_WARN 控制 OpenMP 运行时库发出的警告消息。如果将 SUNW_MP_WARN 设置为 TRUE,运行时库会向 stderr 发出警告消息。如果将该环境变量设置为 FALSE,运行时库将不发出任何警告消息。缺省值为 FALSE

示例:

% setenv SUNW_MP_WARN TRUE

如果程序注册一个回调函数以接受警告消息,则运行时库也将发出警告消息。程序可通过调用以下函数来注册回调函数:

int sunw_mp_register_warn (void (*func)(void *));

回调函数的地址作为参数传递给 sunw_mp_register_warn()sunw_mp_register_warn() 在成功注册回调函数后返回 0,失败后返回 1。

如果程序已注册了回调函数,运行时库将调用该注册的函数,并将一个指针传递给包含警告消息的本地化字符串。从回调函数返回后,指向的内存将不再有效。


注 -  测试或调试程序时,将 SUNW_MP_WARN 设置为 TRUE 可启用运行时检查并显示来自 OpenMP 运行时库的警告消息。请注意,运行时检查会增加程序执行的开销。

2.2.2.3 SUNW_MP_THR_IDLE

控制 OpenMP 程序中正在等待工作(空闲)或者正在屏障处等待的线程的行为。可以将该值设置为以下值之一:SPINSLEEPSLEEP(time s)SLEEP(time ms)SLEEP(time mc),其中 time 是一个指定时间量的整数,s、msmc 是可选后缀,指定时间单位(分别为秒、毫秒和微秒)。如果未指定时间单位,则采用秒作为时间单位。

SPIN 指定线程在等待工作(空闲)或在屏障处等待时应旋转。不带时间参数的 SLEEP 指定等待线程应立即休眠。带时间参数的 SLEEP 指定线程进入休眠状态前应旋转等待的时间量。

缺省行为是经过一段时间的旋转等待后进入休眠状态。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms)SLEEP(0mc) 都是等效的。

如果同时设置 SUNW_MP_THR_IDLEOMP_WAIT_POLICY,则将忽略 OMP_WAIT_POLICY

示例:

% setenv SUNW_MP_THR_IDLE SPIN 
% setenv SUNW_MP_THR_IDLE SLEEP

以下项等效:

% setenv SUNW_MP_THR_IDLE SLEEP(5)
% setenv SUNW_MP_THR_IDLE SLEEP(5s)
% setenv SUNW_MP_THR_IDLE SLEEP(5000ms)
% setenv SUNW_MP_THR_IDLE SLEEP(5000000mc)

2.2.2.4 SUNW_MP_PROCBIND

SUNW_MP_PROCBIND 环境变量可用于将 OpenMP 线程绑定到正在运行的系统上的硬件线程。虽然可以通过处理器绑定来增强性能,但是如果将多个线程绑定到同一硬件线程,则会导致性能下降。无法同时设置 SUNW_MP_PROCBINDOMP_PROC_BIND。如果未设置 SUNW_MP_PROCBIND,则缺省值为 FALSE。有关更多信息,请参见Chapter 5, 处理器绑定(线程关联性)

2.2.2.5 SUNW_MP_MAX_POOL_THREADS

指定 OpenMP 辅助线程池的最大大小。OpenMP 辅助线程是 OpenMP 运行时库创建的用于在并行区域上运行的那些线程。辅助线程池不包含初始线程(或主线程)和由用户程序显式创建的任何线程。如果将此环境变量设置为零,则 OpenMP 辅助线程池将为空,并且将由初始线程(或主线程)执行所有并行区域。如果未设置,则使用缺省值 1023。有关更多信息,请参见控制嵌套并行操作

请注意,SUNW_MP_MAX_POOL_THREADS 指定用于程序的非用户 OpenMP 线程的最大数量,而 OMP_THREAD_LIMIT 指定用于程序的用户和非用户 OpenMP 线程的最大数量。如果同时设置 SUNW_MP_MAX_POOL_THREADSOMP_THREAD_LIMIT,则必须将它们设置为相同的值。OMP_THREAD_LIMIT 的值必须比 SUNW_MP_MAX_POOL_THREADS 的值大 1。

2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS

设置嵌套活动并行区域的最大数量。如果由包含多个线程的组执行并行区域,则该并行区域处于活动状态。如果未设置 SUNW_MP_MAX_NESTED_LEVELS,则缺省值为 4。有关更多信息,请参见控制嵌套并行操作

2.2.2.7 STACKSIZE

设置每个 OpenMP 辅助线程的堆栈大小。该环境变量接受带可选后缀 B、K、MG(分别表示字节、千字节、兆字节或千兆字节)的数值。如果未指定后缀,则使用缺省单位千字节。

如果未设置,则对于 32 位应用程序,缺省 OpenMP 辅助线程堆栈大小为 4 MB;对于 64 位应用程序,缺省值为 8 MB。

示例:

% setenv STACKSIZE 8192  <- sets the OpenMP helper thread stack size to 8 Megabytes
% setenv STACKSIZE 16M   <- sets the OpenMP helper thread stack size to 16 Megabytes

请注意,如果同时设置 STACKSIZEOMP_STACKSIZE,则必须将它们设置为相同的值。

2.2.2.8 SUNW_MP_GUIDED_WEIGHT

设置加权因子,该因子用于确定使用 guided 调度的循环中的块大小。该值应为正浮点数,并且应用于程序中所有使用 guided 调度的循环。如果未设置,则缺省加权因子为 2.0。

当使用 for/do 指令指定 schedule(guided, chunk_size) 子句时,会在线程请求时将循环迭代以块形式分配给线程,块大小一直减小到 chunk_size,最后一个块的大小可能小于该值。线程执行一个迭代块,然后请求另一个块,直到没有块可以分配为止。对于 chunk_size 为 1 的情况,每个块的大小按照未分配的迭代数除以线程数的值成比例分配,一直减小到 1。对于 chunk_sizek(这里 k 大于 1)的情况,每个块的大小按照相同方式进行确定但遵循如下限制:块包含的迭代不少于 k 次(最后一个块除外)。未指定 chunk_size 时,该值缺省为 1。

OpenMP 运行时库 libmtsk.so 使用以下公式来计算使用 guided 调度的循环的块大小:

chunk_size = num-unassigned-iters / (guided-weight * num-threads)
  • num-unassigned-iters 是循环中尚未分配给任何线程的迭代数。

  • guided-weightSUNW_MP_THR_GUIDED_WEIGHT 环境变量指定的加权因子(如果未设置环境变量,则为 2.0)。

  • num-threads 是用于执行循环的线程数。

举例来说,假定有一个使用 guided 调度的 100 次迭代循环。如果 num-threads = 4,加权因子 = 1.0,那么块大小将是:

25、18、14、10、8、6、4、3、3、2、1...

另一方面,如果 num-threads= 4,加权因子 = 2.0,那么块大小将是:

12、11、9、8、7、6、5、5、4、4、3...

2.2.2.9 SUNW_MP_WAIT_POLICY

允许更精确地控制程序中等待工作(空闲)、在屏障处等待或等待任务完成的 OpenMP 线程的行为。在这些等待类型中,每一类型的行为都有三种可能:旋转片刻、让出处理器片刻或休眠直至被唤醒。

语法(使用 csh 显示)如下:

% setenv SUNW_MP_WAIT_POLICY "IDLE=val:BARRIER=val:TASKWAIT=val"

IDLEBARRIERTASKWAIT 是指定所控制的等待类型的可选关键字。IDLE 指等待运行。BARRIER 指在显式或隐式屏障处等待。TASKWAIT 指在 taskwait 区域等待。上述每个关键字都后跟一个 val 设置,使用关键字 SPINYIELDSLEEP 来描述等待行为。

SPIN(time) 指定等待线程在让出处理器之前应旋转多长时间。time 可以是秒、毫秒或微秒(分别用 smsmc 表示)。如果不指定 time 单位,则使用秒。如果 SPIN 不带 time 参数,表示线程在等待时应持续旋转。

YIELD(number) 指定线程在休眠之前应让出处理器的次数。每次让出处理器后,线程会在操作系统调度其运行时再次运行。如果 YIELD 不带 number 参数,表示线程在等待时应持续让出。

SLEEP 指定等待线程应立即转入休眠。

请注意,可以按任意顺序指定特定等待类型的 SPINSLEEPYIELD 设置。各个设置必须使用逗号分隔。"SPIN(0),YIELD(0)""YIELD(0),SPIN(0)" 相同,等效于 SLEEP 或立即休眠。在处理 IDLEBARRIERTASKWAIT 的设置时,采用左侧优先规则。“左侧优先”规则表示,如果为相同等待类型指定不同的值,那么最左侧的值是要应用的值。在以下示例中,为 IDLE 指定了两个值。第一个是 SPIN,第二个是 SLEEP。因为 SPIN 首先出现(它在字符串的最左侧),所以这是 OpenMP 运行时库将要应用的值。

% setenv SUNW_MP_WAIT_POLICY "IDLE=SPIN:IDLE=SLEEP"
 

如果同时设置 SUNW_MP_WAIT_POLICYOMP_WAIT_POLICY,则将忽略 OMP_WAIT_POLICY

示例 1:

% setenv SUNW_MP_WAIT_POLICY “BARRIER=SPIN”

在屏障等待的线程将一直旋转,直到组中的所有线程都到达该屏障。

示例 2:

% setenv SUNW_MP_WAIT_POLICY “IDLE=SPIN(10ms),YIELD(5)”

等待工作(空闲)的线程旋转 10 毫秒,然后让出处理器 5 次,再转入休眠。

示例 3:

% setenv SUNW_MP_WAIT_POLICY “IDLE=SPIN(2s),YIELD(2):BARRIER=SLEEP:TASKWAIT=YIELD(10)”

等待工作(空闲)的线程旋转 2 秒,然后让出处理器 2 次,再转入休眠;在屏障处等待的线程立即转入休眠;在 taskwait 处等待的线程让出处理器 10 次,再转入休眠。