26

CPUキャッシュがどのように動作しているかを理解しようとしています。この構成があるとしましょう (例として)。

  • キャッシュサイズ 1024 バイト
  • キャッシュライン 32 バイト
  • 1024/32 = 32 キャッシュ ラインがすべて一緒になります。
  • Singel キャッシュ ラインは 32/4 = 8 int を格納できます。

1) これらの構成によれば、タグの長さは 32-5=27 ビット、インデックスのサイズは 5 ビット (キャッシュ ラインの各バイトに対して 2^5 = 32 アドレス) である必要があります。

合計キャッシュ サイズが 1024 で、キャッシュ ラインが 32 ある場合、タグとインデックスはどこに保存されますか? (他に 4*32 = 128 バイトあります。) キャッシュの実際のサイズは 1024+128 = 1152 ということですか?

2) この例でキャッシュ ラインが 32 バイトの場合、これは、CPU が RAM から新しいバイトを取得する必要があるたびに、32 バイトがキャッシュにコピーされることを意味します。要求されたバイトのキャッシュ ラインの位置がそのアドレスによって決定されると仮定するのは正しいですか?

つまり、CPU が でバイトを要求した場合、利用可能なキャッシュ ラインは からまで[FF FF 00 08]のバイトで満たされます。そして、要求された 1 バイトは position になります。[FF FF 00 00][FF FF 00 1F][08]

3) 前のステートメントが正しい場合、32 バイトすべてがとにかくキャッシュ ラインにあるため、インデックスに使用される 5 ビットは技術的に必要ないということですか?

何か問題がありましたらお知らせください。ありがとう

4

3 に答える 3

17

キャッシュは、データとタグ RAM で構成され、アクセス時間と効率および物理レイアウトの妥協点として配置されます。ウェイ数 (セット数) という重要な統計が欠落しています。単純なパターンでは異常にパフォーマンスが悪いため、一方向キャッシュはめったにありません。ともかく:

1) はい、タグには余分なスペースが必要です。これは設計上の妥協点の一部です。総面積の大部分を占めたくないので、行サイズが 1 バイトまたは 1 ワードにならない理由です。また、インデックスのすべてのタグが同時にアクセスされるため、多数のウェイがある場合、効率とレイアウトに影響を与える可能性があります。サイズはあなたの見積もりより少し大きいです。通常、有効性をマークするための余分なビットがいくつかあり、場合によってはヒントもあります。より多くのウェイとより小さな行では、タグが占める割合が大きくなる必要があるため、通常、行は大きく (32 バイト以上)、ウェイは小さく (4 ~ 16 バイト) なります。

2) はい。一部のキャッシュでは、「クリティカル ワードを最初に」フェッチすることもできます。この場合、ライン フィルの原因となったワードから開始し、残りをフェッチします。これにより、CPU が実際に要求したデータを待機するサイクル数が減少します。一部のキャッシュは「ライト スルー」し、書き込みに失敗した場合はラインを割り当てません。これにより、キャッシュ ラインに書き込む前に最初にキャッシュ ライン全体を読み取る必要がなくなります (これは常に成功するとは限りません)。

3) 下位 5 ビットはキャッシュ ラインに一致させる必要がないため、タグには格納されません。個々の行にインデックスを付けるだけです。

ウィキペディアには、キャッシュに関するかなり良い記事がありますが、キャッシュについてはかなり詳しく書かれています: http://en.wikipedia.org/wiki/CPU_cache - 「実装」を参照してください。データとタグがどのように分割されるかを示す図があります。私は、基礎となるマシンが実際に何ができるかを知っていれば、コードのパフォーマンスを本当に改善できるので、誰もがこのことを学ぶべきだと思います.

于 2011-02-15T18:05:25.207 に答える
3
  1. キャッシュ メタデータは通常、キャッシュ自体の一部としてカウントされません。CPU の同じ部分に格納されていない場合もあります (別のキャッシュに格納されている場合や、特別な CPU レジスタを使用して実装されている場合など)。
  2. これは、CPU がアラインされていないアドレスをフェッチするかどうかによって異なります。アラインされたアドレスのみをフェッチする場合、あなたが示した例は正しいでしょう。CPU がアラインされていないアドレスをフェッチする場合、0xFFFF0008 から 0xFFFF0027 の範囲をフェッチする可能性があります。
  3. キャッシュ アクセスが整列されている場合でも、インデックス バイトは依然として有用です。これにより、CPU は内部のブックキーピングで使用できるキャッシュ ライン内のバイトを簡単に参照できます。キャッシュ ラインに関連付けられたアドレスとバイトに関連付けられたアドレスを知ることで同じ情報を取得できますが、持ち運ぶにはさらに多くの情報が必要です。

CPU が異なれば、キャッシングの実装も大きく異なります。あなたの質問に対する最良の回答を得るために、あなたが話している特定の CPU (タイプ、モデルなど) に関する追加の詳細を教えてください。

于 2011-02-15T18:05:46.467 に答える
3

これは私の漠然とした記憶に基づいています。Hennessey と Patterson による「Computer Architecture: A Quantitative Approach」などの本を読んでください。素晴らしい本。

32ビットCPUを仮定すると...(そうでなければ、数字は4バイト以上を使用する必要があります(一部/ほとんどの64ビットCPUではアドレス行の64ビットすべてが使用されていないため、おそらく8バイト未満))。

1) 少なくとも 4*32 バイトだと思います。CPU によっては、チップ アーキテクトが完全なアドレス以外の情報を追跡することを決定している場合があります。ただし、通常はキャッシュの一部とは見なされません。

2) はい。ただし、マッピングの方法が異なります。ウィキペディアを参照してください- CPU キャッシュ - 連想性単純なダイレクト マップ キャッシュと、より複雑な連想マップ キャッシュがあります。一部のコードで 2 つの情報が必要であるにもかかわらず、2 つのアドレスがまったく同じキャッシュ ラインにマップされるというケースは避けたいと考えています。

于 2011-02-15T18:05:51.487 に答える