schedule(static)
条件を使用して、またはschedule(dynamic, 10)
条件に応じて実行できる for ループがあります。現在、私のコードは十分に DRY (繰り返さないでください) ではなく、以前の機能に対応するために、次の繰り返しがあります。
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
}
}
#if(expression)
これらのスレッドを読んだ後、openMP にプラグマがあることに気付きました。
- OpenMP: #pragma の条件付き使用
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- 条件に応じて OpenMP プラグマを選択
- 条件付き「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)
または、for ループ本体を別の関数に配置して、そのように呼び出す必要がありますか?