mpirunでCPUコア数を超える並列プログラムを実行したいとき
一般に、MPIを使って並列処理をする際には、mpirunというコマンドを使って、複数プロセスの処理を行います。具体的には、以下のように用いることができます。
$ mpirun -np [並列数] [オプション] [実行プログラム]
[並列数]には、並列計算を行うときのプロセスの数が入ります。
試しに、以下の環境でテスト実行プログラムを動かしてみたいと思います。
・CPUコア数の確認↓(Linux)
$ fgrep 'cpu cores' /proc/cpuinfo | sort -u | sed 's/.*: //' ->8
CPUコア数が8であることを確認し、pythonでtestを吐くだけのプログラムを並列処理してみます。
・並列数2で実行
$ mpirun -np 2 python -c "print('test')" ->test ->test
・並列数8で実行
$ mpirun -np 8 python -c "print('test')" ->test ->test ->test ->test ->test ->test ->test ->test
並列数8までは、無事並列プログラムが実行されるようです。
・並列数9で実行
$ mpirun -np 9 python -c "print('test')" ->There are not enough slots available in the system to satisfy the 9 slots that were requested by the application: ... ...
並列処理数がCPUコア数を超えてしまうと、上手く行かないようです。
このような問題には、CPUリソースをオーバーサブスクライブすることを[オプション]で明示してやれば、良いそうです。ちなみに、オーバーサブスクライブとは、ノードの 1 つの物理コアに対して、複数の仮想コアを用意してやることで、パフォーマンスの若干の低下と引き換えにコアの数を増やしてやるという操作のことです。以下のように書いてやります。
・--oversubscribeを加える
$ mpirun -np 9 --oversubscribe python -c "print('test')" ->test ->test ->test ->test ->test ->test ->test ->test ->test
上手くいきました。