ログインシェルが bash/sh 以外で MPI のプログラムを動かすときに環境変数が渡らないときは

最近,研究室の環境も zsh で動かしています.

しかし,MPI のプログラムを走らせるときにどうしても環境変数に頼ってしまう部分があって,そのままプログラムを実行すると環境変数が他のノードに渡らなくてプログラムがクラッシュします.(もしかしたら実装の問題かも? MVAPICH2 を動かしていて起きましたが OpenMPI でも同じような問題で ML が流れていた気が)

環境変数に頼らないといけない部分というのは,例えばライブラリの実行パスとかですね.コンパイラ,Boost, MPI とか複数のバージョンの組み合わせを行う必要があるときにどうしても必要でして.僕の場合は普段は変更しないパラメータを環境変数にしてたりして.

mpirun_rsh に環境変数を渡す,という方法はありますがちょっと多すぎて設定が辛い.

色々調べたら MVAPICH2 の場合,mpirun_rsh でラップしたシェルスクリプトを実行すれば良いらしい.

$ cat run.zsh
#! /bin/zsh

# 実行時に必要な環境変数等
LD_LIBRARY_PATH=...:$LD_LIBRARY_PATH
OMP_NUM_THREADS=16

# 第1引数に実行ファイルが指定されているとして
./$@

こんなシェルスクリプト書いて,実行は

$ mpirun_rsh -hostfile ${HOSTFILE} -np ${NHOSTS} run.zsh a.out a b c

とすると run.zsh環境変数が設定されて a, b, c が a.out に引数として渡される.

よく考えると MPI は bash/sh ぐらいでしか実行してない雰囲気は感じる.検索してもあまりそういう情報がなかったのもそういうことな気がする.