0
"シリアル" counter
の問題を含むこの4つのネストされたループを並列化しようとしています。ループ内でシリアル化されたカウンタ変数を並列化する最良の方法
count = 0
for (i = 0; i < vel; i++)
for (n = 0; n < dist; n++)
for (j = 1; j <= Y; j++)
for (k = 1; k <= Z; k++) {
index = index(X, j, k);
buffX[count] = array[index];
index = index(Y, j, k);
buffY[count] = array[index];
++count;
}
私は、次のような非常に単純なアイデア試してみた:
#pragma omp parallel for private(i,n,j,k,index) shared(count)
for (i = 0; i < vel; i++)
for (n = 0; n < dist; n++)
for (j = 1; j <= Y; j++)
#pragma omp critical
{
for (k = 1; k <= Z; k++) {
index = index(X, j, k);
buffX[count] = array[index];
index = index(Y, j, k);
buffY[count] = array[index];
++count;
}
}
をしかし、それは理由count
では動作しません。私はこの種のループを並列化するためのよく知られた技術があるのだろうかと思っていました。
@_Zulanはい、うまくいきます!私は崩壊したループでキャッシュ・エフェクトがどのように悪くなるのを避けることができるのだろうか – Manolete