除了 的建议之外_OPENMP
,您可能会发现使用 C99 _Pragma
(或者__pragma
,如果您使用一些 C++ 编译器 - 有关详细信息,请参阅此 StackOverflow 问题)来防止您的代码被#ifdef _OPENMP
和乱扔#endif
,从而减少与条件编译相关的行数很有用3 倍,否则让您 O(1) 控制 O(n) 个 OpenMP 注释实例。
例如,我在 C99 OpenMP 代码中使用以下样式。支持 C++ 的更改应该是相当适度的,尽管可能是特定于编译器的(在这种情况下,像__GNUC__
, __clang__
,__INTEL_COMPILER
等宏可能很有用)。
#ifndef PRAGMA_OPENMP_H
#define PRAGMA_OPENMP_H
#if defined(_OPENMP) && ( __STDC_VERSION__ >= 199901L )
#define PRAGMA(x) _Pragma(#x)
#define OMP_PARALLEL PRAGMA(omp parallel)
#define OMP_PARALLEL_FOR PRAGMA(omp parallel for schedule(static))
#define OMP_FOR PRAGMA(omp for schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE(n) PRAGMA(omp parallel for collapse(n) schedule(static))
#define OMP_PARALLEL_FOR_COLLAPSE2 OMP_PARALLEL_FOR_COLLAPSE(2)
#define OMP_PARALLEL_FOR_COLLAPSE3 OMP_PARALLEL_FOR_COLLAPSE(3)
#define OMP_PARALLEL_FOR_COLLAPSE4 OMP_PARALLEL_FOR_COLLAPSE(4)
#define OMP_PARALLEL_FOR_REDUCE_ADD(r) PRAGMA(omp parallel for reduction (+ : r) schedule(static))
#else
#warning No OpenMP, either because compiler does not understand OpenMP or C99 _Pragma.
#define OMP_PARALLEL
#define OMP_PARALLEL_FOR
#define OMP_FOR
#define OMP_PARALLEL_FOR_COLLAPSE(n)
#define OMP_PARALLEL_FOR_COLLAPSE2
#define OMP_PARALLEL_FOR_COLLAPSE3
#define OMP_PARALLEL_FOR_COLLAPSE4
#define OMP_PARALLEL_FOR_REDUCE_ADD(r)
#endif
#endif // PRAGMA_OPENMP_H