2012-03-28 27 views
0

これは宿題に関する質問で、私は答えを求めていません。私はちょうどこの質問を理解したいと思う、他の例を説明するために自由に感じる。ブロックを使用したダイレクトマップキャッシュ

私は答える必要がある質問...

Each reference is a read of a 4-byte integer value and is described by the byte 
address of that integer. 

Assuming a 1KB, 16B block, direct-mapped cache, initially empty, fill in whether 
each reference is a hit or a miss. 

は、我々は4バイトである参照のリストを与えられています。例えば0x00000000、0x00000006、...

私の理解から、64ブロック(1024/16)があり、各ブロックは16バイトです。最初の参照を見ると、それは欠場となり、キャッシュにそれが持ち込まれます。各ブロックは16バイトを保持するので、キャッシュへの次の参照を持ち込むことはわかっています。これは、それぞれの参照が4バイトであるため、4つの参照をもたらすという意味ですか?

答えて

1

はいわかっていることは正しいです。バイトがメモリから読み出されるとき、時間的局所性は、次の数バイトも引き続き読み取られることを示唆する。したがって、キャッシュは通常1つ以上の参照、この場合は4つの参照のブロックサイズを持ちます。次のメモリアクセス中に、プロセッサが次の参照を要求した場合、キャッシュにすでに存在しています。

メモリアドレスは、ブロックアドレスとブロックオフセットの2つの部分に分割できます。ブロックオフセットは、キャッシュの同じブロックにあるこれらの参照の中から選択するために使用されます。他の部分であるブロックアドレスは、タグフィールドとインデックスフィールドにさらに分割されます。インデックスフィールドは、アクセスするセットを選択するために使用されます(ダイレクトマップキャッシュの場合、各キャッシュブロックは1セットです)。タグフィールドは、セット内からキャッシュブロックを選択します。

1

@shaileshは正しいですが、の参照に注意してください。 参照パターンはプログラムによって異なります。 16Byteのストライドでchar配列を参照するCプログラムを書く場合を想像してみてください。 x

void foo (char * x, int MAX) { 
    int i; 
    char a; 

    for (i = 0; i < MAX; i += 16) 
      a = x[i]; 
} 

と仮定アドレス0x00000000である:ここでは基本的に行いますダムルーチンです。このループは、アドレス 0x00000000,0x00000010,0x00000020,0x00000030などを参照します。この場合、最初にx[0]を参照した後、ブロックサイズが16Bであるため、x[0]x[15]がキャッシュに持ち込まれます。しかし、次の参照は、x[16]であり、ではありません。言い換えれば、ここであなたのキャッシュのために、このループのすべてのの参照は、キャッシュミスになります。

パフォーマンスを最適化するときに、マシンのキャッシュ構成と動作を考えれば、このようなメモリアクセスパターンが悪化するのを防ぐことができます。

関連する問題