如何从 C/C++ 控制全局 OpenMP 设置?

How to control global OpenMP settings from C/C++?

OpenMP 不提供 API 在 运行 时间内调整一些关键设置,例如OMP_WAIT_POLICY or GOMP_SPINCOUNT(至少在 gcc 4.8.3 中)。出于某种原因,此类设置旨在通过环境变量进行更改。不太方便。

有什么方法可以在 C/C++ 中使用 Linux 上的 gcc 在 运行 时间内更改此类设置?

例如,更改相应的环境变量就足够了吗(例如,从 stdlib.h 更改为 putenv?)。 OpenMP 内核会立即获取新设置还是在进程启动时只读取一次?

P.S。 在 Windows Intel C++/Fortran 上为设置提供附加功能(例如 kmp_set_blocktime)。

OpenMP 标准explicitly says:

Modifications to the environment variables after the program has started, even if modified by the program itself, are ignored by the OpenMP implementation. However, the settings of some of the ICVs can be modified during the execution of the OpenMP program by the use of the appropriate directive clauses or OpenMP API routines.

因此,如果没有通过编译器指令或通过 运行 时间库例程给出句柄,一旦代码开始,您就无法修改这些值。

当然,由于GOMP_SPINCOUNT不是一个标准化的环境变量,它可能不符合OpenMP标准要求...但我只能说这些。

OpenMP 标准定义了一组影响运行时工作的内部控制变量 (ICV)。这些 ICV 是根据某些环境变量的值初始化,然后一些可以通过使用一组读取and/or修改标准 OpenMP API 调用。

ICV 列表及其含义在OpenMP reference 的§2.3.1 中给出。 §2.3.3 中给出了可用于检索或修改某些 ICV 值的 API 调用列表。

除了 OpenMP 参考中列出的内容之外,任何其他内容都是非标准的,使用它会导致不可移植的源代码。此外,将某些 OpenMP 设置硬编码到程序代码中会使最终用户无法修改运行时行为而无需重新编译。让这些 ICV 由环境变量控制背后的假设是,执行环境比程序员想象的要多得多。