は、私は元のコードがあります。OpenMPの最小値の配列
min = INT_MAX;
for (i=0;i<N;i++)
if (A[i]<min)
min = A[i];
for (i=0;i<N;i++)
A[i]=A[i]-min;
を、私はこれの並列バージョンを取得したいと私はこれでした:
min = INT_MAX;
#pragma omp parallel private(i){
minl = INT_MAX;
#pragma omp for
for (i=0;i<N;i++)
if (A[i]<minl)
minl=A[i];
#pragma omp critical{
if (minl<min)
min=minl;
}
#pragma omp for
for (i=0;i<N;i++)
A[i]=A[i]-min;
}
は、並列コードの右か? #pragma omp barrierを#pragma omp criticalの前に書く必要があるのかどうか疑問に思っていたので、グローバル最小値を計算する前にすべての最小値が計算されていることを確認してください。
いいえ、正しくはありません。 criticalを使用することもできますが、この目的でOpenMP 4.0には#pragma omp for reduction(min:....)が追加されました。最新の実装を使用する十分な理由がほぼあります。 – tim18
そして、私はそれを減らさずにやりたいのであれば、私は何を変える必要がありますか? – Unknown
内部のsimd削減と外側の並列スレッドの削減を設定するかどうかは不安です(問題が十分に大きい場合は良い方法です)。シングルスレッドsimdの削減はおそらくN <80000程度で十分です。残念ながら、simdの削減のためのompは、すべてのコンパイラで同じように機能しません(Microsoftではまったくそうではありません)。 – tim18