速度が重要なコードで、頻繁に一緒に使用される配列のペアがあり、正確なサイズは重要ではなく、適切なものに設定する必要があるとします。
int a[256], b[256];
下位アドレスビットが同じであると、キャッシュが両方のアレイを同時に処理するのが難しくなる可能性があるため、これは潜在的に悲観的ですか?たとえば、256ではなく300を指定する方がよいでしょうか。
速度が重要なコードで、頻繁に一緒に使用される配列のペアがあり、正確なサイズは重要ではなく、適切なものに設定する必要があるとします。
int a[256], b[256];
下位アドレスビットが同じであると、キャッシュが両方のアレイを同時に処理するのが難しくなる可能性があるため、これは潜在的に悲観的ですか?たとえば、256ではなく300を指定する方がよいでしょうか。
コメントを回答に移動する:
2 の累乗が問題になる可能性があると考えるのは正しいことです。ただし、これは通常、ストライドが 2 回を超える場合にのみ適用されます。L1キャッシュの連想性を超えるまでは、それほど悪くはなりません。しかし、その前に偽のエイリアシングの問題が発生する可能性があります。
2 のべき乗が実際に問題になる 2 つの例を次に示します。
最初の例では、4 つの配列があり、そのすべてが 4k ページの先頭から同じオフセットに配置されています。
2 番目の例では、サイズが 2 の累乗の場合、行列の列方向のホッピングによってパフォーマンスが完全に低下します。
いずれにせよ、重要な概念は、配列のサイズではなく、実際には配列の配置であることに注意してください。スローダウンが発生していることがわかった場合は、配列間にパディングを追加して、整列を解除してください。