2013-03-19 18 views
10

条件によってはschedule(static)またはschedule(dynamic, 10)を使用して実行できるforループがあります。現在、私のコードは十分に(自分を繰り返さないでください)DRYではありません、それは次のよう繰り返している以前の機能に対応する。これらのスレッドを読んだ後openMP条件付きプラグマ "else else"

boolean isDynamic; //can be true or false 
if(isDynamic){ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10) 
    for(...){ 
     //for code inside 
    } 
}else{ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static) 
    for(...){ 
     //SAME for code inside, in fact, this is the EXACT same for as before 
    } 
} 

を、私は、OpenMPは#if(expression)プラグマを持っていることに気づいた。

しかし、私は私の問題で多くの人々を見てきましたが、一般的な解決策を欠いていることがあるようです。最高の解決策は、forループの本体を関数に変換し、関数を呼び出すことですが、この解決法は私には十分ではありません。

OpenMPには#if(expression) elseプラグマがあるのだろうか? のような何か:

#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static) 

または私は別の関数にループ本体のための私を置いて、そのようにそれを呼び出すことを余儀なくしていますか?

答えて

4

これは興味深い質問です。基本的には、実行時にscheduleポリシーを変更する必要があります。私が知る限り、現在のOpenMPにはそのような指令はありません。

私はまったく同じ問題を抱えていました。私のソリューションは、あなたが言及したように、関数としてループ本体を作ることに終わった。それ以外の場合は、醜いマクロを使用する必要があります。

しかし、私もschedule(runtime)を使用しようとしましたが、これは環境変数OMP_SCHEDULEを読み込みます。だから、実行時にこの環境変数を変更しましたが、うまくいきませんでした。これは、OpenMPランタイムが最初にこの環境を1回だけ読み取るためです。実装固有の問題かもしれません。したがって、他の実装では、この環境変数をオンザフライで読むことができます。このアプローチを試してみてください。

+0

私はこの提案について話していると思います(http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196)。 Tbh、私はコンパイルするとは思わないが、OMP_FORは定義されていない。 OMP_SCHEDULEに行く限り、私はそれについて全く知らなかった。私は周りを見回し、私が何を見つけることができるかを見てみよう! –