キャッシュの「データ」部分をカバーするものが見つからないため、少し行き詰まっています。グーグルで調べたものはすべて、キャッシュのアドレス指定で 99.9% を処理します。私が尋ねられた質問はそのように表現されています
「データ ビット」容量と「オーバーヘッド ビット」サイズの違いを比較する 2 つのキャッシュの場合。
私は答えが欲しくないので、実際のセットサイズを投稿するつもりはありません. どんな助けでも大歓迎です!
キャッシュの「データ」部分をカバーするものが見つからないため、少し行き詰まっています。グーグルで調べたものはすべて、キャッシュのアドレス指定で 99.9% を処理します。私が尋ねられた質問はそのように表現されています
「データ ビット」容量と「オーバーヘッド ビット」サイズの違いを比較する 2 つのキャッシュの場合。
私は答えが欲しくないので、実際のセットサイズを投稿するつもりはありません. どんな助けでも大歓迎です!
この質問に十分なコンテキストを提供してくれたかどうかはわかりませんが、ここで説明します。
キャッシュには、実際にキャッシュされたデータだけでなく、すべてのデータについて、それが参照する「インデックス」も格納する必要があります。したがって、レコードNを検索する場合、実際にデータを検索できるように、キャッシュはレコードNの値だけでなくNも保持する必要があります。そして、それはそれを見るのにかなり単純な方法です。キャッシュには、有効性や最終アクセス時間などを示す他のメタデータが含まれる場合があります。
例1:32ビットアドレス空間のバイトのキャッシュ
各キャッシュエントリは、データ値(8ビット)とアドレス(32ビット)=40ビットを格納する必要があります。
例2:32ビットアドレス空間内の32ビットワードのキャッシュ
各キャッシュエントリは、データ値(32ビット)とアドレス(32ビット)=64ビットを格納する必要があります。
例1のオーバーヘッドが大幅に高いことがわかります。
いつものように、ウィキペディアが役立つかもしれません。http://en.wikipedia.org/wiki/Cache_(computing)
キャッシュは通常、データ配列のような SRAM にデータを格納しますが、オーバーヘッドもあります。私は「データ ビット サイズ」と「オーバーヘッド ビット サイズ」という用語が特に好きではありません。なぜなら、(a) ストレージ ビット セルではないオーバーヘッドがあり、(b) すべてのビット セルが同じようにコストがかかるわけではないからです。しかし、今はそれらの条件に沿って進めましょう。
私の見解では、「オーバーヘッド ビット サイズ」はおそらく、キャッシュにアクセスするために格納する必要があるタグ ビットの数を指しています。多くの場合、これらは別の配列 (データ配列とは別のタグ配列) に格納されます。データ ビット数と比較します。
以下に 3 つの簡単な例を示します。
32 KiB (キロバイト) のキャッシュと 64 B (バイト) のキャッシュ ラインがあるとします。通常、アドレスのビット 0 ~ 5 をキャッシュ ライン オフセットにします。
32 KiB / (64 B/ライン) => 2^(5+10) / 2^6 => 2^9 => 512 キャッシュ ライン。
---++ 例 1: ダイレクト マップ
直接マップされたキャッシュであると想像してみましょう。次に、次の 9 ビット (アドレスのビット 6 ~ 14) を、キャッシュ ラインの配列への "インデックス" として取得します。
ここまでは順調ですね。ここで、タグを把握するには、アドレス全体の幅を知る必要があります。64ビットだとしましょう(ただし、ほとんどの「64ビット」マシンは2012年現在、40ビットまたは48ビットしか実装していません)。キャッシュ内の同じエントリにマップされる他のキャッシュ ラインとキャッシュ ラインを区別するために、アドレスの残りのビット、ビット 15 ~ 63、49 ビットをタグとして格納する必要があります。
このような直接マップされたキャッシュへのアクセスは、インデックスを抽出し、そのインデックスを使用してタグとデータを読み取り、読み取ったタグを検索しているアドレスのタグと比較し、一致する場合はヒットを宣言し、ミスを宣言します。そうでない場合など。
オーバーヘッド: 64B (512 ビット) のデータごとに 49 ビットのタグ。
合計: * タグまたは「オーバーヘッド」: 512 * 49 ビット * データ ビット: 512*512 = 32KiB = 256 Kib (キビ ビット)。
---++ 例 2: 8 ウェイ セット アソシアティブ
ここで、キャッシュが 8 ウェイ アソシアティブであると想像してみましょう。これは、512 回線が 512/8 = 64 セットに分割され、それぞれが 8 回線を含むことを意味します。
キャッシュ ライン内のオフセットは、依然としてビット 0 ~ 5 です。
ただし、セット数を決定するためにインデックスとして 6 ビットしか必要ありません。ビット 6 ~ 11。
タグは、残りのすべてのビット、ビット 12 ~ 63、合計 52 ビットである必要があります。
したがって、8 方向連想キャッシュのタグ オーバーヘッドは、512 ビットのデータに対して 52 ビットのタグです。
合計: * タグ: 512 * 52 ビット * データ: 512 Kib
ダイレクト マップの 49 ビットのタグと比較してください。8ウェイセットアソシアティブは、基本的にlog2(8)ビットをタグに移動します。一般に、N ウェイ セット アソシアティブは ceil(log2(N)) ビットをタグに移動します。
---++ 例 3: 完全連想
これは、直接マッピングから遠ざかるスペクトルです。キャッシュ ラインごとに 512 ビットのデータがまだありますが、6 ビット オフセットを除く 64 ビット アドレス全体がタグです。完全連想の場合は 58 ビットのタグ、8 ウェイの場合は 52 ビット、ダイレクト マップの場合は 49 ビット。
しかし、「オーバーヘッド ビット」という用語が嫌いだと言ったことを覚えていますか? 完全連想キャッシュのタグ ビットは通常、通常のストレージ ビットだけでなく、コンパレータ (基本的には XOR ゲート) も持つ必要があります。このような「CAM (Content Addressable Memory)」ビットは通常、通常のビットよりも高価です。
---+ 結論
つまり、データ ビットとタグ ビットの単純な比較です。これはオーバーヘッドの下限です。
N ウェイ セット アソシアティブを介したダイレクト マップから完全アソシアティブまでのスペクトルは、例を示しています。しかし、オーバーヘッドに影響を与えるキャッシュ設計の側面は他にもあります。例えば:
異なるアドレス サイズを使用すると、パーセンテージ オーバーヘッドが変化します。たとえば、32 ビット アドレスは、diredt マップの例では 17 ビットのタグしか持たないのに対し、64 ビット アドレスでは 49 ビットになります。
キャッシュ インデックス機能を変更すると、タグ サイズの変更が必要になる場合があります。たとえば、sdirect マップ キャッシュの場合は 512 ではなく 511 など、素数のキャッシュ ラインまたはキャッシュ セットを持つことにはいくつかの利点があります。このような素数は、共鳴の問題を減らしました。ただし、簡単に行うと、タグ幅を全幅の 58 ビットに増やす必要があります。
セクター化されたキャッシュのような方式では、タグ ビットの一部を共有できます。
等々。
チュートリアル Web サイトについては、次のとおりです。
申し訳ありませんが、私はそのような初心者向けのものを知りません。しかし、私は多くの大学の授業ノートをグーグルで検索します。
私のウェブサイトhttp://comp-arch.netでは、コンピューター アーキテクチャの高度なトピックを扱っています。しかし、この種のものはあまりにも基本的で初歩的すぎるため、私が comp.arch に載せることはできません。高度なトピックに移る前に、基本の簡単な説明を書き留めておく必要があると思いますが。ときどき、こちらのようなチュートリアルを書いていますが、収集していません。
USEnet ニュースグループ comp.arch が役に立つかもしれません。
---+ stackoverflow のプログラマーにとって、これが問題になるのはなぜですか?
これは主にハードウェアのトピックです。
しかし、コードをチューニングするプログラマーは、最高のパフォーマンスを得るために、このようなことを理解する必要があります。
コンピュータアーキテクチャとCにタグを付けたので、これはCまたはそのようなものでキャッシュ「シミュレータ」を作成するように求められるタスクだと思います。また、質問の「2つのキャッシュ」は、2つの異なるタイプのキャッシング(完全に関連付けられた、n-way、直接マップされた..)を指します。その範囲では、2種類のキャッシュの違いと、主に「オーバーヘッドビット」サイズの比率について説明する必要があります。これは、キャッシュがキャッシュエントリ(有効ビット、オフセット、タグ)に必要な情報です。キャッシュラインに格納されている実際のデータである「データビット」。これがお役に立てば幸いです。