本の「Using OpenMP」は、Cでの悪いメモリアクセスの例であり、ガウスアルゴリズムを並列化しようとする私の試みの主な問題だと思います。
例は次のようになります。
k= 0 ;
for( int j=0; j<n ; j++)
for(int i = 0; i<n; i++)
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
だから、なぜこれが悪いメモリアクセスを引き起こすのか理解しています。C では 2 次元配列は行ごとに格納され、ここでは i ステップごとに新しい行がメモリからキャッシュにコピーされます。
これに対する解決策を見つけようとしていますが、スピードアップがうまくいきません。私の試みの影響は軽微です。
誰かが私に何ができるかのヒントを教えてもらえますか?
最も簡単な方法は for ループを交換することですが、私は列ごとに行いたいと考えています。
2 回目の試行:
for( int j=0; j<n-1 ; j+=2)
for(int i = 0; i<n; i++)
{
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
a[i][j+1] = a[i][j+1] - a[i][k]*a[k][j+1] ;
}
まったく違いはありませんでした。
3 回目の試行:
for( int j=0; j<n ; j++)
{
d= a[k][j] ;
for(int i = 0; i<n; i++)
{
e = a[i][k] ;
a[i][j] = a[i][j] - e*d ;
}
}
ありがとう
ステップに挨拶