54

マルチコア CPU またはマルチプロセッサ システムで使用されるキャッシュ メモリに関していくつか質問があります。(プログラミングとは直接関係ありませんが、マルチコアプロセッサ/マルチプロセッサシステム用のソフトウェアを作成する際に多くの影響があるため、ここで質問します!)

  1. マルチプロセッサ システムまたはマルチコア プロセッサ (Intel Quad Core、Core two Duo など) では、各 CPU コア/プロセッサに独自のキャッシュ メモリ (データおよびプログラム キャッシュ) がありますか?

  2. 1 つのプロセッサ/コアが互いのキャッシュ メモリにアクセスできますか? 互いのキャッシュへのアクセスが許可されている場合、その特定のプロセッサのキャッシュにデータがなく、他の 2 番目のデータが含まれているシナリオでは、キャッシュ ミスが少なくなる可能性があるためです。プロセッサのキャッシュにある可能性があるため、メモリから最初のプロセッサのキャッシュへの読み取りを回避できますか? この仮定は有効で真実ですか?

  3. 任意のプロセッサが他のプロセッサのキャッシュ メモリにアクセスできるようにすることに問題はありますか?

4

3 に答える 3

53

マルチプロセッサ システムまたはマルチコア プロセッサ (Intel Quad Core、Core two Duo など) では、各 CPU コア/プロセッサに独自のキャッシュ メモリ (データおよびプログラム キャッシュ) がありますか?

  1. はい。正確なチップ モデルによって異なりますが、最も一般的な設計は、各 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 番目のデータが含まれているシナリオでは、キャッシュ ミスが少なくなる可能性があるためです。プロセッサのキャッシュにある可能性があるため、メモリから最初のプロセッサのキャッシュへの読み取りを回避できますか? この仮定は有効で真実ですか?

  1. いいえ。各 CPU コアの L1 キャッシュは、そのコアに緊密に統合されています。同じデータにアクセスする複数のコアは、ロード/ストア実行ユニットに非常に近い、独自の L1d キャッシュにそれぞれ独自のコピーを持ちます。

    複数レベルのキャッシュの重要なポイントは、単一のキャッシュでは非常にホットなデータに対して十分な速度が得られないということですが、定期的にアクセスされる使用頻度の低いデータに対して十分な大きさにすることはできません。 ほとんどのプロセッサで、L1 キャッシュのサイズが L2 キャッシュのサイズよりも小さいのはなぜですか?

    オフコアから別のコアのキャッシュに移動することは、Intel の現在の CPU で L3 に移動するよりも高速ではありません。または、これを実現するために必要なコア間のメッシュ ネットワークは、より大規模で高速な L3 キャッシュを構築する場合と比較して、法外なものになります。

    他のコアに組み込まれている小さい/高速なキャッシュは、それらのコアを高速化するためにあります。それらを直接共有すると、キャッシュのヒット率を高める他の方法よりも、おそらくより多くの電力 (およびおそらくより多くのトランジスタ/ダイ領域) が必要になります。(消費電力は、トランジスタ数やダイ領域よりも大きな制限要因です。そのため、最新の CPU は大規模なプライベート L2 キャッシュを持つ余裕があります)。

    さらに、おそらくこのコアに関連するものをキャッシュしている小さなプライベートキャッシュを他のコアが汚染することは望ましくありません。

任意のプロセッサが他のプロセッサのキャッシュ メモリにアクセスできるようにすることに問題はありますか?

  1. はい - さまざまな CPU キャッシュを他のコアに接続するワイヤがないだけです。コアが別のコアのキャッシュ内のデータにアクセスしたい場合、アクセスできる唯一のデータ パスはシステム バスです。

関連する非常に重要な問題は、キャッシュの一貫性の問題です。次のことを考慮してください。1 つの CPU コアのキャッシュに特定のメモリ ロケーションがあり、そのメモリ ロケーションに書き込みを行うとします。次に、別のコアがそのメモリ位置を読み取ります。2 番目のコアが更新された値を認識できるようにするにはどうすればよいでしょうか? それがキャッシュの一貫性の問題です。

通常の解決策は、MESI プロトコル、またはそのバリエーションです。 インテルは MESIF を使用しています

于 2009-06-05T02:47:45.013 に答える
14

簡単な回答 1) はい 2) いいえ。ただし、参照しているメモリ インスタンス/リソースによって異なります。データは同時に複数の場所に存在する場合があります。3)はい。

この問題の完全な説明については、Ulrich Drepper ( http://lwn.net/Articles/250967/ ) による 9 部構成の記事「すべてのプログラマーがメモリについて知っておくべきこと」を読む必要があります。あなたが調べているように見える問題を、適切でアクセスしやすい詳細で示します。

于 2009-06-05T02:07:04.393 に答える
4

最初の回答として、Core 2 Duo には 2 層キャッシュ システムがあり、各プロセッサが独自の第 1 レベル キャッシュを持ち、第 2 レベル キャッシュを共有していることを知っています。これは、データの同期とメモリの使用の両方に役立ちます。

2番目の質問に答えるために、あなたの仮定は正しいと思います。プロセッサが互いのキャッシュにアクセスできる場合、プロセッサが選択できるデータが増えるため、明らかにキャッシュ ミスが少なくなります。ただし、共有キャッシュについて考えてみましょう。Core 2 Duo の場合、共有キャッシュを使用すると、プログラマーはこの環境で一般的に使用される変数を安全に配置できるため、プロセッサは個々の第 1 レベルのキャッシュにアクセスする必要がなくなります。

3 番目の質問に答えると、他のプロセッサのキャッシュ メモリへのアクセスに問題が発生する可能性があります。これは、「単一書き込み複数読み取り」の原則に基づいています。複数のプロセスがメモリ内の同じ場所に同時に書き込むことはできません。

コア 2 デュオの詳細については、こちらの記事をご覧ください。

http://software.intel.com/en-us/articles/software-techniques-for-shared-cache-multi-core-systems/

于 2009-06-03T14:21:08.657 に答える