条件によっては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)
プラグマを持っていることに気づいた。
- OpenMP: conditional use of #pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- Choose OpenMP pragma according to condition
- Conditional "pragma omp"
- http://openmp.org/mp-documents/ntu-vanderpas.pdf
しかし、私は私の問題で多くの人々を見てきましたが、一般的な解決策を欠いていることがあるようです。最高の解決策は、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)
または私は別の関数にループ本体のための私を置いて、そのようにそれを呼び出すことを余儀なくしていますか?
私はこの提案について話していると思います(http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196)。 Tbh、私はコンパイルするとは思わないが、OMP_FORは定義されていない。 OMP_SCHEDULEに行く限り、私はそれについて全く知らなかった。私は周りを見回し、私が何を見つけることができるかを見てみよう! –