Oracle Solaris Studio 12.2:OpenMP API 用户指南

2.2 OpenMP 环境变量

OpenMP 规范定义了若干用于控制 OpenMP 程序执行的环境变量。在2.2.1 常见的 OpenMP 环境变量中对这些变量进行了总结。有关详细信息,请参阅 openmp.org 中的 OpenMP API 版本 3.0 规范。此版本的 Solaris Studio 编译器定义了未包括在 OpenMP 规范中的其他环境变量,在2.2.2 Solaris Studio 特定的环境变量中对这些变量进行了总结。

2.2.1 常见的 OpenMP 环境变量

OMP_SCHEDULE

为指定了 RUNTIME 调度类型的 DOPARALLEL DOforparallel for 指令/pragma 设置调度类型。

如果未定义,则使用缺省值 STATICvalue"type[,chunk]"

示例:setenv OMP_SCHEDULE 'GUIDED,4'

OMP_NUM_THREADS

设置要在执行并行区域期间使用的线程数。

可以使用 num_threads 子句或通过调用 omp_set_num_threads() 来覆盖此值。

如果未设置,则使用缺省值 1。value 是一个正整数。

示例:setenv OMP_NUM_THREADS 16

OMP_DYNAMIC

启用或禁用可用于执行并行区域的线程数的动态调整。

如果未设置,则使用缺省值 TRUETRUEFALSE

示例:setenv OMP_DYNAMIC FALSE

OMP_NESTED

启用或禁用嵌套的并行性。

TRUEFALSE

缺省值为 FALSE

示例:setenv OMP_NESTED FALSE

OMP_STACKSIZE

为 OpenMP 创建的线程设置栈大小。

可以将大小指定为以千字节为单位的正整数,或者带有后缀 B、K、MG,分别表示字节、千字节、兆字节或千兆字节。

示例:setenv OMP_STACKSIZE 10M

OMP_WAIT_POLICY

设置正在等待的线程的所需策略:ACTIVEPASSIVE

ACTIVE 线程在等待时会占用处理器时间。PASSIVE 线程不会占用处理器时间,并且可能会放弃处理器或进入休眠状态。

OMP_MAX_ACTIVE_LEVELS

将嵌套活动并行区域的最大级别数设置为非负整数值。

OMP_THREAD_LIMIT

将要在整个 OpenMP 程序中使用的线程数设置为正整数。

2.2.2 Solaris Studio 特定的环境变量

其他多重处理环境变量也会影响 OpenMP 程序的执行,但它们不是 OpenMP 规范的一部分。

PARALLEL

为与传统程序兼容,设置 PARALLEL 环境变量的效果与设置 OMP_NUM_THREADS 的效果相同。然而,如果同时设置 PARALLELOMP_NUM_THREADS,则必须将它们设置为相同的值。

SUNW_MP_WARN

控制 OpenMP 运行时库发出的警告消息。如果将 SUNW_MP_WARN 设置为 TRUE,运行时库会向 stderr 发送警告消息。此外,运行时库还会输出所有环境变量的设置,以供参考。如果将该环境变量设置为 FALSE,运行时库将不发送任何警告消息或输出任何设置。缺省值为 FALSE

OpenMP 运行时库能够检查很多常见的 OpenMP 违规行为,如错误的嵌套和死锁。运行时检查会增加程序执行的开销。请参见第 3 章。如果 SUNW_MP_WARN 设置为 TRUE,则运行时库会向 stderr 发出警告消息。

示例:

setenv SUNW_MP_WARN TRUE

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


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

回调函数的地址将作为参数传递给 sunw_mp_register_warn()。如果成功注册了回调函数,该函数将返回 0,如果注册失败则返回 1。

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


注 –

测试或调试程序时,请将 SUNW_MP_WARN 设置为 TRUE。这样您便可以查看来自 OpenMP 运行时库的警告消息。


SUNW_MP_THR_IDLE

