检查预处理器是否使用 -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 运行时。答:由于调用它们时您不会处于任何活动的平行区域,因此它们会完全按照您的意愿进行操作。
我有使用 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 运行时。答:由于调用它们时您不会处于任何活动的平行区域,因此它们会完全按照您的意愿进行操作。