このフォーラムの以前の 質問 から、ほとんどのメモリシステムで、L1キャッシュはL2キャッシュのサブセットであり、L2から削除されたエントリもL1から削除されることを学びました。
だから今私の質問は、L2キャッシュのエントリに対応するL1キャッシュのエントリをどのように決定するかです。 L2エントリに格納される情報は、タグ情報のみです。このタグ情報に基づいて、アドレスを再作成すると、L1キャッシュとL2キャッシュの行サイズが同じでない場合、L1キャッシュの複数の行にまたがることがあります。
アーキテクチャは両方のラインをフラッシュすることを本当に気にしますか、それとも同じラインサイズでL1とL2キャッシュを維持します。
これは政策決定であることを理解していますが、一般的に使用されている手法を知りたいと思います。
コアi7では、L1、L2、およびL3の行サイズは同じです。つまり、64バイトです。これにより、包括的プロパティと一貫性の維持が簡単になると思います。
28ページを参照してください: https://www.scss.tcd.ie/Jeremy.Jones/CS3021/5%20caches.pdf
Cache-Linesサイズは(通常)64バイトです。
さらに、プロセッサキャッシュに関するこの非常に興味深い記事をご覧ください。 Gallery of Processor Cache Effects
次の章があります。
厳密な包含キャッシュ階層でキャッシュブロックサイズを処理する最も一般的な手法は、包含プロパティが適用されるすべてのレベルのキャッシュに同じサイズのキャッシュブロックを使用することです。これにより、高レベルのキャッシュがより大きなブロックを使用する場合よりもタグのオーバーヘッドが大きくなります。これは、チップ領域を使用するだけでなく、高レベルのキャッシュが一般に段階的なアクセスを使用するため、レイテンシーを増加させることもあります(データ部分にアクセスする前にタグがチェックされます)ただし、設計を多少簡素化し、データの未使用部分からの無駄な容量を削減します。余分な32ビットタグの面積ペナルティを補うために、128バイトキャッシュブロック内の未使用の64バイトチャンクの大部分を必要としません。さらに、比較的単純なプリフェッチにより、より広い空間ローカリティを活用することでより大きなキャッシュブロック効果を実現できます。これには、近くのチャンクが読み込まれていない場合に容量が使用されないままになるという利点があります(メモリ帯域幅を節約するか、競合するメモリのレイテンシを減らすため)読み取り)および隣接プリフェッチは、より大きなアライメントされたチャンクに制限される必要はありません。
あまり一般的ではない手法では、キャッシュブロックをセクターに分割します。下位レベルのキャッシュのブロックサイズと同じセクターサイズを使用すると、上位レベルキャッシュの各セクターに独自の有効ビットがあるため、過剰な逆無効化の問題を回避できます。 (有効性だけでなく各セクターのすべてのコヒーレンス状態メタデータを提供することで、ブロック内の少なくとも1つのセクターがダーティ/変更されておらず、コヒーレンスオーバーヘッドがある場合(たとえば、1つのセクターが共有状態で、排他的状態では、排他的状態のセクターへの書き込みには、コヒーレンストラフィックが含まれない可能性があります(ディレクトリコヒーレンスではなくスヌーピーが使用される場合)。)
セクター化されたキャッシュブロックによる領域の節約は、タグがプロセッサチップ上にあり、データがチップ外にあった場合に特に顕著でした。明らかに、データストレージがプロセッサチップのサイズに匹敵する領域を使用する場合(これは不合理ではありません)、64バイトブロックの32ビットタグは、プロセッサ領域の約16分の1(〜6%)を占有しますが、バイトブロックは半分になります。 (2009年に導入されたIBMのPOWER6 +は、おそらくオンチップチップタグとオフプロセッサデータを使用する最新のプロセッサです。IBMが行ったように、高密度の組み込みDRAMおよび低密度SRAMにタグを保存すると、これを誇張します効果。)
Intelは、「キャッシュライン」を使用して小さいユニットを参照し、「キャッシュセクター」を大きいユニットに使用することに注意してください。 (これが、私が説明で「キャッシュブロック」を使用した理由の1つです。)Intelの用語を使用すると、レベルが厳密に包含的、厳密に排他的、または使用されているかどうかに関係なく、キャッシュレベルでキャッシュラインのサイズが異なることは非常にまれです他の包含ポリシー。
(厳密な除外は通常、高レベルのキャッシュを犠牲キャッシュとして使用し、低レベルのキャッシュからのエビクションが高レベルのキャッシュに挿入されます。明らかに、ブロックサイズが異なり、セクター化が使用されない場合、エビクションには残りのより大きなブロックがどこかから読み込まれるand下位レベルのキャッシュに存在する場合は無効化される[理論的に、L1エビクションがバイパスする柔軟性のないキャッシュバイパスで厳密な除外を使用できるL2およびL3およびL1/L2キャッシュミスは、either L1 または L2にのみ割り当てられ、特定のアクセスのためにL1をバイパスします。 Itaniumが浮動小数点アクセス用にL1をバイパスしていることを認識していますが、正しく思い出せば、L2にはL1が含まれていました。])
通常、メインメモリへの1回のアクセスでは、64バイトのデータと8バイトのパリティ/ ECC(どちらが正確に覚えていない)がアクセスされます。また、さまざまなメモリレベルで異なるキャッシュラインサイズを維持するのはかなり複雑です。キャッシュラインサイズは、他のどのアーキテクチャよりも、そのアーキテクチャのWordのアライメントサイズに相関することに注意する必要があります。それに基づいて、キャッシュラインサイズがメモリアクセスサイズと異なることはほとんどありません。現在、パリティビットはメモリコントローラー用であるため、キャッシュラインサイズは通常64バイトです。プロセッサは、実際にはレジスタを超えてほとんど制御しません。コンピューターで行われる他のすべては、CPUパフォーマンスを最適化するためにハードウェアを取得することに関するものです。その意味でも、メモリのレベルが異なるとキャッシュラインのサイズが異なるため、余分な複雑さをインポートすることは本当に意味がありません。