1

float同じ長さの s の2 つの配列があるとしますn

float *a, *b;
int n;

スカラー積を計算したいと思います。単純な方法は次のようになります。

int i;
float result=0;
for (i=0;i<n;i++)
  result += a[i]*b[i];

しかし、データの局所性の観点からは、特にnが大きい場合aや、 とbがメモリ内で離れている場合は、これはひどいことです。a各反復で、とから値を交互にフェッチしますb。これをより効率的にする方法はありますか?

4

1 に答える 1

6

aとbの両方が同じキャッシュラインにマップされるほど運が悪ければ、プロセッサのフェッチパイプラインはほぼ常にいっぱいになります。データの非局所性とストライドは、より大きく、より正方形の配列では大きな問題になる可能性がありますが、ここでは、心配することはほとんどないと思います。

aとbの値をインターリーブすると、両方のfloatが64ビットマシンの1回のフェッチに収まるため、問題が解決する可能性があります(ただし、メモリアライメントの問題により、このアーキテクチャに依存します)。

于 2012-07-09T04:28:29.543 に答える