2012-02-20 13 views
4

私はスレッドの多様性で実行する必要がある最適化するコードを用意しています。私が持っているforループでさまざまなスケジューリング手法を使っていくつかのテストを実行した後、スレッドを1つしか持っていないときに動的スケジューリングを実行するのがベストだと結論づけました。それはopenMPでも可能ですか? 条件に応じてOpenMPプラグマを選択してください

は、私は、次のような何かをできるようにしたい、より正確には:誰も私を助けることができる場合

if(omp_get_max_threads()>1) 
#pragma omp parallel for .... scheduling(guided) 
else 
#pragma omp parallel for .... scheduling(dynamic) 
for(.....){ 
    ... 
} 

が、私はそれをお願い申し上げます。もう1つの解決策は、forループを2回記述し、if条件を使用することです。しかし、可能ならばそれを避けたい。

+1

...:そして、あなたが将来的にそれを変更する必要がある場合は、このコードを変更する必要がある唯一の場所があるでしょう – Mysticial

+0

それは私が最後にも意味していたものです。私の悪い、私は少し疲れています。私はそれが一つの解決策であることを知っていますが、コードの複雑さとサイズも増加します。それが私の最後の手段です。 – gkaran89

+0

私は@Mysticialが正しいアイデアを持っていると思います。 #pragmaは通常、コンパイル時に発生することを制御します。したがって、 'for'ループのために生成されるコードは、2つの間で異なる可能性があります。実行時条件を使用して#pragmaを単独で選択します。 –

答えて

8

可能な解決策は、if文にループをコピーし、ループボディを関数に抽出して、DRYの原則を回避します。私は考えることができる唯一の方法は、if文の中にループを複製することである

void foo(....) 
{ 
    ... 
} 

if(omp_get_max_threads()>1) 
{ 
    #pragma omp parallel for .... scheduling(guided) 
    for (.....) 
     foo(....); 
} 
else 
{ 
    #pragma omp parallel for .... scheduling(dynamic) 
    for (.....) 
     foo(....); 
} 
+0

+1は、ループ本体を関数呼び出しに入れるだけです。コメントに埋め込まれているので、あなたの答えに追加してください。 – Mysticial

+0

@神秘:完了。今は十分なはずです。編集する必要があると思われる場合は自由に編集してください;) – LihO

関連する問題