OpenMP を使用する C++ プログラムがあります。これは、OpenMP がインストールされているかどうかに関係なく、複数のマシンで実行されます。
#include <omp.h>
マシンに OpenMP がなく、それらの OpenMP ディレクティブ ( など#pragma omp parallel ...
) やライブラリ関数 ( など)を無視するかどうかをプログラムに知らせるにはどうすればよいtid = omp_get_thread_num();
ですか?
OpenMP コンパイルにより、プリプロセッサ定義 "_OPENMP" が追加されるため、次のことが可能になります。
#if defined(_OPENMP)
#pragma omp ...
#endif
いくつかの例については、http://bisqwit.iki.fi/story/howto/openmp/#Discussionとそれに続くコードを参照してください。
コンパイラは#pragma
、理解できないディレクティブを無視することになっています。それが構文の要点です。また、 で定義された関数はopenmp.h
、非並列システムで明確に定義された単純な意味を持ちます。特に、ヘッダー ファイルは、コンパイラが定義しているかどうかをチェックし、ENABLE_OPENMP
有効になっていない場合は適切なフォールバックを提供します。
したがって、必要なのはopenmp.h
リンク先のコピーだけです。ここに 1 つがあります: http://cms.mcc.uiuc.edu/qmcdev/docs/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
ファイルに入れて使用することもできます。残りはうまくいきます。
OpenMP はコンパイラ ランタイムのものであり、プラットフォームのものではありません。
すなわち。Visual Studio 2005 以降を使用してアプリをコンパイルする場合、ランタイムが OpenMP をサポートしているため、常に OpenMP を使用できます。(エンド ユーザーが Visual Studio C ランタイムをインストールしていない場合、アプリはまったく機能しません)。
strcmp などの関数と同じように、使用できる場合は常にそこにあるので、心配する必要はありません。CRT があることを確認するには、Visual Studio 再頒布可能パッケージをインストールします。
編集:
わかりましたが、GCC 4.1 では openMP アプリをコンパイルできないため、問題はターゲット マシンではなく、ターゲット コンパイラにあります。すべてのコンパイラには、バージョンを示す定義済みのマクロがあるため、OpenMP 呼び出しを #ifdef ブロックでラップします。たとえば、GCC は 3 つのマクロを使用してコンパイラのバージョンを識別します。__GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__