web-dev-qa-db-ja.com

共有メモリと分散メモリの主な違い

共有メモリ分散メモリの違いについて少し混乱しています。明確にできますか?

  1. 1つのプロセッサに共有メモリがあり、多くのプロセッサに分散されていますか(ネットワーク用)?

  2. 共有メモリがあるのに、なぜ分散メモリが必要なのですか?

7
pavel

短い答え

共有メモリおよび分散メモリは、特定のタイプの並列プログラミングで使用される低レベルのプログラミング抽象化です。共有メモリを使用すると、複数の処理要素がメモリ内の同じ場所を共有できます(つまり、相互に読み取りと書き込みを確認できます)。分散メモリでは、ある処理要素から別の処理要素にデータを転送するための明示的なコマンドが必要です。

詳細な回答

共有メモリ分散メモリという用語に関して考慮すべき2つの問題があります。 1つは、これらがプログラミングの抽象化として何を意味するのか、もう1つは、ハードウェアが実際にどのように実装されているのかという意味です。

過去には、真の共有メモリキャッシュコヒーレントマルチプロセッサシステムがありました。システムは、共有バスを介して相互に通信し、共有メインメモリと通信しました。これは、任意のプロセッサからメインメモリへのアクセスのレイテンシが等しいことを意味しました。今日、これらのタイプのシステムは製造されていません。代わりに、処理要素とメモリ要素の間にさまざまなポイントツーポイントリンクがあります(これが理由です 不均一なメモリアクセス、またはNUMAの場合 )。ただし、メモリを介して直接通信するという考えは、依然として有用なプログラミングの抽象化です。したがって、多くのシステムでは、これはハードウェアによって処理され、プログラマーは特別なディレクティブを挿入する必要はありません。これらの抽象化を使用するいくつかの一般的なプログラミング手法は、 OpenMP および Pthreads です。

分散メモリは、従来、ローカルメモリで計算を実行し、明示的なメッセージを使用してリモートプロセッサでデータを転送するプロセッサに関連付けられてきました。これにより、プログラマーは複雑になりますが、システムがすべてのメモリが実際に共有されているという錯覚を維持する必要がなくなるため、ハードウェアの実装が簡素化されます。このタイプのプログラミングは、従来、数百または数千の処理要素を持つスーパーコンピューターで使用されてきました。一般的に使用される手法は [〜#〜] mpi [〜#〜] です。

ただし、分散メモリを備えたシステムはスーパーコンピュータだけではありません。別の例は [〜#〜] gpgpu [〜#〜] プログラミングであり、これは今日販売されている多くのデスクトップおよびラップトップシステムで利用できます。 [〜#〜] cuda [〜#〜]OpenCL の両方で、プログラマーはCPUとGPU(またはOpenCLの場合は他のアクセラレーター)間の共有を明示的に管理する必要があります)。これは主に、GPUプログラミングが開始されたときにGPUとCPUメモリがPCIバスによって分離されていたためです。これは、ローカルに接続されたメモリで計算を実行する場合に比べて非常に長い遅延があります。そのため、プログラミングモデルは、メモリが分離(または分散)され、2つの処理要素(CPUとGPU)間の通信に明示的な通信が必要であると想定して開発されました。多くのシステムが同じダイ上にGPU要素とCPU要素を持っているので 提案があります GPGPUプログラミングが共有メモリのようなインターフェースを持つことを可能にします。

15

たとえば、最近のx86用語では、1台の物理コンピューター内のすべてのCPUがメモリを共有します。例えば4つの18コアCPUを搭載した4ソケットシステム。各CPUには独自のメモリコントローラーがありますが、それらは相互に通信するため、すべてのCPUが1つのコヒーレンシドメインの一部になります。システムはNUMA共有メモリであり、分散されていません。

これらのマシンでいっぱいの部屋は、ネットワークを介してメッセージを送信することによって通信する分散メモリクラスターを形成します。

実用的な考慮事項は、分散メモリの主な理由の1つです。数千または数百万のCPUコアが、共有メモリと呼ぶ価値のあるあらゆる種類のコヒーレンシセマンティクスで同じメモリを共有することは非現実的です。

3
Peter Cordes