状況
MPI.jlを使って,MPIで並列化したJuliaのコード。普通は以下のように実行すると思います。
mpiexec -n 10 julia main.jl
main.jlがMPI.jl使って並列化したコード。今回はMPIにIntel MPIを使いました。
これが17秒程度で実行できたとします。これをOpenPBSでジョブスケジューリングしている環境で計算を流します。お金がないので,管理ノードと計算ノード兼用のマシンで実行しました。
バッチ処理用のシェルは以下の感じ
#!/bin/bash
#PBS -q default
#PBS -l nodes=1:ncpus=10
#PBS -j oe
cd $PBS_O_WORKDIR
# Intel MPIのためのパス設定
source /opt/intel/oneapi/setvars.sh
mpirun -n 10 julia main.jl
OpenPBSなので,以下のコマンドでジョブ投入。
qsub exec.sh
普通,コンソールからの実行時間と大差ない時間で終了することを期待しますが, 実行時間がなんと43秒。 倍以上増加。計算規模を大きくすると,10倍程度の差が出ました。
現状の対策
Intel MPIの設定が悪いのかとか環境変数が読み込めてないのかとか,OpenPBSのバージョンが悪いのかとか色々考えました。
ちなみにOSはRockylinux 8.5で微妙に新しいので,Torqueが入らなかったりして,OpenPBSを入れました。OpenPBSの入れ直しも何度かやりましたが,改善せず。
今日たどりついた対策は以下。シェルファイルを以下のようにします。
#!/bin/bash
#PBS -q default
#PBS -j oe
cd $PBS_O_WORKDIR
# Intel MPIのためのパス設定
source /opt/intel/oneapi/setvars.sh
mpirun -n 10 julia main.jl
nodes=1:ncpus=10の設定を削除しました。こうするとコンソールから直接実行したときと同程度の時間で実行できます。なぜこれでいいのかはよくわかってません。
qstatで状況確認すると,コア数指定してないので,1コアだけ使用しているように見えますが,psコマンドでみると,10並列で計算していることが確認できました。
問題は,ジョブスケジューリング上は1コアしか使ってないようになっていますが,実際は10コアつかってるので,他のジョブが入ってくると,性能が落ちる可能性が高いことです。1つのコアで複数ジョブの計算を行う可能性が高いため。
1ノード専有して,使用するコア数を指定しない計算とかだと問題ないですが,研究室の共有クラスタマシンとかだと問題になりそう。
シェルファイルで専有するコア数を決めると,MPI.jlの処理とかちあって,性能が落ちているのだろうと想像しますが,よくわかりません。