MPICH2 MPIEXECでMPDノード数よりプロセス数が多い場合の振る舞い
MPICH2はデフォルトではMPDを使ってプロセス起動をするわけだけど、MPD起動ノード数より多くのプロセスを使った場合の振る舞いが気になったのでちょっと調べてみた。昨日、手元のマシン32台(デュアルCPU)上にMPDを動かして64プロセス使うMPIアプリケーションを実行したときに、ランクがどういうふうに割り振られるのか気になってさ。
確認してみたところ、ラウンドロビンでぐるぐるランクを割り振るらしいことが分かった。例えば、mpdtraceでMPDデーモンがマシンA->B->C->Dの順に表示されたとき、ランクは0->A, 1->B, 2->C, 3->D, 4->A, 5->B, 6->C, 7->Dの順に割り振られる。よって、僕の気になってた32MPD&64MPIプロセスの場合は、各ノードに2プロセス割り振られ64CPUをフル稼働できるわけでした。
研究室の先輩からMPICH(1の方)のMPDはMPDデーモン間でリングを構築し、ラウンドロビンでランクを割り振るってことを聞いていたけど、MPICH2でも同じようだ。まぁ、その先輩はMPICHのソースを読んで実装を知っているわけで、一方の僕は、以下のような簡単なプログラムを繰り返し実行して確認しただけなんだけど。
#include <stdio.h> #include "mpi.h" int main(int argc, char *argv[]) { int comm_size, myid; char proc_name[32]; int proc_name_len; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &comm_size); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Get_processor_name(proc_name, &proc_name_len); printf("%s\n", proc_name); MPI_Finalize(); return 0; }
ランクも一緒に表示するように、以下のように実行して。
$ mpiexec -l -np 64 ./a.out