2016-08-24 20 views
3

実行時にOpenMP並列化を有効または無効にすることはできますか?私は、特定の状況下では並行して実行されるべきであり、異なる状況下では並行して実行されないコードをいくつか持っています。同時に、他のスレッドにはOpenMPも使用する計算があり、常に並列に実行する必要があります。現在のスレッドでOpenMPを並列化しないように指示する方法はありますか?私はomp_set_num_threadsを知っていますが、OpenMPが使用するスレッドの数をグローバルに設定すると仮定します。実行時にOpenMPをローカルで有効/無効にする

+0

あなたが他とのOpenMPを組み合わせるべきではありませんOpenMPランタイムの将来のバージョンで正しく動作することを保証するものではありません。 –

答えて

10

#pragma ompコンストラクトにifという条件を追加することもできます。これらは、条件がfalseの場合にプラグマから派生したOpenMPランタイム呼び出しへの呼び出しをスキップします。

(それぞれ真と偽)変数に基づいて条件文を使用して、次のプログラムを考えてみましょうtf

#include <omp.h> 
#include <stdio.h> 

int main (void) 
{ 
    int t = (0 == 0); // true value 
    int f = (1 == 0); // false value 

    #pragma omp parallel if (f) 
    { printf ("FALSE: I am thread %d\n", omp_get_thread_num()); } 

    #pragma omp parallel if (t) 
    { printf ("TRUE : I am thread %d\n", omp_get_thread_num()); } 

    return 0; 
} 

その出力は次のようになります。

$ OMP_NUM_THREADS=4 ./test 
FALSE: I am thread 0 
TRUE : I am thread 0 
TRUE : I am thread 1 
TRUE : I am thread 3 
TRUE : I am thread 2 
+0

ありがとう、私はこれが完璧なソリューションだと思います。プラグマにブール変数を追加するだけで、実行を並列化するかどうかを指定することができます。 – user1488118