检查预处理器是否使用 -fopenmp 调用了 g++

Check in preprocessor that g++ is called with -fopenmp

我有使用 OpenMP 的代码,我使用 g++ 构建它,如下所示:

g++ -std=c++17 -O3 -fopenmp main.cpp -o helloworld

现在,出于调试和测试的目的,有时我想在没有 OpenMP 的情况下使用类似的东西构建代码:

g++ -std=c++17 -O3 main.cpp -o helloworld

代码不会构建,因为 OpenMP 函数未链接(-fopenmp 未使用)。所以我的想法是使用一些预处理器魔法,比如:

#ifdef OPENMP
// run OpenMP-specific code
#else
// run this code only if -fopenmp was not set
#endif

这可能吗?问题可能是 -fopenmp 仅用于链接 OpenMP 库,因此在构建的预处理器阶段可能不是 known/used。

OpenMP 标准提出了一个专门用于这种情况的宏:_OPENMP

当且仅当代码在编译时支持激活 OpenMP 时才定义此宏。此外,虽然这不是您的问题,但定义宏以反映编译器支持的标准版本。

更准确地说,宏在设置时使用以下格式定义: YYYYMM 其中 YYYY 表示年份,MM 表示采用支持的标准的月份。由于该标准定期合并新闻功能,这允许通过检查 _OPENMP 的值是否大于或等于所需的最小值来检查代码是否支持所需的功能。

最后,请注意,您可能还想考虑以下替代方法来解决您的问题。实际上,如果出于调试原因您不希望在激活 OpenMP 的情况下编译代码,但您仍然希望它即使调用 OpenMP 特定函数(如 omp_get_num_threads())也能正常工作,您可以只替换 -fopenmp随处切换-lgomp。使用这个简单的技巧不会启用您的 OpenMP 指令,但您仍将 link 定义所需函数的 OpenMP 运行时。答:由于调用它们时您不会处于任何活动的平行区域,因此它们会完全按照您的意愿进行操作。