マルチプロセッサ システムまたはマルチコア プロセッサ (Intel Quad Core、Core two Duo など) では、各 CPU コア/プロセッサに独自のキャッシュ メモリ (データおよびプログラム キャッシュ) がありますか?
はい。正確なチップ モデルによって異なりますが、最も一般的な設計は、各 CPU コアが独自のプライベート L1 データおよび命令キャッシュを持つことです。
古い CPU や低電力の CPU では、通常、次のレベルのキャッシュは L2 統合キャッシュであり、通常はすべてのコア間で共有されます。または、65nm Core2Quad (1 つのパッケージに 2 つの core2duo ダイが入っている) では、コアの各ペアに独自の最終レベルのキャッシュがあり、効率的に通信できませんでした。
最新の主流の Intel CPU (第 1 世代の i7 CPU、Nehalem 以降) は、3 レベルのキャッシュを使用します。
- 32kiB 分割 L1i/L1d: コアごとのプライベート (以前の Intel と同じ)
- 256kiB 統合 L2: コアごとのプライベート。(Skylake-avx512 では 1MiB)。
- 大規模な統合 L3: すべてのコアで共有
最終レベルのキャッシュは、大規模な共有 L3 です。コア間で物理的に分散され、L3 のスライスがコアを接続するリング バス上の各コアに接続されます。通常、すべてのコアで 1.5 ~ 2.25MB の L3 キャッシュを使用するため、メニーコア Xeon では、すべてのコア間で 36MB の L3 キャッシュが共有される場合があります。これが、デュアル コア チップの L3 が 2 ~ 4 MB であるのに対し、クアッド コア チップの L3 が 6 ~ 8 MB である理由です。
Skylake- avx512以外の CPU では、L3 にはコアごとのプライベート キャッシュが含まれているため、そのタグをスヌープ フィルターとして使用して、すべてのコアへのリクエストのブロードキャストを回避できます。つまり、プライベート L1d、L1i、または L2 にキャッシュされたものはすべて、L3 にも割り当てる必要があります。Intel Core i7 プロセッサで使用されているキャッシュ マッピング手法を参照してください。
David Kanter の Sandybridge の記事には、コアごとのキャッシュと共有 L3 への接続、およびそれに接続する DDR3 / DMI(チップセット) / PCIe を示す、メモリ階層 / システム アーキテクチャの優れた図があります。(これは、後の CPU の DDR4 を除いて、Haswell / Skylake-client / Coffee Lake に引き続き適用されます)。
1 つのプロセッサ/コアが互いのキャッシュ メモリにアクセスできますか? 互いのキャッシュへのアクセスが許可されている場合、その特定のプロセッサのキャッシュにデータがなく、他の 2 番目のデータが含まれているシナリオでは、キャッシュ ミスが少なくなる可能性があるためです。プロセッサのキャッシュにある可能性があるため、メモリから最初のプロセッサのキャッシュへの読み取りを回避できますか? この仮定は有効で真実ですか?
いいえ。各 CPU コアの L1 キャッシュは、そのコアに緊密に統合されています。同じデータにアクセスする複数のコアは、ロード/ストア実行ユニットに非常に近い、独自の L1d キャッシュにそれぞれ独自のコピーを持ちます。
複数レベルのキャッシュの重要なポイントは、単一のキャッシュでは非常にホットなデータに対して十分な速度が得られないということですが、定期的にアクセスされる使用頻度の低いデータに対して十分な大きさにすることはできません。 ほとんどのプロセッサで、L1 キャッシュのサイズが L2 キャッシュのサイズよりも小さいのはなぜですか?
オフコアから別のコアのキャッシュに移動することは、Intel の現在の CPU で L3 に移動するよりも高速ではありません。または、これを実現するために必要なコア間のメッシュ ネットワークは、より大規模で高速な L3 キャッシュを構築する場合と比較して、法外なものになります。
他のコアに組み込まれている小さい/高速なキャッシュは、それらのコアを高速化するためにあります。それらを直接共有すると、キャッシュのヒット率を高める他の方法よりも、おそらくより多くの電力 (およびおそらくより多くのトランジスタ/ダイ領域) が必要になります。(消費電力は、トランジスタ数やダイ領域よりも大きな制限要因です。そのため、最新の CPU は大規模なプライベート L2 キャッシュを持つ余裕があります)。
さらに、おそらくこのコアに関連するものをキャッシュしている小さなプライベートキャッシュを他のコアが汚染することは望ましくありません。
任意のプロセッサが他のプロセッサのキャッシュ メモリにアクセスできるようにすることに問題はありますか?
- はい - さまざまな CPU キャッシュを他のコアに接続するワイヤがないだけです。コアが別のコアのキャッシュ内のデータにアクセスしたい場合、アクセスできる唯一のデータ パスはシステム バスです。
関連する非常に重要な問題は、キャッシュの一貫性の問題です。次のことを考慮してください。1 つの CPU コアのキャッシュに特定のメモリ ロケーションがあり、そのメモリ ロケーションに書き込みを行うとします。次に、別のコアがそのメモリ位置を読み取ります。2 番目のコアが更新された値を認識できるようにするにはどうすればよいでしょうか? それがキャッシュの一貫性の問題です。
通常の解決策は、MESI プロトコル、またはそのバリエーションです。 インテルは MESIF を使用しています。