4. 环境变量
本章介绍 OpenMP C 和 C++ API 环境变量(或类似的平台特定机制),这些变量可控制并行代码的执行。 环境变量的名称必须大写。 分配给它们的值不区分大小写,并且可能具有前导空格和尾随空格。 程序启动后对值的修改将被忽略。
环境变量如下所示:
- OMP_SCHEDULE 设置运行时计划类型和区块大小。
- OMP_NUM_THREADS 设置要在执行期间使用的线程数。
- OMP_DYNAMIC 用于启用或禁用线程数的动态调整。
- OMP_NESTED 用于启用或禁用嵌套并行。
本章中的示例仅演示如何在 Unix C shell (csh) 环境中设置这些变量。 在 Korn shell 和 DOS 环境中,操作如下所示:
csh:
setenv OMP_SCHEDULE "dynamic"
ksh:
export OMP_SCHEDULE="dynamic"
DOS:
set OMP_SCHEDULE="dynamic"
4.1 OMP_SCHEDULE
OMP_SCHEDULE
仅适用于具有计划类型 runtime
的 for
和 parallel for
指令。 可在运行时设置所有此类循环的计划类型和区块大小。 将此环境变量设置为任何已识别的计划类型和可选的 chunk_size。
对于具有 runtime
以外的计划类型的 for
和 parallel for
指令,将忽略 OMP_SCHEDULE
。 此环境变量的默认值是实现定义的。 如果已设置可选 chunk_size,该值必须为正值。 如果未设置 chunk_size,则假定值为 1,但计划为 static
时除外。 对于 static
计划,默认区块大小设置为循环迭代空间除以应用于循环的线程数。
示例:
setenv OMP_SCHEDULE "guided,4"
setenv OMP_SCHEDULE "dynamic"
交叉引用
- for 指令
- parallel for 指令
4.2 OMP_NUM_THREADS
OMP_NUM_THREADS
环境变量设置要在执行期间使用的默认线程数。 如果通过调用 omp_set_num_threads
库例程显式更改该数字,则忽略 OMP_NUM_THREADS
。 如果 parallel
指令上有一个显式的 num_threads
子句,则也会忽略它。
OMP_NUM_THREADS
环境变量的值必须是一个正整数。 其效果取决于是否启用了线程数的动态调整。 有关 OMP_NUM_THREADS
环境变量和线程动态调整之间的交互的完整规则集,请参阅第 2.3 部分。
在以下情况中,要使用的线程数是实现定义的:
- 未指定
OMP_NUM_THREADS
环境变量, - 指定的值不是正整数,或者
- 该值大于系统可支持的最大线程数。
示例:
setenv OMP_NUM_THREADS 16
交叉引用
4.3 OMP_DYNAMIC
OMP_DYNAMIC
环境变量启用或禁用可用于执行并行区域的线程数的动态调整。 通过调用 omp_set_dynamic
库例程显式启用或禁用动态调整时,将忽略 OMP_DYNAMIC
。 其值必须为 TRUE
或 FALSE
。
如果 OMP_DYNAMIC
设置为 TRUE
,则运行时环境可调整用于执行并行区域的线程数,以便最好地使用系统资源。 如果 OMP_DYNAMIC
设置为 FALSE
,则禁用动态调整。 默认条件是“实现定义的”。
示例:
setenv OMP_DYNAMIC TRUE
交叉引用
4.4 OMP_NESTED
除非通过调用 omp_set_nested
库例程来启用或禁用嵌套并行,否则由 OMP_NESTED
环境变量启用或禁用嵌套并行。 如果 OMP_NESTED
设置为 TRUE
,则启用嵌套并行。 如果 OMP_NESTED
设置为 FALSE
,则禁用嵌套并行。 默认值为 FALSE
。
示例:
setenv OMP_NESTED TRUE