の提案に加えて、_OPENMP
C99 _Pragma
(または__pragma
、一部の C++ コンパイラを使用している場合は、詳細についてはこの StackOverflow の質問#ifdef _OPENMP
を参照してください) を使用して、コードがとで散らかるのを防ぎ、#endif
条件付きコンパイルに関連する行を減らすと便利な場合があります。それ以外の場合は、OpenMP* アノテーションの O(n) インスタンスを O(1) 制御できます。
たとえば、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