web-dev-qa-db-ja.com

MPI:コアまたはプロセッサ?

こんにちは、私は一種のMPI noobですので、これについてはご容赦ください。)

MPIというプログラムがfoo.cと呼ばれ、実行可能ファイルを実行して

mpirun -np 3 ./foo

これは、プログラムが3つのプロセッサを使用して並列に実行されることを意味します(1 プロセスプロセッサごと)。しかし、今日のほとんどのプロセッサには複数のコアがあるので(プロセッサごとに2コアと言う)、これはプログラムが3コアまたは3プロセッサで実行されることを意味しますか?

おそらくこれは、コアとプロセッサの違いが本当に何であるかについての私の理解不足に関係しているので、もう少し説明してもらえれば助かります。

ありがとうございました。

23
smilingbuddha

mpirunは、マシン上でいくつかの「プロセス」を実行します。これらのプロセスが実行されるCPUまたはコアは、オペレーティングシステムに依存します。各CPUにMコアを備えたN CPUマシンでは、N * Mプロセスをフルスピードで実行する余地があります。

しかし、通常:

  • 複数のコアがある場合、各プロセスは個別のコアで実行されます
  • 利用可能なコア* cpusよりも多くのプロセスを要求すると、すべてが実行されますが、効率は低下します(はい、単一CPUシングルコアマシンでマルチプロセスジョブを実行できます...)
  • キューイングシステムまたはリモートマシンのリストが存在する事前構成済みのMPIシステム)を使用している場合、割り当てはリモートマシンに分散されます。

(mpiの実装によっては、特定のCPUまたはコアを強制するオプションがいくつかある場合がありますが、それについて心配する必要はありません)。

33
Blklight

コアとプロセッサへのプロセスの分散は、オペレーティングシステムとMPI実装によって処理されます。デスクトップで実行すると、オペレーティングシステムは通常、各プロセスを異なるコアに配置し、実行中にプロセスを再配布する可能性があります-time。スーパーコンピューターやクラスターなどの大規模なシステムでは、分散はSLURMなどのリソースマネージャーによって処理されますが、これは1つまたは複数のプロセスが各コアに割り当てられます。

ハードウェアに関しては、コアは一度に1つのプロセスしか実行できません。ハイパースレッディングなどのテクノロジーにより、複数のプロセスが単一コアのリソースを共有できます。コアごとに2つ以上のプロセスが最適な場合があります。たとえば、プロセスが大量のファイルI/Oを実行している場合、最初のプロセスが読み取りまたは書き込みでハングしている間に、別のプロセスが代わりに計算を実行することがあります。

つまり、MPI実行するプロセスの数を指定します。これらのプロセスの配布は、ユーザーに対して透過的に処理されます。使用するプロセスの数は、アプリケーションの要件によって決定される必要があります(2の累乗、読み取るファイルの数)、使用可能なコアの数、およびアプリケーションのコアごとの最適なプロセスの数。

5
corahm

OSスケジューラは、マルチコアシステムの並列アプリケーションのプロセスに個別のコアを最適に割り当てようとしますORマルチプロセッサシステムの個別のプロセッサに。

興味深いケースは、マルチコアマルチCPUシステムです。繰り返しになりますが、OSスケジューラーに任せることができます。ORプロセスに(論理/物理)コアアフィニティを適用して、特定のコアにバインドすることができます。

4
Jay D

Mpirunコマンドはホストリストを使用します。それを指定しない場合、おそらく「localhost」を使用し、そこですべてのプロセスを実行します。 3つのプロセスを実行していて、4コアのマシンを使用している場合、OSは通常それらを異なるコアに配置するため、おそらく高速化が得られます。コアが2つしかない場合、1つのコアで2つのプロセスが取得されます。

OSはプロセスの移動を許可されているため、上記は完全には当てはまりません。したがって、numactlを使用してプロセスをコアにバインドすることができます。

マルチノードクラスターを使用している場合、well-setup mpiは、各ノードがコアを持っている回数だけ出現するホストファイルを生成します。したがって、ノードごとに8つのコアを持つ4ノードのクラスターでは、最大32のプロセスをリクエストでき、ほぼ完全なスピードアップを期待できます。 (もちろん、コードとアルゴリズムで許可されている場合)。そのクラスターで9つのプロセスを要求すると、1つのノードに8つ、別のノードに9番目のプロセスが要求される可能性があります。クラスタソフトウェアに、プロセスをそれよりも分散させるmpirunが付属していることを望みます。

