跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:OpenMP API 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
OpenMP 规范定义了若干用于控制 OpenMP 程序执行的环境变量。有关详细信息,请参阅 http://openmp.org 中的 OpenMP API 版本 3.1 规范。有关 Oracle Solaris Studio 编译器实现 OpenMP 环境变量的具体信息,另请参见3.8 环境变量。
Oracle Solaris Studio 编译器定义了未包括在 OpenMP 规范中的其他环境变量,2.2.2 Oracle Solaris Studio 环境变量中对这些变量进行了总结。
本节介绍了 OpenMP 环境变量的缺省值。
如果未设置,则使用缺省值 STATIC。
示例: setenv OMP_SCHEDULE 'GUIDED,4'
如果未设置,则使用缺省值 2。
示例: setenv OMP_NUM_THREADS 16
如果未设置,则使用缺省值 TRUE。
示例: setenv OMP_DYNAMIC FALSE
如果未设置,则使用缺省值 FALSE。
示例: setenv OMP_NESTED FALSE
对于 32 位应用程序,缺省值为 4 MB;对于 64 位应用程序,缺省值为 8 MB。
以下其他环境变量影响 OpenMP 程序的执行,但它们不是 OpenMP 规范的一部分。请注意,为以下环境变量指定的值为不区分大小写,可以采用大写或小写形式。
为与传统程序兼容,设置 PARALLEL 环境变量的效果与设置 OMP_NUM_THREADS 的效果相同。然而,如果同时设置 PARALLEL 和 OMP_NUM_THREADS,则必须将它们设置为相同的值。
控制 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()。如果成功注册了回调函数,该函数将返回 0,如果注册失败则返回 1。
如果程序已注册了回调函数,运行时库将调用该注册的函数,并将一个指针传递给包含错误消息的本地化字符串。从回调函数返回后,指向的内存将不再有效。
注 - OpenMP 运行时库能够检查很多常见的 OpenMP 违规行为,如错误的嵌套和死锁。但是运行时检查会增加程序执行的开销。测试或调试程序时,将 SUNW_MP_WARN 设置为 TRUE,以便可以显示来自 OpenMP 运行时库的警告消息。
控制 OpenMP 程序中空闲线程的状态,这些空闲线程正在某个屏障处等待或者正在等待要处理的新并行区域。可以将该值设置为下列某个值:SPIN、SLEEP、SLEEP(times)、SLEEP(timems)、SLEEP(timemc),其中 time 是一个整数,指定时间量,s、ms 和 mc 指定时间单位(分别为秒、毫秒和微秒)。
SPIN 指定空闲线程在屏障处等待时或等待要处理的新并行区域时应旋转。不带时间参数的 SLEEP 指定空闲线程应立即休眠。带时间参数的 SLEEP 指定线程进入休眠状态前应旋转等待的时间量。
缺省情况下,空闲线程经过一段时间的旋转等待后将进入休眠状态。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms) 和 SLEEP(0mc) 都是等效的。
如果同时设置 SUNW_MP_THR_IDLE 和 OMP_WAIT_POLICY,则将忽略 OMP_WAIT_POLICY。
示例:
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)
此环境变量可在 Oracle Solaris 和 Linux 系统上工作。SUNW_MP_PROCBIND 环境变量可用于将 OpenMP 程序的线程绑定到正在运行的系统上的虚拟处理器。虽然可以通过处理器绑定来增强性能,但是如果将多个线程绑定到同一虚拟处理器,则会导致性能下降。如果同时设置 SUNW_MP_PROCBIND 和 OMP_PROC_BIND,则必须将它们设置为相同的值。有关详细信息,请参见2.3 处理器绑定。
指定线程池的最大大小。线程池只包含 OpenMP 运行时库创建的、在并行区域中运行的非用户线程。该池不包含初始线程(主线程)或由用户程序显式创建的任何线程。如果将此环境变量设置为零,则线程池为空,并且将由一个线程执行所有并行区域。如果未指定,则使用缺省值 1023。有关详细信息,请参见4.2 控制嵌套并行操作。
请注意,SUNW_MP_MAX_POOL_THREADS 指定用于整个程序的非用户 OpenMP 线程的最大数量,而 OMP_THREAD_LIMIT 指定用于整个程序的用户和非用户 OpenMP 线程的最大数量。如果同时设置 SUNW_MP_MAX_POOL_THREADS 和 OMP_THREAD_LIMIT,则它们的值必须一致,以便将 OMP_THREAD_LIMIT 设置为比 SUNW_MP_MAX_POOL_THREADS 的值大一。
设置嵌套活动并行区域的最大数量。如果由包含多个线程的组执行并行区域,则该并行区域处于活动状态。如果未指定 SUNW_MP_MAX_NESTED_LEVELS,则使用缺省值 4。有关详细信息,请参见4.2 控制嵌套并行操作。
请注意,如果同时设置 SUNW_MP_MAX_NESTED_LEVELS 和 OMP_MAX_ACTIVE_LEVELS,则必须将它们设置为相同的值。
设置每个线程的堆栈大小。值以千字节为单位。在 32 位 SPARC V8 和 x86 平台上,缺省线程堆栈大小为 4 MB;在 64 位 SPARC V9 和 x86 平台上,缺省线程堆栈大小为 8 MB。
STACKSIZE 环境变量接受带有 B, K, M(字节、千字节、兆字节)或 G(千兆字节)后缀的数值。如果未指定后缀,则使用缺省单位千字节。
示例:
setenv STACKSIZE 8192 // sets the thread stack size to 8 Megabytes setenv STACKSIZE 16M // sets the thread stack size to 16 Megabytes
请注意,如果同时设置 STACKSIZE 和 OMP_STACKSIZE,则必须将它们设置为相同的值。如果值不相同,则会出现运行时错误。
设置加权因子,该因子用于确定在使用 GUIDED 调度的循环中为线程分配的块的大小。该值应该是正浮点数,并且应用于程序中所有使用 GUIDED 调度的循环。如果未设置,则采用缺省值 2.0。
允许更精确地控制程序中等待工作(空闲)、在屏障处等待或等待任务完成的线程的行为。上述各种等待类型的行为有三种可能:旋转片刻、让出 CPU 片刻、休眠直至被唤醒。
语法为(使用 csh 显示):
setenv SUNW_MP_WAIT_POLICY IDLE=val :BARRIER=val:TASKWAIT= val
IDLE=val、BARRIER= val 和 TASKWAIT= val 是可选关键字,用于指定所控制的等待类型。
上述每个关键字都有一个 val 设置来描述等待行为:SPIN、YIELD 或 SLEEP。
SPIN(time) 指定线程在让出 CPU 之前应旋转多长时间。time 可以是秒、毫秒或微秒(分别用 s、ms 和 mc 表示)。如果不指定时间单位,则使用秒。如果 SPIN 不带时间参数,表示线程在等待时应持续旋转。
YIELD(number) 指定线程在休眠之前应让出 CPU 的次数。每次让出 CPU 后,线程会在操作系统将其调度为运行时再次运行。如果 YIELD 不带 number 参数,表示线程在等待时应持续让出。
SLEEP 指定线程应立即转入休眠。
请注意,可以按任意顺序指定特定等待类型的 SPIN、SLEEP 和 YIELD 设置。这些设置之间用逗号分隔。"SPIN(0),YIELD(0)" 与 SLEEP(立即休眠)相同。在处理 IDLE、BARRIER 和 TASKWAIT 的设置时,采用左侧优先规则。
如果同时设置 SUNW_MP_WAIT_POLICY 和 OMP_WAIT_POLICY,则将忽略 OMP_WAIT_POLICY。
示例:
% 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 次,再转入休眠。