1. ホーム
  2. caching

[解決済み] キャッシュとキャッシュヒット/ミスについていくつか質問があります。

2022-02-17 02:49:30

質問内容

これは宿題の問題なのですが、宿題はすでに提出されていて、答えも与えられていたのですが、実際にどうやってこの答えを導き出したのかが全くわかりません。

キャッシュに関連するもので、いろいろな概念がごちゃごちゃになっているんです。

ここで質問です。

32ビットアドレスのダイレクトマップド・キャッシュ設計の場合、以下のビットは アドレスはキャッシュにアクセスするために使用されます。

私の理解では、インデックスビットは、メモリ内の特定の場所がキャッシュのどのブロックにマッピングされるかを決定します。アドレスの最下位 log(base2) ビットがキャッシュブロックを決定し、ここでは 5 つのインデックスビットがあるので、キャッシュには合計 2^5 ブロック、つまり 32 が存在することがわかります。

キャッシュブロックのサイズ(単位:ワード)は?

TAから渡されたメモによると、ブロックサイズは2^(オフセットビット数)で、この場合5となります。しかし、この場合、答えは32となり、どこからが8なのかがわかりません。さらに、この本のどこにも、オフセットビットという用語が定義されていないので、誰かこの意味を正確に教えてください。

**ここで私が考えているのは、同じメモリアドレスを2回参照することはないので、キャッシュ内に探しているデータがすでにあることはないため、ヒットはないはずだ、ということです。しかし、解答によると、ヒット率は0.25のはずなので、もう一度言いますが、私は何が起こっているのか理解していないようです。 最後に、最後の質問について、答えは次のように書いてあります。

<000001, 0001, mem[1024]>

<000001, 0011, mem[16]>

<001011, 0000, mem[176]>

<001000, 0010, mem[2176]>

<001110, 0000, mem[224]>

<001010, 0000, mem[160]>

これは、元の質問にさえなかったいくつかのメモリアドレス(176、2176)を含んでおり、この時点で私は完全にすべてを失っています。誰かこれらのことをクリアにするのを助けてくれますか?

解決方法は?

この例では、キャッシュ・ブロックのサイズは32です。 バイト つまり、バイト・アドレッシングが使用されており、4バイト・ワードの場合、8バイト・ワードとなります。 単語 .

ブロックのサイズは32バイトで、ブロック全体がキャッシュにロードされるため、インデックスを得るには、まずアドレスを32で割ってメモリ上のブロック番号を探します。ブロック番号の32乗(5ビットインデックス)がインデックスとなります。ブロック番号を32で割ったものがタグとなります。トレースは次のようになります。

   0  miss  <00000, 0000, mem[0..31]>
   4  hit   <00000, 0000, mem[0..31]>
  16  hit   <00000, 0000, mem[0..31]>
 132  miss  <00100, 0000, mem[128..159]>
 232  miss  <00111, 0000, mem[224..255]>
 160  miss  <00101, 0000, mem[160..191]>
1024  miss  <00000, 0001, mem[1024..1055]>
  30  miss  <00000, 0000, mem[0..31]>
 140  hit   <00100, 0000, mem[128..159]>
3100  miss  <00000, 0011, mem[3072..3103]>
 180  hit   <00101, 0000, mem[160..191]>
2180  miss  <00100, 0010, mem[2176..2207]>

見ての通り12アクセス中4回ヒットしているので、ヒット率は33%のはずです。(回答提供者は16アクセスと勘違いしていたようです)。

サイドコメント 空のキャッシュからスタートしているので、コンフリクトミスは1回(mem[30]のアクセス)だけで、残りの7回は強制(ファーストアクセス)ミスです。しかし、これがループの本体であった場合、最初の反復以降の各反復では、インデックス00000で4つの競合ミス(アドレス0、1024、30、3100)、00100で2つの競合ミス(アドレス132、2180)、6つのヒット(アドレス4、16、140は各反復でキャッシュブロックが再ロードされたヒットで競合ミスに対応、アドレス232、160、180は最初の反復でロードされて退避されていないヒット)であると思われます。

このトレースを実行すると、最後に以下のブロックが有効であることがわかります(そのインデックスに対して最後にアクセスされたもの)。

<00000, 0011, mem[3072..3103]>
<00100, 0010, mem[2176..2207]>
<00101, 0000, mem[160..191]>
<00111, 0000, mem[224..255]>

32 バイトのブロックでは、どのブロックも mem[16] から始まることはなく、1024 を 32 で割るとブロック番号(メモリ上)は 32 となり、32 のモジュロは 0(1ではない)なので、明らかに間違っている答えとなることに注意してください。

ちなみに、ブロックの開始アドレスを提供するよりも、ブロックにキャッシュされているバイトレンジを提供する方が、おそらく有用でしょう。