34

OpenMP を使用する C++ プログラムがあります。これは、OpenMP がインストールされているかどうかに関係なく、複数のマシンで実行されます。

#include <omp.h>マシンに OpenMP がなく、それらの OpenMP ディレクティブ ( など#pragma omp parallel ...) やライブラリ関数 ( など)を無視するかどうかをプログラムに知らせるにはどうすればよいtid = omp_get_thread_num();ですか?

4

5 に答える 5

68

OpenMP コンパイルにより、プリプロセッサ定義 "_OPENMP" が追加されるため、次のことが可能になります。

#if defined(_OPENMP)
   #pragma omp ...
#endif

いくつかの例については、http://bisqwit.iki.fi/story/howto/openmp/#Discussionとそれに続くコードを参照してください。

于 2011-12-09T14:36:33.200 に答える
25

コンパイラは#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ファイルに入れて使用することもできます。残りはうまくいきます。

于 2010-03-02T10:28:02.217 に答える
0

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__

于 2009-08-19T14:12:46.253 に答える