非常に多くの要因に依存するため、単一の「特効薬」の答えが存在することは不可能です。要因の中には、計算強度 (FLOPS/バイト) と、プロセス間で渡されるデータ量に対するローカル データ量の比率があります。また、システムのアーキテクチャにも依存します。計算量は分析的に見積もることも、PAPI、Likwid などのプロファイリング ツールを使用して測定することもできます。システムのアーキテクチャは、Open MPI に付属するライブラリlstopo
の一部であるユーティリティを使用して調べることができます。hwloc
残念ながらlstopo
、各メモリ チャネルの速さ、および NUMA ノード間のリンクの速さ/潜在性を知ることはできません。
はい、あります:--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
その場合、アフィニティ マスクは と を交互に使用003f
し0fc0
ます。003f
バイナリでは is であり、このようなアフィニティ マスクにより、各偶数ランクが0000000000111111
0 から 5 の CPU で実行できるようになります。したがって、奇数ランクは CPU 5 から 11 でのみスケジュールされます。0fc0
0000111111000000
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 では、--bycore
and--bysocket
オプションもより一般的な--rank-by <policy>
オプションに置き換えられています。