2011-10-21 24 views
15

OpenMPプラグマが入ったC++コードがあります。このコードをマルチスレッドモード(OpenMPを使用)とシングルスレッドモード(OpenMPを使用しない)の両方でテストしたいと思います。OpenMPディレクティブを無効にするには?

今のところ、モードを切り替えるには、私は#pragma omp(または少なくともparallel)とコメントする必要があります。

OpenMPを有効または無効にする最もクリーンな、またはデフォルトの方法は何ですか?

答えて

10

OpenMPを無効にするスイッチのコンパイラマニュアルを参照してください。 GCCの場合、OpenMPはデフォルトでは無効になっており、-fopenmpオプションで有効になっています。

環境変数OMP_NUM_THREADSを1に設定してコードを実行する方法もありますが、最初はOpenMPなしでコンパイルするのとまったく同じではありません。

+0

書き込み「の#pragma ompの...」とのコード以降_not_、私は私には非常にエレガントな、悲しいこと(OMP_SET_NUM_THREADSは、(1) '最も有用ではない'見つけ –

+4

「GOMP_parallel_startへの未定義参照」のようなerrosをリンク原因を-fopenmp可能意見) –

+0

私たちのプロジェクトには、WITH_OPENMPがあります。これは、-fopenmpの渡しを処理するboolean構築時間オプションと、必要な場合の定義です。 Idはプロジェクト内でopenmpを使用している誰かにこれを示唆していますが、openmpなしでテストする機能は、バグの原因として排除することができます。 – ideasman42

2

、そのようなものは、通常の処理方法(一般的なケースでは)#define sおよび#ifdefである:あなたのヘッダファイルで

#ifndef SINGLETHREADED 
#pragma omp 
#endif 

コンパイルすると、OpenMPのを無効にする-DSINGLETHREADEDを追加します。

cc -DSINGLETHREADED <other flags go here> code.c 
25

-fopenmpオプションを指定してコンパイルしないと、パラレルコードが取得されません。すべてのコードを生成する適切な定義とmakefileを使用して実行できます。

OpenMPのドキュメントは(例のみを)言う:

#ifdef _OPENMP 
    #include <omp.h> 
#else 
    #define omp_get_thread_num() 0 
#endif 

http://www.openmp.org/mp-documents/spec30.pdf(条件付きコンパイル)を参照してください。

+0

上記の条件は、else文を指定しなくても動作します。 – sinner

関連する問題