0

私はこのようなループに取り組んでいます:

int arrA[BIG], arrB[BIG], arrC[BIG];

for(int = 0; i<BIG; i++){
      do_operation(arrA[i], arrB[i], arrC[i]);
}

これdo_operationは実際の関数ではありません。A、B、Cの間のいくつかの操作を意味します。プロファイリング データから、キャッシュの欠落率が高いようです。

より良いキャッシュ動作でループを書き直すにはどうすればよいですか?

コメントありがとうございます!

4

1 に答える 1

1

各配列に線形にアクセスしています。これは、基本的にキャッシュの使用 (およびハードウェア プリフェッチャー) に最適です。

ただし、配列のサイズが不適切な場合 (通常は 2 のべき乗)、スラッシングが発生します。arrA[i]arrB[i]およびarrC[i]すべてが同じキャッシュ ラインにマップされ、常に互いに追い出されます。基本的に、すべてのアクセスがキャッシュ ミスになります。これを避けるには、各配列を少しパディングしてみてください。

たとえば、「キャッシュのスラッシングについて」を参照してください。

于 2012-07-03T00:03:48.437 に答える