OpenMX (ver.3.7) のインストール

はじめに

OpenMXのバージョン3.7がリリースされました。 これまでのバージョンに比べていくつかインストール環境に対する変更があるので、改めてここに纏めます。 本バージョンでの変更点はだいたい次の点です:
  1. 速い!
  2. 色々と機能も増えた
  3. Cコンパイラに加えてFORTRANコンパイラも必要
前二つは主に宣伝ですが、最後の一つがインストール時の最大のポイントになります。 では行きましょう。

今回の想定環境

あくまでこのメモを書くに当たりテストした環境です。

環境1

環境2(ACML4.4用)

コンパイラ&ライブラリの設定

環境によって、コンパイラの設定は細かく違います。 以下の情報を参考に色々工夫してみてください。 Intel製のCPUを使う場合、一番のお勧めはIntelコンパイラです。 GNUのコンパイラを使う場合、yum標準のLAPACKよりも後述のACMLの方が早いです。

インテルコンパイラ+インテルMKLを使う場合

中には無料の"non-commertial"版もありますが、「アカデミック用途でも使用禁止」っぽいので、注意してください。 まずはインテルコンパイラを使う場合には、iccとifortの両方をインストールしてください。 さらに、MKLもインストールしてあることとします。 MKLはC++ Composerに付属します。結局FORTRANも使うことを考えると、C++とFORTRANがセットになっている"インテル Composer XE 2013"を買うのがいいのでしょうね。これらのインストール方法はここでは省略します。 iccとifortがうまくインストールされ、正しくパスが通っている場合は次のコマンドでバージョンが表示されるはずです。
icc -v
ifort -v

GNUコンパイラの場合+yum標準LAPACKを使う場合

インテルコンパイラを使いたくない場合は、LINUX環境ですとGNUのgccとgfortranという無料コンパイラがあります。でその場合はLAPACK, BLAS, FFTWを自前で揃えるという作業が増えます。 ただし、yum標準のLAPACK, BLASは遅いので、後に紹介するAMD製のBLAS,LAPACKパッケージであるACMLをお勧めします。 しかしまずここでは、yum標準のBLAS,LAPACKを使ったインストールを紹介します。 インストールはスーパーユーザーで行いましょう。 gccのインストールは次のようにします(必要な場合のみ)
yum -y install gcc *c++
ここでC++もインストールしたのは、おそらくMPIのインストール時に必要になると思われるためです。 続いてgfortranのインストールは次のようにします(必要な場合のみ)
yum -y install *fortran
LAPACK, BLAS, FFTWをインストールします。
yum -y install lapack lapack-devel blas blas-devel fftw fftw-devel
ここで、fftw-develを指定しないと、コンパイル時に必要なヘッダーファイル"fftw3.h"がインストールされませんので注意してください。また、今回試した限りではlapackやblasも-devel版をインストールしないと最後のコンパイル時にリンクエラーになりました。 また、これらライブラリに関しても、「コンパイラやコンパイル引数をもっと調整して高速計算を実現したい」って人は、独自にソースファイルを持ってきてコンパイルしてください。 以上でコンパイラとライブラリの設定は終わりです。 また、パスを通しておいてください。

GNUコンパイラの場合+AMD製ACMLを使う場合

yum標準のLAPACKは遅いので、代替策としてAMD製のACMLがお勧めです。 一応無料のライブラリの様です。 ACMLのwebサイトはこのメモを執筆時点で次の場所です
http://developer.amd.com/tools-and-sdks/cpu-development/amd-core-math-library-acml/
ここではコンパイラはGNUのものを使うので、上記と同じくインストールしましょう。
yum -y install gcc *c++ *fortran
ここで、インストールされたgccおよびgfortranのバージョンを調べてください。
gcc -v
この時のバージョンによって、使用するACMLのバージョンを変えてください。 だいたい次の通りです。 ここでは古い環境(先の環境2を想定)にACML4.4を例にインストールしてみます。最新版でもバージョン番号以外ほとんど同じです。 まず、先に紹介したACMLのサイトよりパッケージをダウンロードします。 このとき、GNUコンパイラ用には、 の三つがありますが、今回は64ビット環境なので二番目の"acml-4-4-0-gfortran-64bit.tgz"を選びます。3番目のものは、整数型のintを32bitで扱うか64bitで扱うかの違いで選ぶようです。 インストールはとても簡単。以下の手順だけ。
tar xvfz acml-4-4-0-gfortran-64bit.tgz
su      (ここでスーパーユーザーになる)
./install-acml-4-4-0-gfortran-64bit.sh   (以後は指示に従う)
exit     (ここでスーパーユーザーから戻る)
このようにシェルの実行で指示通りインストールするだけです。 今回は標準ディレクトリ位置である"/opt/acml4.4.0/"にインストールしたとして 話を進めます。 "/opt/acml4.4.0/"以下には、"gfortran64"や"gfortran64_mp"など、末尾に色々記号が付いたディレクトリが作られていると思います。 これらは、スレッド並列の有無、FMA4の有無などで使い分けるようです。 今回はopenmp並列したいので、"gfortran64_mp"を選び、LD_LIBRARY_PATHなどに加えておきましょう。
#cshの場合
setenv LD_LIBRARY_PATH /opt/acml4.4.0/gfortran64_mp/lib:$LD_LIBRARY_PATH

#bachの場合
export LD_LIBRARY_PATH=/opt/acml4.4.0/gfortran64_mp/lib:$LD_LIBRARY_PATH

MPIのインストール