3
Victor Eijkhout

MPIジョブのパフォーマンスビューから、いくつかの明示的なルールがあります:1)コードが純粋な場合MPIコード(BLASはopenMPで調整されていません)ハイパースレッドをオフにして、ノードあたりのジョブのタスク数をノードのコアに設定します2)コードがMPI + openMPの場合、ノードのコアにPPN(ノードあたりのプロセス)を設定し、OMP_NUM_THEADSを2に設定できます(2つある場合)コアあたりのハードウェアスレッド)3)コードがMPI + openMPでクラスターが巨大な場合、PPN(ノードあたりのプロセス)を1に設定し、OMP_NUM_THEADSを論理CPU番号に設定して、通信オーバーヘッドを節約できます。

2
duoduo

有用なフレームワークを提供するために、この階層を検討します。

  • マザーボードは1つ以上のチップ/ダイスを保持できます;
    • チップ/ダイには、1つ以上のコア(独立したCPU)を含めることができます。
      • cPUは1つ以上のスレッドを同時に処理できます(私が知っているマルチスレッドは2つのスレッドで構成されています)

初期の頃は、ほとんどの場合、1つのマザーボードに1つのチップを搭載し、1つのCPUで1つのスレッドを実行するマザーボードがありました。一度に処理できるプロセスは1つだけであり、出席するハードウェアセットはプロセッサと呼ばれていました。ソフトウェア(実行するタスク)とハードウェア(タスクを実行するデバイス)の間に1対1のマッピングがありました。

プロセスは間違いなくソフトウェアの概念です。 「スレッド」は、非常に簡単に言えば、並列コンカレントコンピューティングのコンテキストにおける「プロセス」の仕様です。現在、processorは、物理デバイスとその拡張処理機能(マルチスレッド化、確かに技術的な実装)を参照できます。たとえば、マザーボードに2つのチップがあり、チップあたり4つのコア/ CPUがあり、各コア/ CPUが2つのスレッドを同時に実行しているマシンを使用できます。その後、2x4x2 = 16プロセスを実行できます(もちろん、リソースのオーバーサブスクリプションなしで)。

MPI構文でアドレスを引用プロセス(オプションnp)、または必要に応じてスレッド。_man mpirun_は、プロセスを「スロット」と呼びます(たとえば、ホストファイルの仕様を参照してください)。

スロットは、ノードで実行できるプロセスの数を示します。

この使用法は、ハードウェアの単位とソフトウェアの単位との間の当時の標準的な密接な対応の遺産のように聞こえます。 「スロット」は元々マテリアル/ハードウェア機能であり、時々同様の意味の変更を受けた「ソケット」という用語とは異なりません。

確かに私はあなたの混乱にかなり同情を感じます。 Linuxユーザーの場合は、_cat /proc/cpuinfo_のレポートを視覚化できます。これらの行は、4つのうち「2」という名前の1つのプロセッサを参照しています。

_processor   : 2
...
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 4
_

彼らは、この1台のマシンでは1つのチップしか取得していません(「物理ID」はリスト全体で1つの値しか取らないため、省略されています)、この1つのチップは4つの「CPUコア」として、この1つのチップは4つの兄弟を実行しています。 (4スレッドなので、マルチスレッドはありません)。この場合、4つの処理要素と4つのCPUコアがあります。

上記のマルチスレッドの例では、16個のプロセッサのリスト、「物理ID」(チップ)の2つの値、「cpuコア」が4(チップあたり)に等しいことがわかりますまた、そのチップでマルチスレッドが有効になっているため、「兄弟」は8(チップごと)になります。この場合、コアの4倍の数のプロセッサがあります。

したがって、この拡張されたコンテキストでは、「プロセッサ」は「プロセス」で機能するマシンの機能を示します。これは、コアの数や特技に関係なくMPIであり、使用したいものです。これを可能にすることができますこれらの処理機能の起源の概要を知る必要があるだけです。

もう1つの便利なLinuxコマンドはlscpuです。

_...
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
...
_

確かに「ソケット」は、チップが差し込まれているマザーボードの物理的な接続です。そのため、実際にはチップの別名です。確かにここではマルチスレッドはありません。

私はこの他の投稿での議論に感謝しています https://unix.stackexchange.com/q/146051/13291

0
XavierStuvw