5

私の C++ プログラムでは、OpenMP を使用する場合と使用しない場合 (つまり、マルチスレッドまたはシングルスレッド) で実行可能ファイルを実行したいと考えています。コードで OpenMP を使用する方法として、次の 2 つのケースのいずれかを検討しています。

#include <omp.h>(1) 私のコードにはOpenMP ディレクティブとのみがあると仮定します。

(2) (1) と同じで、私のコードはさらに のような OpenMP 関数を呼び出しますomp_get_thread_num()

実行ごとに異なるコードを持たないようにするために、自己定義のプリコンパイラ変数を使用して OpenMP がコード内のどこに現れるかを保護する唯一の方法ですか?

よろしくお願いします!

4

4 に答える 4

12

次の環境変数を使用できます。

set OMP_NUM_THREADS=1

実際には、OpenMP をオフにすることはありません。これにより、OpenMP はアプリケーションに対してスレッドを 1 つだけ作成するように強制されます。再コンパイルなしで動作します。この変数を使用して、1、2、3、4 などのスレッドでスケーラビリティをテストします。

于 2009-09-02T13:32:24.723 に答える
5

こんにちはこれを行う最も簡単な方法は

omp_set_num_threads(m_iUseableProcessors);

ここm_iUseableProcessorsで、計算を分割するプロセッサの数です。OpenMP関数なしでそれを行う方法がわかりません。おそらく#ifdefそれらを除外できますが、コンパイル時に OpenMP をオフにする必要があります。

于 2009-08-31T14:33:46.517 に答える
3

次のようにインクルードを配置できます。

#ifdef _OPENMP_
#include<omp.h> 
#endif

-fopenmp フラグなしでプログラムを実行すると、openmp ディレクティブが無視されます。

于 2010-03-03T22:04:40.173 に答える
0

の提案に加えて、_OPENMPC99 _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
于 2015-04-06T21:15:31.197 に答える