9

私が知っているのは、openMPI実装には、さまざまなプロセスをさまざまなソケットのさまざまなコアにマッピングするための基本的な機能がいくつかあることです(システムに複数のソケットがある場合)。

  1. --bind-to-socket(先着順)
  2. --bysocket(負荷分散に基づくラウンドロビン)
  3. --npersocket N(各ソケットに N 個のプロセスを割り当てます)
  4. --npersocket N --bysocket(各ソケットに N プロセスを割り当てますが、ラウンドロビン方式で行います)
  5. --bind-to-core(1 つのプロセスを各コアに順番にバインドします)
  6. --bind-to-core --bysocket(各コアに 1 つのプロセスを割り当てますが、使用率の低いソケットを放置しないでください)
  7. --cpus-per-proc N(プロセスを複数のコアにバインド)
  8. --rankfile(各プロセスの好みの完全な説明を書くことができます)

8 つのソケット (それぞれ 10 コア) を持つサーバーで openMPI プログラムを実行しています。マルチスレッドがオンになっているため、160 のコアが利用可能です。ソケット/コアとプロセスのさまざまな組み合わせでopenMPIプログラムを実行して分析する必要があります。すべてのソケットが使用され、コードがデータ転送を処理している場合が最も遅いと予想されます。プロセスは同じソケットのコアで実行されています。

So my questions are follows,

  1. プロセスとソケット間の最悪/最良のマッピングは何ですか (各プロセスにはスリープ期間とルート プロセスへのデータ転送があります)。

  2. プロセスが実行されているソケットの名前とコアの詳細を出力する方法はありますか? (プロセスが実際にソケット間で分散されているかどうかを確認します)

4

2 に答える 2

11
  1. 非常に多くの要因に依存するため、単一の「特効薬」の答えが存在することは不可能です。要因の中には、計算強度 (FLOPS/バイト) と、プロセス間で渡されるデータ量に対するローカル データ量の比率があります。また、システムのアーキテクチャにも依存します。計算量は分析的に見積もることも、PAPI、Likwid などのプロファイリング ツールを使用して測定することもできます。システムのアーキテクチャは、Open MPI に付属するライブラリlstopoの一部であるユーティリティを使用して調べることができます。hwloc残念ながらlstopo、各メモリ チャネルの速さ、および NUMA ノード間のリンクの速さ/潜在性を知ることはできません。

  2. はい、あります:--report-bindings各ランクは、それに適用されるアフィニティ マスクを標準エラー出力に出力します。Open MPI のバージョンによって、出力が少し異なります。

Open MPI 1.5.xは、アフィニティ マスクの 16 進値を示します。

mpiexec --report-bindings --bind-to-core --bycore

[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],0] to cpus 0001
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],1] to cpus 0002
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],2] to cpus 0004
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],3] to cpus 0008

これは、ランク 0 のアフィニティ マスク0001が CPU 0 でのみ実行できるように設定されていることを示しています。ランク 1 にはアフィニティ マスクが設定されており0002、CPU 1 のみで実行できます。等々。

mpiexec --report-bindings --bind-to-socket --bysocket

[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],0] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],1] to socket 1 cpus 0fc0
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],2] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],3] to socket 1 cpus 0fc0

その場合、アフィニティ マスクは と を交互に使用003f0fc0ます。003fバイナリでは is であり、このようなアフィニティ マスクにより、各偶数ランクが00000000001111110 から 5 の CPU で実行できるようになります。したがって、奇数ランクは CPU 5 から 11 でのみスケジュールされます。0fc00000111111000000

Open MPI 1.6.xでは代わりに、より優れたグラフィカル表示が使用されます。

mpiexec --report-bindings --bind-to-core --bycore

[hostname:39646] MCW rank 0 bound to socket 0[core 0]: [B . . . . .][. . . . . .]
[hostname:39646] MCW rank 1 bound to socket 0[core 1]: [. B . . . .][. . . . . .]
[hostname:39646] MCW rank 2 bound to socket 0[core 2]: [. . B . . .][. . . . . .]
[hostname:39646] MCW rank 3 bound to socket 0[core 3]: [. . . B . .][. . . . . .]

mpiexec --report-bindings --bind-to-socket --bysocket

[hostname:13888] MCW rank 0 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 1 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]
[hostname:13888] MCW rank 2 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 3 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]

各ソケットは、各コアがドットで表される一連の角括弧としてグラフィカルに表されます。各ランクがバインドされているコアは、文字で示されBます。プロセスは、最初のハードウェア スレッドのみにバインドされます。

Open MPI 1.7.xはもう少し冗長で、ハードウェア スレッドについても認識しています。

mpiexec --report-bindings --bind-to-core

[hostname:28894] MCW rank 0 bound to socket 0[core 0[hwt 0-1]]: [BB/../../../../..][../../../../../..]
[hostname:28894] MCW rank 1 bound to socket 0[core 1[hwt 0-1]]: [../BB/../../../..][../../../../../..]
[hostname:28894] MCW rank 2 bound to socket 0[core 2[hwt 0-1]]: [../../BB/../../..][../../../../../..]
[hostname:28894] MCW rank 3 bound to socket 0[core 3[hwt 0-1]]: [../../../BB/../..][../../../../../..]

mpiexec --report-bindings --bind-to-socket

[hostname:29807] MCW rank 0 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 1 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]
[hostname:29807] MCW rank 2 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 3 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]

Open MPI 1.7.x では、--bycoreand--bysocketオプションもより一般的な--rank-by <policy>オプションに置き換えられています。

于 2013-07-12T12:17:16.313 に答える
2

1. 各ノードとルートの間に同等の通信があり、他の通信パターンがない場合、通信は特定のプロセス -> ソケット マッピングのパフォーマンスに影響しません。(これは、ソケット間の通常の対称相互接続トポロジーを前提としています。) そうでない場合は、通常、通信トポロジー内で通信​​量の多いプロセス ペアを互いに近くに配置しようとします。共有メモリ システムで MPI を使用すると、関連性がない可能性がありますが、クラスターでは関連性があります。

ただし、ロード バランシングは、マッピングのパフォーマンスにも影響を与える可能性があります。一部のプロセスがメッセージ/バリアを待機する場合、そのソケットの他のコアはより高いターボ周波数を利用できる場合があります。これは、アプリケーションの実行時の動作に大きく依存します。スリープと転送だけで構成されるアプリケーションは、あまり意味がありません。

  1. libnuma / sched_getaffinityを使用して、プロセスの固定を手動で確認できます。

質問への回答に役立つパフォーマンス分析ツールが多数あります。たとえば、OpenMPI には、MPI 通信などに関する情報を含むトレースを生成する VampirTrace が付属していますVampirで表示できます。

于 2013-07-12T10:32:20.077 に答える