web-dev-qa-db-ja.com

CPUキャッシュとキャッシュラインを理解する

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

  • キャッシュサイズ1024バイト
  • キャッシュライン32バイト
  • 1024/32 = 32のキャッシュラインをまとめて。
  • Singelキャッシュラインは32/4 = 8intを格納できます。

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]でバイトを要求した場合、利用可能なキャッシュラインは[FF FF 00 00]から[FF FF 00 1F]までのバイトで満たされます。そして、必要な1バイトは[08]の位置になります。

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

何か問題があった場合はお知らせください。ありがとう

24
kirbo

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

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

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

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

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

17
John Ripley
  1. キャッシュメタデータは通常、キャッシュ自体の一部としてカウントされません。 CPUの同じ部分に格納されていない場合もあります(別のキャッシュに格納されているか、特別なCPUレジスタを使用して実装されている可能性があります)。
  2. これは、CPUがアラインされていないアドレスをフェッチするかどうかによって異なります。整列されたアドレスのみをフェッチする場合は、指定した例が正しいでしょう。 CPUがアラインされていないアドレスをフェッチする場合、0xFFFF0008から0xFFFF0027の範囲をフェッチする可能性があります。
  3. キャッシュアクセスが調整されている場合でも、インデックスバイトは引き続き役立ちます。これにより、CPUは、内部の簿記で使用できるキャッシュライン内のバイトを参照するための簡単な方法を得ることができます。キャッシュラインに関連付けられているアドレスとバイトに関連付けられているアドレスを知ることで同じ情報を取得できますが、それは持ち運びに必要な情報がはるかに多くなります。

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

3
bta

これは私の漠然とした記憶に基づいています。HennesseyとPattersonによる「ComputerArchitecture:AQuantitativeApproach」のような本を読む必要があります。素晴らしい本。

32ビットCPUを想定しています...(そうでない場合は、64ビットCPUの一部/ほとんどで64ビットのアドレスラインがすべて使用されていないため、8バイト未満である可能性があります)。

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

2)はい。ただし、そのマッピングの方法は異なります。 Wikipedia-CPUキャッシュ-関連性 を参照してください。単純な直接マップされたキャッシュと、より複雑な関連性のあるマップされたキャッシュがあります。一部のコードで2つの情報が必要であるが、2つのアドレスがまったく同じキャッシュラインにマップされる場合は避けたいと考えています。

3
typo.pl