2

教授からこの質問を受けましたが、なぜ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 つの要素しかアクセスされないため、 の方が空間的場所性が優れているためではないかと考えました。これが正しいかどうかはわかりませんし、これにキャッシュ ラインを取り込む方法もわかりません。

4

2 に答える 2