マルチコアCPUまたはマルチプロセッサシステムで使用されるキャッシュメモリに関していくつか質問があります。 (プログラミングとは直接関係ありませんが、マルチコアプロセッサ/マルチプロセッサシステム用のソフトウェアを作成する際に多くの影響があります。したがって、ここで質問してください!)
マルチプロセッサシステムまたはマルチコアプロセッサ(Intel Quad Core、Core two Duoなど)では、各CPUコア/プロセッサに独自のキャッシュメモリ(データおよびプログラムキャッシュ)がありますか?
1つのプロセッサ/コアが互いのキャッシュメモリにアクセスできますか?なぜなら、互いのキャッシュへのアクセスが許可されている場合、その特定のプロセッサのキャッシュにデータがなく、他の秒が存在するシナリオでは、キャッシュミスが少なくなる可能性があるためです。プロセッサのキャッシュには、メモリから最初のプロセッサのキャッシュへの読み取りを回避できる可能性がありますか?この仮定は有効で真実ですか?
プロセッサが他のプロセッサのキャッシュメモリにアクセスできるようにすることに問題はありますか?
マルチプロセッサシステムまたはマルチコアプロセッサ(Intel Quad Core、Core two Duoなど)では、各CPUコア/プロセッサに独自のキャッシュメモリ(データおよびプログラムキャッシュ)がありますか?
はい。正確なチップモデルによって異なりますが、最も一般的な設計は、各CPUコアが独自のプライベートL1データと命令キャッシュを持つことです。
古いCPUや低電力CPUでは、次のレベルのキャッシュは通常、L2ユニファイドキャッシュがすべてのコア間で共有されることです。または、65nm Core2Quad(1つのパッケージに2つのcore2duoダイが含まれていました)では、コアの各ペアに独自の最終レベルのキャッシュがあり、効率的に通信できませんでした。
最新の主流のIntelCPU(第1世代のi7 CPU、Nehalem以降)は3レベルのキャッシュを使用します。
最終レベルのキャッシュは、大規模な共有L3です。これはコア間で物理的に分散されており、L3のスライスがコアを接続するリングバス上の各コアと一緒に移動します。通常、すべてのコアで1.5〜2.25MBのL3キャッシュがあるため、メニーコアXeonでは、すべてのコア間で36MBのL3キャッシュが共有される場合があります。これが、デュアルコアチップには2〜4 MBのL3があり、クアッドコアには6〜8MBがある理由です。
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つのプロセッサ/コアが互いのキャッシュメモリにアクセスできますか?なぜなら、互いのキャッシュへのアクセスが許可されている場合、その特定のプロセッサのキャッシュにデータがなく、他の秒が存在するシナリオでは、キャッシュミスが少なくなる可能性があるためです。プロセッサのキャッシュには、メモリから最初のプロセッサのキャッシュへの読み取りを回避できる可能性がありますか?この仮定は有効で真実ですか?
いいえ。各CPUコアのL1キャッシュは、そのコアに緊密に統合されています。同じデータにアクセスする複数のコアは、それぞれ独自のL1dキャッシュに独自のコピーを持ち、ロード/ストア実行ユニットのすぐ近くにあります。
複数レベルのキャッシュの要点は、単一のキャッシュは非常にホットなデータには十分な速度ではありませんが、定期的にアクセスされる頻度の低いデータには十分な大きさではないということです。 ほとんどのプロセッサでL1キャッシュのサイズがL2キャッシュのサイズよりも小さいのはなぜですか?
オフコアで別のコアのキャッシュに移動することは、Intelの現在のCPUでL3に移動するよりも速くはありません。または、これを実現するためにコア間に必要なメッシュネットワークは、より大規模で高速なL3キャッシュを構築するだけの場合と比較して法外なものになります。
他のコアに組み込まれているスモール/ファストキャッシュは、それらのコアを高速化するためにあります。それらを直接共有すると、キャッシュヒット率を上げる他の方法よりも多くの電力(そしておそらくさらに多くのトランジスタ/ダイ領域)がかかるでしょう。 (電力はトランジスタ数やダイ面積よりも大きな制限要因です。そのため、最近のCPUは大きなプライベートL2キャッシュを使用できます)。
さらに、thisコアに関連するものをキャッシュしている可能性のある小さなプライベートキャッシュを他のコアが汚染することは望ましくありません。
プロセッサが他のプロセッサのキャッシュメモリにアクセスできるようにすることに問題はありますか?
非常に重要な関連する問題は キャッシュコヒーレンシの問題 です。次のことを考慮してください。1つのCPUコアのキャッシュに特定のメモリ位置があり、そのメモリ位置に書き込むとします。次に、別のコアがそのメモリ位置を読み取ります。 2番目のコアに更新された値が表示されるようにするにはどうすればよいですか?それがキャッシュコヒーレンシの問題です。
通常の解決策は MESIプロトコル 、またはそのバリエーションです。 IntelはMESIFを使用 。
クイックアンサー1)はい2)いいえ。ただし、参照しているメモリインスタンス/リソースによって異なります。データは、同時に複数の場所に存在する場合があります。 3)はい。
この問題の詳細な説明については、Ulrich Drepper( http://lwn.net/Articles/250967/ )による9部構成の記事「すべてのプログラマーがメモリについて知っておくべきこと」を読む必要があります。あなたが質問していると思われる問題の全体像を、アクセスしやすい詳細で取得します。
インテルのドキュメント
Intelは、この種の情報を含む可能性のある 世代ごとのデータシート を公開しています。
たとえば、古いコンピューターに搭載されていたプロセッサーi5-3210Mの場合、 第3世代-データシートボリューム1 を調べ、1.1「プロセッサー機能の詳細」には次のように書かれています。
- 各コアの32KB命令と32KBデータの第1レベルキャッシュ(L1)
- 各コアの256KB共有命令/データ第2レベルキャッシュ(L2)
- 最大8MBの共有命令/データ第3レベルキャッシュ(L3)、すべてのコア間で共有
インテルは、コアキャッシュ共有テクノロジーを「インテルスマートキャッシュ」と呼んでいます。それについてのwikiページスタブがあります: https://en.wikipedia.org/wiki/Smart_Cache
データシートページは、 プロセッサのARKページ から見つけることができます。これには基本的なキャッシュ情報しかありません。
Intelスマートキャッシュ:3 MB
参照:
最初に答えると、Core 2 Duoには2層のキャッシュシステムがあり、各プロセッサには独自の第1レベルのキャッシュがあり、第2レベルのキャッシュを共有しています。これは、データの同期とメモリの使用率の両方に役立ちます。
あなたの2番目の質問に答えるために、私はあなたの仮定が正しいと信じています。プロセッサが互いのキャッシュにアクセスできるようになった場合、プロセッサが選択できるデータが増えるため、キャッシュミスが明らかに少なくなります。ただし、共有キャッシュを検討してください。 Core 2 Duoの場合、共有キャッシュを使用すると、プログラマーは一般的に使用される変数をこの環境に安全に配置できるため、プロセッサーは個々の第1レベルのキャッシュにアクセスする必要がありません。
3番目の質問に答えると、他のプロセッサのキャッシュメモリへのアクセスに問題が発生する可能性があります。これは、「単一書き込み複数読み取り」の原則に基づいています。複数のプロセスがメモリ内の同じ場所に同時に書き込むことを許可することはできません。
Core 2 Duoの詳細については、このきちんとした記事をお読みください。
http://software.intel.com/en-us/articles/software-techniques-for-shared-cache-multi-core-systems/