OpenMPの電源を切ります
-
20-09-2019 - |
質問
私のC ++プログラムでは、私は、時にはOpenMPの(すなわち、マルチスレッドまたはシングルスレッド)を使用することなく、時には、その実行可能ファイルを実行したいです。私のコードは、OpenMPを使用しているどのように私は、次の2つのいずれかの場合を検討しています:
(1)自分のコードのみ#include <omp.h>
とのOpenMPディレクティブを有していると仮定する。
(2)と同じ(1)と私のコードはさらにomp_get_thread_num()
ようOpenMPの関数を呼び出します。
異なる走行用の異なるコードを持っていないために、それは、OpenMPは私のコードで表示される場所守るために、いくつかの自己定義されたプリコンパイラの変数を使用して唯一の方法は何ですか?
おかげに関して!
解決
こんにちはこれを行う最も簡単な方法がある。
omp_set_num_threads(m_iUseableProcessors);
m_iUseableProcessors
あなたは以上の計算を分割したいプロセッサの数です。私は、OpenMPの機能なしでどのように行うのか分かりません。あなたはおそらくそれらを#ifdef
ことができ、それはあなたがコンパイル時のOpenMPをオフになります。
他のヒント
あなたは環境変数を使用することができます:
set OMP_NUM_THREADS=1
実際に、それは、OpenMPをオフにしないであろう。これは、アプリケーションのために一つだけのスレッドを作成するためのOpenMPを強制します。これは、再コンパイルせずに動作します。 Iは1、2、3、4などスレッドでスケーラビリティをテストするためにこの変数を使用します。
あなたはインクルードには置くことができます:
#ifdef _OPENMP_
#include<omp.h>
#endif
あなたは-fopenmpフラグなしで、あなたのプログラムを実行する場合は、さて、それは、OpenMPディレクティブを無視します。
_OPENMP
の提案に加えて、あなたはあなたには、いくつかのC ++コンパイラを使用している場合、それは便利、C99の_Pragma
(または__pragma
を使用することを見つけるかもしれない - <のhref = "https://stackoverflow.com/q/4782049/2189128を参照してください「>詳細については、このStackOverflowの質問には)、それによって3倍で条件付きコンパイルに関連付けられた行を削減し、そうでない場合は、あなたにO(n)のインスタンスを超えるO(1)コントロールを与え、#ifdef _OPENMP
と#endif
が散らばっされているから、あなたのコードを防ぐためにOpenMPの注釈のます。
たとえば、私はC99のOpenMPコードで次のスタイルを使用します。おそらくコンパイラ固有のが(その場合には、等__GNUC__
、__clang__
、__INTEL_COMPILER
、のようなマクロが有用であり得る)C ++をサポートするための変更は、かなり控えめでなければならない。
#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