教授からこの質問を受けましたが、なぜvector2
が より高速でキャッシュ ミスが少ないのかわかりませんvector1
。
以下のコードが有効なコンパイル可能な C コードであると仮定します。
ベクトル 2:
void incrementVector2(INT4* v, int n) {
for (int k = 0; k < 100; ++k) {
for (int i = 0; i < n; ++i) {
v[i] = v[i] + 1;
}
}
}
ベクトル 1:
void incrementVector1(INT4* v, int n) {
for (int i = 0; i < n; ++i) {
for (int k = 0; k < 100; ++k) {
v[i] = v[i] + 1;
}
}
}
注: INT4 は、整数のサイズが 4 バイトであることを意味します。
CPU スペックに関しては、キャッシュ サイズ = 12288KB、ライン サイズ = 64B で、メイン メモリとやり取りするこの単一のキャッシュのみを考慮しています。
質問
vector2
の実行時間が よりも速いのはなぜvector1
ですか? そして、なぜvector1
より多くのキャッシュ ミスが発生するのvector2
でしょうか?
私と数人のクラスメートはしばらくこれに取り組みましたが、理解できませんでした。vector2
配列は常に内側のループでアクセスされていたのに対し、vector1
では一度に 1 つの要素しかアクセスされないため、 の方が空間的場所性が優れているためではないかと考えました。これが正しいかどうかはわかりませんし、これにキャッシュ ラインを取り込む方法もわかりません。