11

ダイレクト マップとセット アソシエイティブ キャッシュの概念を学び始めたところです。非常に初歩的な疑問がいくつかあります。ここに行きます。

アドレスの長さが 32 ビットで、64 バイトのブロック サイズと 512 フレームの 32 KB のキャッシュがあるとすると、「ブロック」内に実際に格納されるデータの量は? メモリ ロケーションの値からロードする命令があり、その値が 16 ビット整数である場合、64 バイト ブロックの 1 つが 16 ビット (2 バイト) 整数値のみを格納するようになりました。ブロック内の他の 62 バイトは? 16ビット整数値もロードする別のロード命令がある場合、この値はロードアドレスに応じて別のフレームの別のブロックに入ります(アドレスが前の命令の同じフレームにマップされている場合、前の値は削除されます)ブロックは再び 64 バイトで 2 バイトのみを格納します)。正しい?

これが非常にばかげた疑いのように思われる場合は、ご容赦ください。私の概念を正しく理解したいだけです。

4

2 に答える 2

33

誰かがキャッシュについて説明するためにこのメールを打ちましたが、あなたにも役立つと思います。

RAM 内のバイトを参照できる 32 ビット アドレスがあります。後で使用するために、アクセスするデータをキャッシュできるようにする必要があります。

1 MiB (2 20バイト) のキャッシュが必要だとしましょう。

職業はなんですか?

満たす必要がある 2 つの制限があります。

  1. キャッシングは、すべてのアドレスで可能な限り均一にする必要があります。つまり、特定の種類のアドレスに偏りたくないということです。
    • これどうやってやるの?残りを使おう!mod を使用すると、任意の整数を任意の範囲に均等に分散できます。
  2. 簿記のコストを最小限に抑えたい。つまり、たとえば、1 バイトのブロックでキャッシュしている場合、1 バイトがどこに属しているかを追跡するためだけに 4 バイトのデータを格納したくないということです。
    • どうやってそれをしますか?1 バイトより大きいブロックを格納します。

16 バイト (2 4バイト) のブロックを選択するとします。つまり、2 20 / 2 4 = 2 16 = 65,536 ブロックのデータをキャッシュできるということです。

いくつかのオプションがあります:

  • 任意のメモリ ブロックのデータを任意のキャッシュ ブロックに格納できるように、キャッシュを設計できます。これは、完全連想キャッシュと呼ばれます。
  • 利点は、これが「最も公正な」種類のキャッシュであることです。すべてのブロックが完全に同等に扱われます。
  • トレードオフは速度です。メモリ ブロックを配置する場所を見つけるには、すべてのキャッシュ ブロックを検索して空き領域を探す必要があります。これは本当に遅いです。
  • 任意のメモリ ブロックからのデータを1 つのキャッシュ ブロックにのみ格納できるように、キャッシュを設計できます。これは、ダイレクト マップ キャッシュと呼ばれます。
  • 利点は、これが最速の種類のキャッシュであることです。項目がキャッシュにあるかどうかを確認するために 1 回のチェックのみを行います。
  • トレードオフは、メモリ アクセス パターンが不適切な場合、2 つのブロックが連続して追い出され、未使用のブロックがキャッシュに残っている可能性があることです。
  • 両方を組み合わせて実行できます。単一のメモリ ブロックを複数のブロックにマップします。これは、実際のプロセッサが行うことです。プロセッサには、N ウェイのセット連想キャッシュがあります。

直接マップされたキャッシュ:

これで、65,536 ブロックのデータがあり、各ブロックは 16 バイトです。
キャッシュ内に 65,536 の「行」として保存し、各「行」はデータ自体とメタデータ (ブロックが属する場所、有効かどうか、書き込まれたかどうかなど) で構成されます。

質問: メモリ内の各ブロックは、キャッシュ内の各ブロックにどのようにマップされますか?

回答: ええと、mod を使用して直接マップされたキャッシュを使用しています。つまり、アドレス 0 ~ 15 がキャッシュ内のブロック 0 にマップされます。16-31 はブロック 2 などにマップされ、1-MiB マークに到達するとラップアラウンドします。

では、メモリ アドレス M が与えられた場合、行番号 N をどのように見つけますか? 簡単: N = M % 2 20 / 2 4 .
しかし、これはデータをどこに保存するかを示すだけで、データを取得する方法は示しません。一度保存して再度アクセスしようとすると、メモリのどの1 MB の部分がここに保存されたかを知る必要がありますよね?

つまり、これがメタデータの 1 つです。つまり、タグ ビットです。行 N にある場合、知っておく必要があるのは、mod 操作中に商が何であったかだけです。32ビットアドレスの場合、これは12ビットです(残りは20ビットであるため)。

したがって、タグは 12 ビット長になります。具体的には、任意のメモリ アドレスの最上位12 ビットです。また、下位 4 ビットがブロック内
のオフセットに使用されることは既にご存じでした(メモリはバイト アドレス指定され、ブロックは 16 バイトであるため)。 これにより、メモリアドレスの「インデックス」ビット用に16ビットが残り、アドレスが属する行を見つけるために使用できます。(ただの除算+剰余演算ですが、2進数です。)

また、他のビットも必要です。たとえば、ブロックが実際に有効かどうかを知る必要があります。これは、CPU の電源が入っているときに無効なデータが含まれているためです。したがって、メタデータの 1 ビット、つまり Valid ビットを追加します。

最適化、同期などに使用される、他にも学習するビットがありますが、これらは基本的なものです。:)

于 2011-11-12T23:13:58.963 に答える
7

タグ、インデックス、およびオフセットの基本を知っていることを前提としていますが、コンピューター アーキテクチャのクラスで学んだ簡単な説明を次に示します。ブロックは 64 バイト ブロックで置き換えられるため、新しいブロックがキャッシュに入れられるたびに、必要なバイトが 1 バイトだけかどうかに関係なく、64 バイトすべてが置き換えられます。そのため、キャッシュをアドレス指定するときに、ブロックから取得するバイトを指定するオフセットがあります。例を挙げると、16ビット整数のみがロードされている場合、キャッシュはインデックスでブロックを検索し、タグをチェックして正しいデータであることを確認し、オフセットに従ってバイトを取得します。別の 16 ビット値をロードすると、たとえば同じインデックスで異なるタグを使用すると、64 バイト ブロックが新しいブロックに置き換えられ、指定されたオフセットから情報が取得されます。(ダイレクト マップを想定)

これが役立つことを願っています!さらに詳しい情報が必要な場合、またはこれがまだ曖昧な場合は、私に知らせてください。

于 2011-11-12T23:06:22.397 に答える