11

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 にプラグマがあることに気付きました。

しかし、私の問題を抱えている人をたくさん見てきましたが、一般的な解決策がないようです。最善の解決策は、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 ループ本体を別の関数に配置して、そのように呼び出す必要がありますか?

4

2 に答える 2

4

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

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

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

于 2013-03-19T17:37:59.820 に答える