web-dev-qa-db-ja.com

複数のCPU /コアが同じRAM=に同時にアクセスできますか?

これが私が推測が起こることです:

  1. 2つのコアがRAM内の同じアドレスにアクセスしようとした場合、もう1つがRAMにアクセスするには待機が必要になります。 second各コアが同じアドレスにアクセスしようとする時間、それらはまだそれを保持している可能性がありますRAMキャッシュされるため、それぞれのcacheに同時にアクセスできます

  2. 2つのコアが同じRAM内の異なるアドレスにアクセスしようとした場合、もう1つがRAMにアクセスするには待機が必要になります。

言い換えれば、RAM集中的なプログラミングタスクの場合、マルチプロセッシングは、RAMで複数回同じアドレスから読み取る必要がない限り、あまり役に立ちません。コアあたり。

したがって、複数のCPU /コアが同じRAM=に同時にアクセスできますか、それとも私が言っていることは正しいですか?

16
Lost Hobbit

概要:メモリアクセスがすべての場合、単一のコアがメモリバスを飽和させる可能性があります。

マシンのメモリ帯域幅を確立すると、シングルスレッドプロセスがこれを実際に達成できるかどうか、またそうでない場合は、プロセッサの数に応じて有効な帯域幅の使用がどのように拡大するかを確認できるはずです。


詳細は、使用しているアーキテクチャによって異なります。最新のSMPやSDRAMのようなものを想定します。

  1. 2つのコアがRAMの同じアドレスにアクセスしようとした場合...

    いくつかの方法があります:

    • 両方とも同時に読みたい:

      • 同じチップ上の2つのコアは、あるレベル(2または3)で中間キャッシュを共有するため、読み取りは1回だけ行われます。最新のアーキテクチャでは、各コアは、キャッシュラインの準備ができるまで、1つ以上のパイプラインからµ-opを実行し続けることができます。
      • 異なるチップ上の2つのコアはキャッシュを共有しない可能性がありますが、それでもバスへのアクセスを調整する必要があります。理想的には、どのチップdid n'tを発行しても、読み取りは単に応答をスヌープします
    • 彼らが両方とも書きたい場合:

      • 同じチップ上の2つのコアは同じキャッシュに書き込むだけで、RAMに一度フラッシュするだけで済みます。実際、メモリはキャッシュラインごとにRAMから読み取られ、そこに書き込まれるため、個別ではあるが十分に近いアドレスでの書き込みを、RAMへの単一の書き込みに統合することができます。

      • 異なるチップ上の2つのコアには競合があり、キャッシュラインは、chip1によってRAMに書き戻される必要があり、chip2のキャッシュにフェッチされ、変更されてから再度書き戻される必要があります(書き込み/フェッチかどうかはわかりません)スヌーピングで合体できます)

  2. 2つのコアが異なるアドレスにアクセスしようとした場合...

    singleアクセスの場合、CASレイテンシは、バスがアイドル状態の場合と比べて、2つの操作がインターリーブされて(またはおそらく少しだけ)長くならないことを意味します。

11
Useless

したがって、複数のCPU /コアが同じRAM=に同時にアクセスできますか、それとも私が言っていることは正しいですか?

