こんにちは、私は一種のMPI noobですので、これについてはご容赦ください。)
MPIというプログラムがfoo.cと呼ばれ、実行可能ファイルを実行して
mpirun -np 3 ./foo
これは、プログラムが3つのプロセッサを使用して並列に実行されることを意味します(1 プロセスプロセッサごと)。しかし、今日のほとんどのプロセッサには複数のコアがあるので(プロセッサごとに2コアと言う)、これはプログラムが3コアまたは3プロセッサで実行されることを意味しますか?
おそらくこれは、コアとプロセッサの違いが本当に何であるかについての私の理解不足に関係しているので、もう少し説明してもらえれば助かります。
ありがとうございました。
mpirunは、マシン上でいくつかの「プロセス」を実行します。これらのプロセスが実行されるCPUまたはコアは、オペレーティングシステムに依存します。各CPUにMコアを備えたN CPUマシンでは、N * Mプロセスをフルスピードで実行する余地があります。
しかし、通常:
(mpiの実装によっては、特定のCPUまたはコアを強制するオプションがいくつかある場合がありますが、それについて心配する必要はありません)。
コアとプロセッサへのプロセスの分散は、オペレーティングシステムとMPI実装によって処理されます。デスクトップで実行すると、オペレーティングシステムは通常、各プロセスを異なるコアに配置し、実行中にプロセスを再配布する可能性があります-time。スーパーコンピューターやクラスターなどの大規模なシステムでは、分散はSLURMなどのリソースマネージャーによって処理されますが、これは1つまたは複数のプロセスが各コアに割り当てられます。
ハードウェアに関しては、コアは一度に1つのプロセスしか実行できません。ハイパースレッディングなどのテクノロジーにより、複数のプロセスが単一コアのリソースを共有できます。コアごとに2つ以上のプロセスが最適な場合があります。たとえば、プロセスが大量のファイルI/Oを実行している場合、最初のプロセスが読み取りまたは書き込みでハングしている間に、別のプロセスが代わりに計算を実行することがあります。
つまり、MPI実行するプロセスの数を指定します。これらのプロセスの配布は、ユーザーに対して透過的に処理されます。使用するプロセスの数は、アプリケーションの要件によって決定される必要があります(2の累乗、読み取るファイルの数)、使用可能なコアの数、およびアプリケーションのコアごとの最適なプロセスの数。
OSスケジューラは、マルチコアシステムの並列アプリケーションのプロセスに個別のコアを最適に割り当てようとしますORマルチプロセッサシステムの個別のプロセッサに。
興味深いケースは、マルチコアマルチCPUシステムです。繰り返しになりますが、OSスケジューラーに任せることができます。ORプロセスに(論理/物理)コアアフィニティを適用して、特定のコアにバインドすることができます。
Mpirunコマンドはホストリストを使用します。それを指定しない場合、おそらく「localhost」を使用し、そこですべてのプロセスを実行します。 3つのプロセスを実行していて、4コアのマシンを使用している場合、OSは通常それらを異なるコアに配置するため、おそらく高速化が得られます。コアが2つしかない場合、1つのコアで2つのプロセスが取得されます。
OSはプロセスの移動を許可されているため、上記は完全には当てはまりません。したがって、numactl
を使用してプロセスをコアにバインドすることができます。
マルチノードクラスターを使用している場合、well-setup mpiは、各ノードがコアを持っている回数だけ出現するホストファイルを生成します。したがって、ノードごとに8つのコアを持つ4ノードのクラスターでは、最大32のプロセスをリクエストでき、ほぼ完全なスピードアップを期待できます。 (もちろん、コードとアルゴリズムで許可されている場合)。そのクラスターで9つのプロセスを要求すると、1つのノードに8つ、別のノードに9番目のプロセスが要求される可能性があります。クラスタソフトウェアに、プロセスをそれよりも分散させるmpirunが付属していることを望みます。
MPIジョブのパフォーマンスビューから、いくつかの明示的なルールがあります:1)コードが純粋な場合MPIコード(BLASはopenMPで調整されていません)ハイパースレッドをオフにして、ノードあたりのジョブのタスク数をノードのコアに設定します2)コードがMPI + openMPの場合、ノードのコアにPPN(ノードあたりのプロセス)を設定し、OMP_NUM_THEADSを2に設定できます(2つある場合)コアあたりのハードウェアスレッド)3)コードがMPI + openMPでクラスターが巨大な場合、PPN(ノードあたりのプロセス)を1に設定し、OMP_NUM_THEADSを論理CPU番号に設定して、通信オーバーヘッドを節約できます。
有用なフレームワークを提供するために、この階層を検討します。
初期の頃は、ほとんどの場合、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