質問
私はC++のプログラム用のOpenMP、複数の機械がいいOpenMPを設置。
どうすればだいたいのプログラムを知れば機械のOpenMPを無視する方 #include <omp.h>
,OpenMP指示など #pragma omp parallel ...
)および/または図書館機能 tid = omp_get_thread_num();
) ?
解決
のOpenMPコンパイラのランタイムものではなく、プラットフォームのものです。
すなわち。あなたは、Visual Studio 2005以降を使用してアプリケーションをコンパイルする場合、実行時にはそれをサポートしているとして、あなたはいつものOpenMPを用意して。 (およびエンドユーザーは、Visual Studio Cランタイムがインストールされていない場合、アプリケーションがまったく動作しません)。
だから、あなたは、あなたがそれを使用することができれば、それは常にちょうどそのようなstrcmpのような機能のようがあるだろう、心配する必要はありません。彼らはCRTを持っていることを確認するには、あなたは、Visual Studioの再配布可能ファイルをインストールすることができます。
編集ます:
[OK]を、しかし、問題は、ターゲットマシンではなく、ターゲットコンパイラので、GCC 4.1は、あなたのOpenMPアプリケーションをコンパイルすることができません。すべてのコンパイラがきたように彼らのバージョンを与えるマクロを事前に定義された、ラップあなたのOpenMPは#ifdefのブロックを呼び出します。例えば、GCCコンパイラのバージョンを識別するために3つのマクロを使用して、__GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__
他のヒント
OpenMPのコンパイルは、プリプロセッサの定義 "_OPENMP" を追加します:
#if defined(_OPENMP)
#pragma omp ...
#endif
いくつかの例については、 http://bisqwit.iki.fi/story/を見ますHOWTO / OpenMPの/#ディスカッションと次のコード
コンパイラは、彼らが理解していない#pragma
ディレクティブを無視することになっています。それは、構文の全体のポイントです。そしてopenmp.h
で定義された関数は、非並列システム上での簡単な明確に定義された意味を持っている - 特に、ヘッダファイルには、それが有効になっていない場合、コンパイラは、ENABLE_OPENMP
を定義しているかどうかをチェックし右のフォールバックを提供します。
だから、あなたが必要とするすべてがリンクするopenmp.h
のコピーです。 http://cms.mcc.uiuc.edu/:ここに一つですqmcdev /ドキュメント/ HTML / OpenMP_8h-source.htmlするます。
コードの関連部分は、しかし、これは単にある:
#if defined(ENABLE_OPENMP)
#include <omp.h>
#else
typedef int omp_int_t;
inline omp_int_t omp_get_thread_num() { return 0;}
inline omp_int_t omp_get_max_threads() { return 1;}
#endif
最悪の場合、あなただけのこれらの3本のラインを取るとダミーopenmp.h
ファイルに入れて、それを使用することができます。残りはうまく動作します。
Bisqwitするから借りた私が好きな別のアプローチがあります:
#if defined(_OPENMP)
#include <omp.h>
extern const bool parallelism_enabled = true;
#else
extern const bool parallelism_enabled = false;
#endif
次に、このようなループのためにあなたのOpenMP並列を開始します:
#pragma omp parallel for if(parallelism_enabled)
注:正当な理由なぜGoogleと他の人がそれをサポートしていないため、非標準であるpragma
を、使用していないため。
どうすればだいたいのプログラムを知れば機械のOpenMPを無視する方
#include <omp.h>
,OpenMP指示など#pragma omp parallel ...
)および/または図書館機能tid = omp_get_thread_num();
) ?
こちらは遅いの答えが、いつでも バグ報告 の利用による #pragma omp simd
Microsoftコンパイラでコンパイル.
による OpenMPの仕様, 第2.2:
条件コンパイル
に実装を支えるプリプロセッサ_OPENMPマクロ名 は、次のように定義されている数値yyyymmがyyyy-mmの 年onth指定のバージョンの、OpenMP APIの 実装に対応しています。
での近代MicrosoftコンパイラでコンパイルだけをサポートOpenMPからの交2000年2005年.できるだけ"ということを時間"でOpenMP2.0発売された、2000年にはOpenMP2.5したのは2005年に発表されている。がMicrosoft広告バージョンから2002年.
ここでは _OPENMP
番号...
- Visual Studio2012-OpenMP200203
- Visual Studio2017-OpenMP200203
- IBM XLC13.01-OpenMP201107
- Clang7.0-OpenMP201107
- GCC4.8-OpenMP201107
- GCC8.2-OpenMP201511
で使用する場合、 #pragma omp simd
守ループは、 #pragma omp simd
はOpenMP4.0します。
#if _OPENMP >= 201307
#pragma omp simd
for (size_t i = 0; i < 16; ++i)
data[i] += x[i];
#else
for (size_t i = 0; i < 16; ++i)
data[i] += x[i];
#endif
ることになるものと思われる複数の機械がいいOpenMPを設置。
とを明らかにするので,それをプログラムそれぞれにおいてます。の x86_64ABI を保証しませんOpenMPはx86、x32はx86_64ます。いない読みすることで作ることができる機械には、その他機です。