2011-09-14 17 views
11

私はOpenMPを使ってプログラムの効率を改善しています。OpenMP:#pragmaの条件付き使用

最近、私は小さなループでこのライブラリの使用がパフォーマンスを低下させ、通常の方法を使用する方が良いことを発見しました。条件が満たされた場合にのみ

実際には、私は、OpenMPを使用したいのですが、私のコードは

#pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

ですが、私は何をしたいサイズが十分に小さい場合に#pragmaを無効にすることですすなわち:

if (size > OMP_MIN_VALUE) 
    #pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
do_some_stuff(); 

しかし、動作しない、より良い方法は、二回のループを書くことですが、私はそのようにしたくない...

if (size > OMP_MIN_VALUE) 
{ 
    #pragma omp parallel for 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 
else 
{ 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 

これを行うにはどうすればよいですか?

答えて

7

私はあなたのparallel forディレクティブでオプションschedule clauseを使用することによって、あなたが探している効果を達成することができるはずだと思う:

#pragma omp parallel for schedule(static, OMP_MIN_VALUE) 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

あなたはしかし、スケジューリングの異なる種類の周りにプレイしたいと異なるかもしれませんあなたのライブラリルーチンに最も適したものを見るチャンクサイズ。

+11

if(size> = OMP_MIN_VALUE)には#pragma omp parallelを使用しましたが、 – Arthur