質問

私は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ます。いない読みすることで作ることができる機械には、その他機です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top