0

私はこの段落がある本を読んでいました:

C の配列は、メモリの連続したチャンクと見なすことができます。より正確には、配列の最後の次元は連続部分です。これを行優先順序と呼びます。これと、キャッシュされていないデータにアクセスするときにキャッシュ フォールトが完全なキャッシュ ラインをキャッシュにロードして、後続のキャッシュ フォールトを防ぐという事実を理解すると、array[0][0] を使用して次元 10000x10000 の配列にアクセスすると、array[ がロードされる可能性がある理由がわかります。 0][1] はキャッシュ内にありますが、直後に array[1][0] にアクセスすると、2 つ目のキャッシュ フォールトが生成されます。これは、array[0][0] から sizeof(type)*10000 バイト離れているためです。同じキャッシュライン上。これが、このような反復が非効率的な理由です。

#define ARRLEN 10000

int array[ARRLEN][ARRLEN];
size_t i, j;

for (i = 0; i < ARRLEN; ++i)
{
    for(j = 0; j < ARRLEN; ++j)
    {
        array[j][i] = 0;
    }
}

彼らがこの段落で何を説明しようとしているのか、彼らが話している「キャッシュ障害」とは何なのかを説明してもらえますか?

4

1 に答える 1

12

配列を本のページと考えてください。各ページが 1024 文字を保持する場合、として宣言された配列はa[100][1024]100 ページの本のようなものです。本はページごとに読んでいくとより効率的です。つまり、a[0][0]、a[0][1]、...、a[0][1023]、a[1][0] の順序で繰り返します。つまり、ページ全体を読んでからページをめくります。左端のインデックスを反復処理すると、各ページから 1 文字を読み、1 文字読んだらページをめくり、本の最後に到達したら 1 ページに戻って 2 番目の文字を読むようなものです。ページめくりはキャッシュフォールトです。

于 2021-01-03T13:36:57.203 に答える