実行時にOpenMP並列化を有効または無効にすることはできますか?私は、特定の状況下では並行して実行されるべきであり、異なる状況下では並行して実行されないコードをいくつか持っています。同時に、他のスレッドにはOpenMPも使用する計算があり、常に並列に実行する必要があります。現在のスレッドでOpenMPを並列化しないように指示する方法はありますか?私はomp_set_num_threads
を知っていますが、OpenMPが使用するスレッドの数をグローバルに設定すると仮定します。実行時にOpenMPをローカルで有効/無効にする
3
A
答えて
10
#pragma omp
コンストラクトにif
という条件を追加することもできます。これらは、条件がfalseの場合にプラグマから派生したOpenMPランタイム呼び出しへの呼び出しをスキップします。
(それぞれ真と偽)変数に基づいて条件文を使用して、次のプログラムを考えてみましょうt
とf
:
#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
あなたが他とのOpenMPを組み合わせるべきではありませんOpenMPランタイムの将来のバージョンで正しく動作することを保証するものではありません。 –