1

並列ループのローカル値とグローバル変数の更新に関して質問があります。

疑似コードの例: 非常に長いベクトルの最大値を検索しています。次のように、ループで実行できます。

int max;
for(i ...) {
    if (max < vector[i]) max = vector[i];
}

OpenMP で簡単に並列化できます。

int max;
#pragma omp parallel
{
    int local_max;
#pragma omp parallel for
    for(i ...) {
        if (local_max < vector[i]) local_max = vector[i];
    }

#pragma omp critical
    {   
        // choose the best solution from all
        if (max < local_max) max = local_max; local_max
    }
}

TBB で同じことを行うにはどうすればよいparallel_forですか? 正確なコードは要求しません。反復ごとではなく、ループの最後にグローバル結果を更新する方法を知りたいだけです...

(TBB初心者です)

4

1 に答える 1

2

この例で行うことはリダクションと呼ばれるので、 を使用しますparallel_reduce。ロック下でグローバル変数を更新するよりも効率的です。基本的な考え方は、local_maxは の body クラスのメンバー変数でありparallel_reduce、そのjoin()メソッドは body の別のインスタンスを受け取りlocal_max、現在の値と他のインスタンスの値のうち大きい方に更新されます。次に、parallel_reduce を呼び出した後、local_max元の body オブジェクトから値を取得し、それをグローバル変数に割り当てます。

于 2011-11-09T15:40:23.077 に答える