上記でインテルかGNUかどちらのコンパイラを使うかによりますが、それに合わせたMPIライブラリをインストールしておいてください。スパコンやクラスタ環境によっては既にインストール済みの場合もあります。インストール方法は他に詳しいサイトがたくさんあるのでここでは省略します。 ここではMPIコマンドとして次のようになっていると仮定して進めていきます。 これらはmpiexec→mpirun、mpif90→mpiifortなど適宜読み替えてください。 インストールが終わったら、libの場所などはLD_LIBRARY_PATHに追加しましょう。

OpenMXのインストール

まず、公式サイト(http://www.openmx-square.org/)からOpenMXの最新版をDLします。 また、同じ場所に修正パッチあるので、それもダウンロードします。 ファイル名は かと思います。*の部分にはサブマイナーバージョンの数字が入ります。このメモ執筆時点で3です。 これらを解凍してマージします。

tar xvfz openmx3.7.tar.gz
cd openmx3.7/source
tar xvfz ../../patch3.7.*.tar.gz

ここで、patchの解凍は必ずsourceディレクトリ下で行ってください。 ここでいよいよコンパイルします。 ここでmakefileの内容を環境に合わせて修正します。 といっても、"CC", "FC", "LIB"の三か所だけです。 使用するコンパイラやマシン環境に合わせて下記を参考に書き変えてください。 公式マニュアルやmakefile内にコメント行として記してあるサンプルも参考になります。

vi makefile
#以下はmakefile内部###############

#Intel MKLを使ってopenmp並列する場合(mpiccがiccのラッパーになっている場合),2013/11/27一部修正
CC = mpicc -O3 -xHOST -openmp -ip -no-prec-div -mkl=parallel -I$(MKLROOT)/include/fftw -shared-intel
FC = mpif90 -O3 -xHOST -openmp -ip -no-prec-div -mkl=parallel -I$(MKLROOT)/include/fftw -shared-intel
LIB = -L$(MKLROOT)/lib/intel64 -lmpi_f90

#GNUコンパイラ+yum標準のLAPACK,BLAS,FFTWを使う場合
CC = mpicc -m64 -fopenmp -O3 -I/usr/include
FC = mpif90 -m64 -fopenmp -O3 -I/usr/include
LIB = -L/usr/local/lib -L/usr/lib64 -lfftw3 -lblas -llapack -lmpi_f90
#もしくは
#LIB = -L/usr/local/lib -L/usr/lib64 -lfftw3 -lblas -llapack -lmpi_f90

#GNUコンパイラ+ACML4.4のLAPACK,BLAS+標準のFFTWを使う場合
CC = mpicc -m64 -fopenmp -O3 -I/usr/include
FC = mpif90 -m64 -fopenmp -O3 -I/usr/include
LIB = -L/opt/acml4.4.0/gfortran64_mp/lib -lacml_mp -lpthread -lfftw3 -lmpi_f90

#何らかの事情があってMKL版ScaLAPACKをリンクしたい人
LIB = -L$(MKLROOT)/lib/intel64 -lmkl_scalapack_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_openmpi_lp64 -lpthread -lm -lmpi_f90

ここで、LIBに書いてある"-lmpi_f90"はCとFORTRANを混在させるためのおまじないですが、 これはMPIライブラリとして"OpenMPI"を使った場合のものです。
(追記:2015/02/16)OpenMPIのversionが1.8.1以降では、-lmpi_f90(の実態であるlibmpi_f90.a or .so)がありません。 代わりに、" -lmpi_mpifh -lmpi_usempif08 "などと指定してください。
IntelMPIを使う場合には代わりに"-lifcore"と書きます。 MPICH系だとどうなるのかは、情報を持っていません。 あとはmakeコマンドでコンパイルしましょう。

make
make install

これで、 無事に終わればopenmx3.7/work/openmxという名の実行ファイルが出来上がっているかと思います。 ここでの設定は、各自の環境に大きく依存しますので、うまくコンパイルできない場合は、LD_LIBRARY_PATHの設定や、以前にインストールした古いバージョンのライブラリとの競合など、 色々と試行錯誤してみてください。

テスト計算

サンプルの入力ファイルを使って、ソフトウェアの動作確認をしましょう。 openmx3.7/workに移動してテスト計算をしてみましょう。

cd ../work

openmx3.7/workには様々なサンプルの入力ファイルがあります。 ここではフラーレン(C60.dat)を対象にします。 並列実行の種類に合わせて次のように引数の指定を変えて実行します:

#未並列処理の場合
./openmx C60.dat

#openmpによるスレッド並列の場合(ここでは16並列)
./openmx C60.dat -nt 16

#MPIによる分散並列の場合(ここでは16並列)
mpiexec -np 16 ./openmx C60.dat

#MPIとopenmpiによるハイブリッド並列の場合(ここでは2*8並列)
mpiexec -np 2 ./openmx C60.dat -nt 8

変な設定がなければ、ちゃんとスレッド並列が効きますが、まれに環境によっては、インテルMKL利用時に次の環境変数をセットしておいた方がいい場合もあります。

setenv OMP_NUM_THREADS 8
setenv MKL_NUM_THREADS 8
mpiexec -np 2 ./openmx C60.dat -nt 8

これでC60.outが出力されていればインストール成功。 C60.xyzやC60.mdファイルとして原子の位置座標が、C60*.cubeファイルとして電子密度(Gaussian Cube File)が出力されます。 おめでとうございます。 ちなみに、MKLやACMLはスレッド並列がよく聞くので、"-nt"で指定するopenmpスレッド並列数を多目にした方が速いです。一方、yum標準のLAPACKはスレッド並列性能が低い(もしかして未並列なの?)ので、mpi並列数を多目にして誤魔化します。 まあでも速度は環境に寄ります。ほんとうに、ほんとうに。