控制 OpenMP 程序中空闲线程的状态,这些空闲线程正在某个屏障处等待或者正在等待要处理的新并行区域。可以将该值设置为下列某个值:SPINSLEEPSLEEP(times)SLEEP(timems)SLEEP(timemc),其中 time 是一个整数,指定时间量,s、msmc 指定时间单位(分别为秒、毫秒和微秒)。

SPIN 指定空闲线程在屏障处等待时或等待要处理的新并行区域时应旋转。不带时间参数的 SLEEP 指定空闲线程应立即休眠。带时间参数的 SLEEP 指定线程进入休眠状态前应旋转等待的时间量。

缺省情况下,空闲线程经过一段时间的旋转等待后将进入休眠状态。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms)SLEEP(0mc) 都是等效的。

示例:


setenv SUNW_MP_THR_IDLE SPIN 
setenv SUNW_MP_THR_IDLE SLEEP 
setenv SUNW_MP_THR_IDLE SLEEP(2s) 
setenv SUNW_MP_THR_IDLE SLEEP(20ms) 
setenv SUNW_MP_THR_IDLE SLEEP(150mc)
SUNW_MP_PROCBIND

此环境变量可在 Solaris 和 Linux 系统上工作。SUNW_MP_PROCBIND 环境变量可用于将 OpenMP 程序的线程绑定到正在运行的系统上的虚拟处理器。虽然可以通过处理器绑定来增强性能,但是如果将多个线程绑定到同一虚拟处理器,则会导致性能下降。有关详细信息,请参见2.3 处理器绑定

SUNW_MP_MAX_POOL_THREADS

指定线程池的最大大小。线程池只包含 OpenMP 运行时库创建的非用户线程。它不包含主线程或由用户程序显式创建的任何线程。如果将此环境变量设置为零,则线程池为空,并且将由一个线程执行所有并行区域。如果未指定,则使用缺省值 1023。有关详细信息,请参见4.2 控制嵌套并行操作

请注意,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 的值大一。

SUNW_MP_MAX_NESTED_LEVELS

指定活动嵌套并行区域的最大深度。活动嵌套深度大于此环境变量值的任何并行区域将只由一个线程来执行。如果并行区域是 if 子句值为 false 的 OpenMP 并行区域,则不会将该区域视为活动区域。如果未指定,则使用缺省值 4。有关详细信息,请参见4.2 控制嵌套并行操作

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

STACKSIZE

设置每个线程的栈大小。值以千字节为单位。缺省线程栈大小在 32 位 SPARC V8 和 x86 平台上为 4 Mb,在 64 位 SPARC V9 和 x86 平台上为 8 Mb。

示例:

setenv STACKSIZE 8192 将线程栈大小设置为 8 MB

STACKSIZE 环境变量还接受带有 B(字节)、K(千字节)、M(兆字节)或 G(千兆字节)后缀的数值。缺省单位为千字节。

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

SUNW_MP_GUIDED_WEIGHT

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

SUNW_MP_WAIT_POLICY

控制程序中等待工作(空闲)、在屏障处等待或等待任务的线程的行为。上述各种等待类型的行为有三种可能:旋转片刻、让出 CPU 片刻、休眠直至被唤醒。

语法为(使用 csh 显示):

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

IDLE=valBARRIER= valTASKWAIT= val 是可选关键字,用于指定所控制的等待类型。

对于上述每个关键字,都有一个 val 设置来描述等待行为:SPINYIELDSLEEP

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

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

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

请注意,可以按任意顺序指定特定等待类型的 SPINSLEEPYIELD 设置。这些设置之间用逗号分隔。"SPIN(0),YIELD(0)"SLEEP(立即休眠)相同。在处理 IDLEBARRIERTASKWAIT 的设置时,采用左侧优先规则。

示例:

% setenv SUNW_MP_WAIT_POLICY “BARRIER=SPIN”

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

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

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

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

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