さまざまなマシンアーキテクチャがあり、それぞれに独自の機能セットがあります。マルチプロセッシングマシンの1つのカテゴリは [〜#〜] misd [〜#〜] と呼ばれ、複数の命令の単一データを表します。このようなマシンは、同じデータを複数のプロセッサに同時に提供するように設計されています。 [〜#〜] simd [〜#〜] アーキテクチャ(単一命令複数データ)として知られる関連クラスのマシンは、はるかに一般的であり、同時に同じメモリへのアクセスも提供しますが、メモリにはデータの代わりに命令が含まれています。 MIMDとSIMDの両方で、「アクセス」は読み取りアクセスを意味します。2つのユニットが同時に同じ場所に書き込もうとした場合に発生する問題を想像できます。

7
Caleb

ほとんどの回答はソフトウェアまたはハードウェアモデル、あるいはその両方からアプローチしますが、最もクリーンな方法は、物理的なRAMチップの動作を検討することです。 (キャッシュはプロセッサとメモリの間にあり、同じアドレスバスを使用するだけで、プロセッサの動作は完全に透過的です。)RAMチップには、1つのアドレスデコーダがあり、アドレスを受信します。アドレスバス(および同様にデータバスの入力または出力)に到達するメモリセル現在のメモリは「シングルプロセッサアプローチ」で構築されています。つまり、1つのプロセッサが1つのバスを介して1つのメモリチップに接続されています。言い換えると、これは「フォンノイマンボトルネック」です。これは、すべての命令がメモリを少なくとも1回参照する必要があるためです。このため、1本のワイヤ(またはワイヤ、またはバス)では、一度に1つの信号しか存在できないため、RAMチップは一度に1つのセルアドレスを受信できます。 2つのコアが同じアドレスをアドレスバスに確実に送信できるようになるまで、2つの異なるバスドライバー(コアなど)による同時バスアクセスは物理的に不可能です。 (そして、それが同じであれば、それは冗長です)。

残りはいわゆるハードウェアアクセラレーションです。コヒーレンスバス、キャッシュ、SIMDアクセスなどは、物理RAMの前にある素敵なファサードの1つにすぎません。言及されたアクセラレータは、アドレスバスを独占的に使用するための戦いをカバーするかもしれません、そして、プログラミングモデルはあなたの質問とあまり関係がありません。また、同時アクセスも抽象化「プライベートアドレススペース」に反することにも注意してください。

ですから、あなたの質問へ:同じアドレスでも、異なるアドレスでも、同時の直接RAMアクセスは不可能です。キャッシュを使用すると、この事実がカバーされる可能性があり、場合によっては明らかに同時アクセスが可能になることがあります。キャッシュレベルと構造、およびデータの空間的および時間的局所性によって異なります。はい、そうです。拡張されたRAMアクセスなしのマルチ(コア)処理は、RAMを集中的に使用するアプリケーションにはあまり役立ちません。

理解を深めるには、ダイレクトメモリアクセスの仕組みを思い出してください。 CPUとDMAデバイスはどちらもバスにアドレスを割り当てることができるため、バスの同時使用から互いを除外する必要があります。

3
katang

物理RAMは気にせず、 仮想メモリアドレススペースプロセス または スレッド に気を使います。 (実際には、同じプロセスのすべてのスレッドが共通のアドレス空間を共有しています)。

もちろん、マルチコアオペレーティングシステムカーネルをコーディングしている場合は、RAMとキャッシュの一貫性を重視します。

ほとんどのマルチコアプロセッサには、何らかの形式の キャッシュコヒーレンス メカニズムがあります。詳細はプロセッサ固有です。プロセッサは CPUキャッシュ を使用しているため、プロセッサの複数のコアが同じメモリロケーションに同時にアクセスしているかのように動作する場合があります。

C11 または C++ 11 のような最近の工業用言語の標準には、(マルチスレッド対応) メモリモデル があります。

最新のCPUは、最大のデータ転送帯域幅を得るために、外部メモリデバイスに物理的に関連付けられています。これは、高い転送速度を維持するために必要なシグナルインテグリティ要件(トレース長、終端、クロックスキューなど)が原因です。たとえば、マルチCPUマザーボードでは、各CPUに専用のDIMMスロットセットがあります。ソフトウェアプログラマの考えに関係なく、1つのCPUが別のCPUの外部メモリデータに単純にアクセスすることはできません。システムのメモリ管理ソフトウェアは、OSカーネル、ハイパーバイザー、データプレーンコアのレベルに関係なく、CPU間のメモリデータ転送を処理します。

0
Jeff Brower