-qsmp

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qsmp    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

等效编译指示

无。

用途

启用程序代码的并行化。

语法

读取语法图跳过可视语法图 -q nosmpsmp=:autoexplicitnonested_parnoompnorec_locksoptostlsnostackcheckompnoostlsnested_parnoautonoexplicitnooptrec_locksschedule=autoruntimeaffinitydynamicguidedstatic=nstackcheckthreshold=n

缺省值

-qnosmp。 为单处理器机器生成代码。

参数

auto | noauto
auto 支持程序代码的自动并行化和优化; 即,编译器尝试自动并行化用户和编译器生成的循环。 noauto 仅并行化使用 SMP 或 OpenMP 伪指令显式注释的程序代码。 如果指定 -qsmp=omp-qsmp=noopt,那么暗示 noauto
显式 | 非显式
启用或禁用控制循环的显式并行化的伪指令。
nested_par | nonested_par
缺省情况下,编译器会序列化嵌套的并行构造。 当 nested_par 生效时,编译器会并行化规定的嵌套并行构造。 这不仅包括嵌套在作用域限定单元中的循环构造,还包括从其他并行构造中直接或间接引用的子程序中的并行构造。 请注意,此子选项不会影响自动并行化的循环。 在这种情况下,将并行化循环嵌套中的最多一个循环 (在作用域限定单元中)。

omp_set_nested 函数OMP_嵌套 环境变量的设置将覆盖 -qsmp = nested_par | nonested_par 选项的设置。

应谨慎使用此子选项。 根据可用线程数和外部循环中的工作量,即使此选项生效,也可以按顺序执行内部循环。 并行化开销不一定会被程序性能增益所抵消。

注: 已不推荐使用 -qsmp=nested_par | nonested_par 选项,在将来的发行版中可能会将其除去。 请改为使用 OMP_嵌套 环境变量或 omp_set_nested 函数
omp | noomp
omp 意味着 noauto,即,只有使用 SMP 或 OpenMP 伪指令显式注释的程序代码才会并行化。 当 noomp 生效时,隐含 auto
opt | noopt
opt 支持对并行化程序代码进行优化。 noopt 执行并行化代码所需的最小优化量。 这对于调试很有用,因为缺省情况下, -qsmp 会启用 -O2-qhot 选项,这可能会导致将某些变量移动到调试器不可访问的寄存器中。 但是,如果指定了 -qsmp=noopt-g 选项,这些变量对调试器仍然可见。
ostls| 延迟
允许操作系统提供的线程本地存储器 (TLS) 用于 threadprivate 数据。 您可以使用 延后 子选项对 threadprivate启用非 TLS。 提供 noostls 子选项是为了与较早版本的编译器兼容。
注: 如果使用此子选项,那么操作系统必须支持 TLS 以实现 OpenMP threadprivate 数据。 如果操作系统不支持操作系统,请使用 noostls 来禁用操作系统级别 TLS。
rec_locks | norec_locks
确定是否使用递归锁定。 当 rec_locks 生效时,嵌套的关键部分不会导致死锁。 请注意, rec_locks 子选项指定与 OpenMP API 不一致的关键构造的行为。
日程安排
指定调度算法的类型,以及用于在源代码中未显式分配其他调度算法的循环的块大小 (n) ( auto除外)。 schedule 子选项的子选项如下所示:
亲缘关系 [=n]
循环的迭代最初分为 n 个分区,包含 上限(number_of_iterations/number_of_threads) 个迭代。 每个分区最初分配给一个线程,然后进一步细分为每个包含 n 个迭代的块。 如果未指定 n ,那么块由 天花板(number_of_iterations_left_in_partition /2) 循环迭代组成。

当线程变为空闲时,它将从其初始分配的分区中获取下一个块。 如果该分区中没有更多块,那么该线程将从最初分配给另一个线程的分区中获取下一个可用块。

最初分配给休眠线程的分区中的工作将由处于活动状态的线程完成。

亲缘关系 调度类型 不是 OpenMP API 规范的一部分。

注: 已不推荐使用此子选项。 可以将 OMP_SCHEDULE 环境变量与 dynamic 子句配合使用以实现类似功能。
自动
循环迭代的调度委托给编译器和运行时系统。 编译器和运行时系统可以选择迭代到线程的任何可能的映射 (包括所有可能的有效调度类型) ,这些类型在不同的循环中可能不同。 请勿指定区块大小 (n)。
动态 [=n]
循环的迭代分为多个区块,每个区块都包含 n 个迭代。 如果未指定 n ,那么 每个区块都包含一个迭代

