ダイレクトマップおよびセットアソシアティブキャッシュの概念を学び始めたばかりです。私はいくつかの非常に基本的な疑問を持っています。ここに行きます。
アドレスが32ビット長で、64バイトのブロックサイズと512フレームの32KBキャッシュがあるとすると、実際には「ブロック」内にどのくらいのデータが格納されますか?メモリ位置の値からロードする命令があり、その値が16ビット整数の場合、64バイトブロックの1つに16ビット(2バイト)整数値のみが格納されるようになりました。ブロック内の他の62バイトはどうですか? 16ビット整数値もロードする別のロード命令がある場合、この値はロードアドレスに応じて別のフレームの別のブロックに移動します(アドレスが前の命令の同じフレームにマップされている場合、前の値は削除されますまた、ブロックは64バイトで2バイトのみを格納します)。正しい?
これが非常に愚かな疑いのように思われる場合は、私を許してください。それは、私の概念を正しく理解したいということだけです。
キャッシュについて説明するためにこのメールを入力しましたが、あなたにも役立つと思います。
RAM内のバイトを参照できる32ビットアドレスがあります。アクセスしたデータをキャッシュして、後で使用できるようにする必要があります。
1-MiB(220 バイト)キャッシュ。
職業はなんですか?
満たす必要のある2つの制限があります。
- キャッシングは、すべてのアドレスで可能な限りUniformにする必要があります。つまり、特定の種類のアドレスに偏りたくない。
- これはどうやるんですか?残りを使用してください! modを使用すると、any整数を任意の範囲に均等に分散できます。
- 最小化簿記費用を支援したい。つまり、たとえば1バイトのブロックでキャッシュしている場合、1バイトがどこに属するかを追跡するためだけに4バイトのデータを格納する必要はありません。
- どうやってそれをしますか? 1バイトよりも大きいブロックを格納します。
16バイト(2)を選択したとしましょう4-バイト)ブロック。つまり、2をキャッシュできます20/24 = 216 = 65,536ブロックのデータ。
現在、いくつかのオプションがあります。
- 任意のメモリブロックからのデータをキャッシュブロックのanyに格納できるようにキャッシュを設計できます。これは、完全に関連付けられたキャッシュと呼ばれます。
- 利点は、それが「最も公平な」種類のキャッシュであるということです。すべてのブロックが完全に同等に扱われます。
- トレードオフは速度です。メモリブロックを配置する場所を見つけるには、everyキャッシュブロックで空き領域を検索する必要があります。これは本当に遅いです。
- 任意のメモリブロックからのデータがonlyがsingleキャッシュブロックに格納されるようにキャッシュを設計できます。これは、直接マップされたキャッシュと呼ばれます。
- 利点は、これが最速の種類のキャッシュであるということです。アイテムがキャッシュにあるかどうかを確認するために1回のチェックを行うだけです。
- トレードオフは、メモリアクセスパターンが悪い場合に、2つのブロックを連続してキックアウトし、未使用のブロックをキャッシュに残しておくことができることです。
- 両方を組み合わせて実行できます。1つのメモリブロックを複数のブロックにマップします。これは実際のプロセッサが行うことです-彼らはN-wayセットの連想キャッシュを持っています。
直接マップされたキャッシュ:
これで、65,536ブロックのデータがあり、各ブロックは16バイトです。
キャッシュ内に65,536の「行」として保存します。各「行」は、データ自体とメタデータ(ブロックが属する場所、有効かどうか、書き込まれたかどうかなど)で構成されます。 。)。質問:メモリ内の各ブロックはどのようにしてキャッシュ内の各ブロックにマップされますか?
回答:そうですね、modを使用して直接マップされたキャッシュを使用しています。つまり、アドレス0〜15は、キャッシュ内のブロック0にマップされます。 16-31はブロック2などにマップされ、1-MiBマークに到達するとラップアラウンドします。
では、メモリアドレスMが与えられた場合、行番号Nをどのように見つけますか?簡単:N = M%220/24。
ただし、これはstoreデータの場所のみを示し、retrieveデータの場所は示しません。保存してからもう一度アクセスしようとすると、which1MBのメモリがここに保存されていることを知っておく必要があります。これがメタデータの1つ、タグビットです。行Nにある場合、知る必要があるのは、モジュロ演算中にquotientが何であったかだけです。これは、32ビットアドレスの場合、12ビットの大きさです(残りは20ビットであるため)。
したがって、タグの長さは12ビットになります。具体的には、任意のメモリアドレスのtopmost12ビットです。
そして、最下位4ビットがオフセットwithinブロックに使用されることをすでに知っていました(メモリはバイトアドレスであり、ブロックは16バイトであるため) )。
これにより、メモリアドレスの「インデックス」ビット用に16ビットが残ります。これを使用して、アドレスが属するwhich行を見つけることができます。 (これは除算+剰余演算ですが、バイナリです。)他のビットも必要です:例: CPUがオンになると、ブロックに無効なデータが含まれるため、ブロックが実際に有効かどうかを知る必要があります。したがって、1ビットのメタデータ(有効ビット)を追加します。
最適化、同期などに使用される、学習する他のビットがありますが、これらは基本的なものです。 :)
タグ、インデックス、オフセットの基本を知っていると思いますが、コンピュータアーキテクチャのクラスで学んだ簡単な説明を次に示します。ブロックは64バイトのブロックに置き換えられるため、新しいブロックがキャッシュに入れられるたびに、必要なのが1バイトであるかどうかに関係なく、すべての64バイトが置き換えられます。そのため、キャッシュをアドレス指定するときに、ブロックから取得するバイトを指定するオフセットがあります。たとえば、16ビット整数のみがロードされている場合、キャッシュはインデックスによってブロックを検索し、タグをチェックして正しいデータであることを確認してから、オフセットに従ってバイトを取得します。ここで、別の16ビット値をロードすると、たとえば同じインデックスで異なるタグを使用すると、64バイトのブロックが新しいブロックに置き換えられ、指定されたオフセットから情報が取得されます。 (直接マッピングされていると仮定)
これがお役に立てば幸いです。あなたがより多くの情報を必要とするか、これがまだ曖昧であるならば、私に知らせてください、私はこれを教えるのに良い仕事をするいくつかの良いサイトを知っています。