【问题标题】:What preprocessor define does -fopenmp provide?-fopenmp 提供什么预处理器定义?
【发布时间】:2015-08-28 11:12:30
【问题描述】:

我有一些代码可以使用(或不使用)OpenMP 运行——这取决于用户如何设置生成文件。如果他们想使用 OpenMP 运行,那么他们只需将 -fopenmp 添加到 CFLAGSCXXFLAGS

我正在尝试确定可以使用什么预处理器宏来判断-fopenmp 何时生效。 omp.h 标头看起来不是很有趣:

$ cat /usr/lib/gcc/x86_64-linux-gnu/4.8/include/omp.h | grep define
#define OMP_H 1
#define _LIBGOMP_OMP_LOCK_DEFINED 1
# define __GOMP_NOTHROW throw ()
# define __GOMP_NOTHROW __attribute__((__nothrow__))

而且我无法让预处理器提供任何有用的东西:

$ cpp -dM -fopenmp </dev/null | grep -i omp
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __STDC_IEC_559_COMPLEX__ 1

$ cpp -dM -fopenmp </dev/null | grep -i version
#define __GXX_ABI_VERSION 1002
#define __VERSION__ "4.8.2"

-fopenmp 提供什么预处理器定义?


这类似于How to tell if OpenMP is working? 但我对编译时间感兴趣,而不是构建后或运行时。

注意:本项目不使用Boost,不使用Autotools,也不使用Cmake。它只使用一个makefile。

【问题讨论】:

  • #if OMP_H 有什么问题?
  • 快速思考一下(我不使用 OpenMP):为什么在调用 gcc 时不简单地使用 -D WITH_OPENMP(或类似的)?
  • 是的,请阅读答案。正如我所写:“只是一个快速的想法”。另外:您的代码是 C++,而不是 C(错误标签)

标签: c openmp c-preprocessor


【解决方案1】:

您的 grep 过于具体,您应该寻找“openmp”。

或者更确切地说,区分 cpp -dM -fopenmp &lt;/dev/nullcpp -dM &lt;/dev/null 会产生一个差异:

#define _OPENMP 201107

这应该正是您正在寻找的。​​p>

【讨论】:

  • 非常感谢。关于差异的好主意。它胜过在黑暗中刺伤,因为您在文档中找不到它。在这种情况下,它似乎没有记录:$ man -k "_OPENMP" 的 0 次点击。
  • @jww 我在网上发现了一些关于它的提及,包括一些 GCC 文档。我建议首先检查您可能需要支持的其他编译器(例如 msvc)是否也定义了它,然后再继续使用它。
  • @jww gcc、msvc 和 clang 实际上都定义了它。你应该很高兴。
  • 是的,一旦你指出了定义,我发现像Ignore OpenMP on Machine that doesn't have it 这样的问题。再次感谢。
  • §2.2 条件编译 OpenMP specification 第 32 页(PDF 中的第 40 页):“在支持预处理器的实现中,_OPENMP 宏名称是定义为具有十进制值 yyyymm,其中 yyyymm 是实现支持的 OpenMP API 版本的年份和月份名称。 "
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2015-04-05
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多