CPUキャッシュがどのように動作しているかを理解しようとしています。この構成があるとしましょう(例として)。
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ビットは技術的に不要であることを意味しますか?
何か問題があった場合はお知らせください。ありがとう
キャッシュはデータとタグRAMで構成され、アクセス時間と効率および物理レイアウトの妥協点として配置されます。重要な統計情報、つまりウェイ(セット)の数が不足しています。一方向キャッシュは、単純なパターンでは病理学的にパフォーマンスが悪いため、めったにありません。とにかく:
1)はい、タグは余分なスペースを取ります。これは設計上の妥協の一部です。総面積の大部分を占めたくないので、行サイズが1バイトまたは1ワードだけではないのはなぜですか。また、インデックスのすべてのタグに同時にアクセスするため、方法が多数ある場合は効率とレイアウトに影響を与える可能性があります。サイズはお見積もりより少し大きめです。通常、有効性を示すために数ビットの余分なビットがあり、場合によってはヒントもあります。より多くのウェイとより小さなラインはタグによって占められるより大きな部分を必要とするので、一般的にラインは大きく(32+バイト)そしてウェイは小さい(4-16)。
2)はい。一部のキャッシュは、「クリティカルワードファースト」フェッチも実行します。このフェッチでは、行がいっぱいになる原因となったワードから開始し、残りをフェッチします。これにより、CPUが実際に要求したデータを待機するサイクル数が減少します。一部のキャッシュは「ライトスルー」し、書き込みを逃した場合に行を割り当てないため、書き込み前にキャッシュ行全体を最初に読み取る必要がなくなります(これが常に成功するとは限りません)。
3)タグは、キャッシュラインと一致する必要がないため、下位5ビットを格納しません。それらは、個々の行にインデックスを付けるだけです。
ウィキペディアには、キャッシュに関する記述が少し強烈ですが、かなり良いものがあります。 http://en.wikipedia.org/wiki/CPU_cache -「実装」を参照してください。データとタグがどのように分割されるかを示す図があります。私は、基盤となるマシンが実際に何ができるかを知っていれば、コードのパフォーマンスを本当に向上させることができるので、誰もがこのことを学ぶべきだと思います。
CPUが異なれば、キャッシュの実装も大きく異なります。あなたの質問に対する最良の答えのために、あなたが話している特定のCPU(タイプ、モデルなど)についてのいくつかの追加の詳細を教えてください。
これは私の漠然とした記憶に基づいています。HennesseyとPattersonによる「ComputerArchitecture:AQuantitativeApproach」のような本を読む必要があります。素晴らしい本。
32ビットCPUを想定しています...(そうでない場合は、64ビットCPUの一部/ほとんどで64ビットのアドレスラインがすべて使用されていないため、8バイト未満である可能性があります)。
1)少なくとも4 * 32バイトだと思います。 CPUによっては、チップアーキテクトが完全なアドレス以外の他の情報を追跡することを決定した場合があります。ただし、通常はキャッシュの一部とは見なされません。
2)はい。ただし、そのマッピングの方法は異なります。 Wikipedia-CPUキャッシュ-関連性 を参照してください。単純な直接マップされたキャッシュと、より複雑な関連性のあるマップされたキャッシュがあります。一部のコードで2つの情報が必要であるが、2つのアドレスがまったく同じキャッシュラインにマップされる場合は避けたいと考えています。