HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

MPIライブラリ毎のコンパイラ指定方法

たいていのMPIライブラリには、伝統的にmpi{cc,f90,cxx}といったコンパイラのラッパーが付いています。-Iとか-Lとか-lを適当に設定したうえで、コンパイラを呼び出してくれる便利なものですが、
これが最終的に呼び出すコンパイラを切り替える方法がライブラリによってバラバラなので、ざっくりとまとめておきます。

IntelMPIの場合

コマンド名で呼び出すコンパイラを切り替えています。
mpicc: gcc or cc
mpicxx: g++
mpifc: gfortran
mpigcc: gcc
mpigxx: g++
mpif77: g77
mpif90: gfortran
mpiicc: icc
mpiicpc: icpc
mpiifort: ifort

gccのかわりにgcc44とかを呼びだければPATHの設定で先にくるようにしておけば良いはず*1

mpich2, mpich, mvapich2の場合

mpicc,mpicxx,mpif77,mpif90に対してオプションを指定するか、環境変数でコマンド名を設定します。
mpicc: -cc={コンパイラ名} or MPICH_CC
mpicxx: -cxx={コンパイラ名} or MPICH_CXX
mpif77:-f77={コンパイラ名}, -fc={コンパイラ名} or MPICH_F77
mpif90 :-f90={コンパイラ名} or MPICH_F90

mvapich2も指定する環境変数はMPICH_XXなので注意*2
mpich3は未調査ですが、たぶん変わっていないでしょう。

OpenMPIの場合

環境変数でコマンド名を設定します。
mpicc: OMPI_CC
mpicxx: OMPI_CXX
mpif77: OMPI_F77
mpif90: OMPI_FC


使い方

IntelMPIみたいにコマンド名自体が違う場合や、mpich系のオプション指定を使う方法では、あまり気にしなくても良いんですが、環境変数コンパイラを切り替える場合はmakefileがからむとちょっと面倒です。
駄目な例

OMPI_CC=icc
CC=mpicc

動作する例

CC="env OMPI_CC=icc mpicc"

要はmakefile内で環境変数を設定する方法が無いってのが問題なんですが、CCにenvを渡せば一応解決できます。*3
一時的に変更するのであれば、makeを実行するシェル上で環境変数を設定しても良いのですが、この設定を前提にコンパイル手順を決めると

「この前までコンパイルできたのに、今日はコンパイルできない!」

とかいう間抜けな事態が発生するので、美しくないけどmakefile内に書いてしまうことをお勧めします。

*1:たぶん。

*2:と思ったけど、今どきmvapichを使ってるとこも無いか。

*3:が、もの凄い違和感がある