活动线程将以 "先到先得" 为基础分配这些块。 将剩余工作的块分配给可用线程,直到分配了所有工作为止。

引导式 [=n]
循环的迭代划分为逐渐较小的块,直到达到最小块大小 n 个循环迭代为止。 如果未指定 n ,那么 n 的缺省值为 1 迭代。

将以 "先到先得" 为基础为活动线程分配块。 第一个区块包含 上限(number_of_iterations/number_of_threads) 个迭代。 后续块由 天花板(number_of_iterations_left/number_of_threads) 迭代组成。

运行时
指定将在运行时确定块算法。
static [=n]
循环的迭代分为多个区块,每个区块包含 n 个迭代。 以 "循环" 方式为每个线程分配块。 这称为 块循环调度。 如果 n 的值为 1 ,那么调度类型具体称为 循环调度

如果未指定 n ,那么块将包含 floor(number_of_iterations/number_of_threads) 迭代。 余数 (number_of_iterations/number_of_threads) 块还有一个迭代。 将为每个线程分配一个单独的块。 这称为 块调度

如果某个线程处于熟睡状态并且已分配工作,那么将唤醒该线程,以便它可以完成其工作。

n
必须是值 1 或更大的整数。

指定不带子选项的 schedule 等同于 schedule=auto

stackcheck | nostackcheck
使编译器在运行时检查 辅助 线程的堆栈溢出,并在剩余堆栈大小小于 XLSMPOPTS 环境变量的 stackcheck 选项指定的字节数时发出警告。 此子选项旨在用于调试目的,并且仅在还设置了 XLSMPOPTS=stackcheck 时生效; 请参阅 XLSMPOPTS
阈值 [=n]
-qsmp=auto 生效时,控制发生的自动循环并行化量。 n 的值表示循环中为使其并行化而需要的最小工作量。 目前, "工作" 的计算被循环中的迭代次数大量加权。 通常,为 n指定的值越大,并行化的循环就越少。 指定值 0 指示编译器并行化所有可自动并行循环,无论这样做是否有利可图。 指定值 100 指示编译器仅并行化它认为有利可图的那些可自动并行循环。 指定大于 100 的值将导致序列化更多循环。
n
必须是 0 或更大的正整数。
如果指定没有子选项的 threshold ,那么程序将使用缺省值 100。
指定不带子选项的 -qsmp 等同于:
-qsmp=auto:explicit:opt:noomp:norec_locks:nonested_par:schedule=auto:
nostackcheck:threshold=100:ostls

使用量

  • 指定 omp 子选项总是意味着 noauto。 请将 -qsmp=omp:auto 添加到 OpenMP-compliant 应用程序的自动并行化列表中。
  • 仅应将 -qsmp_r-suffixed 调用命令配合使用,以在所有线程安全组件中自动链接。 可以将 -qsmp 选项与非_r-suffixed 调用命令配合使用,但您负责在相应的组件中进行链接。 如果使用 -qsmp 选项来编译程序中的任何源文件,那么也必须在链接时指定 -qsmp 选项,除非使用 ld 命令进行链接。
  • 使用 -qsmp=opt 选项生成的对象文件可与使用 -qsmp=noopt生成的对象文件链接。 链接不会影响每个对象文件中变量的调试器内的可视性。
  • -qnosmp 缺省选项设置指定不应为并行化伪指令生成任何代码,尽管仍将执行语法检查。 使用 -qignprag=omp:ibm 完全忽略并行化伪指令。
  • 指定 -qsmp 隐式设置 -O2-qsmp 选项覆盖 -qnooptimize,但不覆盖 -O3-O4-O5。 调试并行程序代码时,可以通过指定 -qsmp=noopt来禁用并行程序代码中的优化。
  • 除非 -qsmp 出现在 -qsmp=noopt之后,否则 -qsmp=noopt 子选项将覆盖命令行上的任何位置的性能优化选项。 例如, -qsmp=noopt -O3 等效于 -qsmp=noopt,而 -qsmp=noopt -O3 -qsmp 等效于 -qsmp -O3

预定义的宏

仅限 C 当 生效时,_IBMSMP被预定义为1,表示 SMP指令被识别;否则,它没有被定义。 -qsmp IBM

相关信息