はじめに
OpenMXのバージョン3.7がリリースされました。 これまでのバージョンに比べていくつかインストール環境に対する変更があるので、改めてここに纏めます。 本バージョンでの変更点はだいたい次の点です:- 速い!
- 色々と機能も増えた
- Cコンパイラに加えてFORTRANコンパイラも必要
今回の想定環境
あくまでこのメモを書くに当たりテストした環境です。環境1
- マシン:Intel Xeon E5-2600系列, 64GB
- OS:CentOS 6.2
- OpenMXのversion:3.7
環境2(ACML4.4用)
- マシン:Intel Xeon W5590系列
- OS:CentOS 5.x
- GCC: 4.1.2
- OpenMXのversion:3.7
コンパイラ&ライブラリの設定
環境によって、コンパイラの設定は細かく違います。 以下の情報を参考に色々工夫してみてください。 Intel製のCPUを使う場合、一番のお勧めはIntelコンパイラです。 GNUのコンパイラを使う場合、yum標準のLAPACKよりも後述のACMLの方が早いです。インテルコンパイラ+インテルMKLを使う場合
中には無料の"non-commertial"版もありますが、「アカデミック用途でも使用禁止」っぽいので、注意してください。 まずはインテルコンパイラを使う場合には、iccとifortの両方をインストールしてください。 さらに、MKLもインストールしてあることとします。- Cコンパイラ:インテル C++ Composer XE 2013 (icc)
- FORTRANコンパイラ:インテル Visual Fortran Composer XE 2013 (ifort)
- LAPACK, BLAS, FFTW:インテル MKL 11.0
icc -v ifort -v |
GNUコンパイラの場合+yum標準LAPACKを使う場合
インテルコンパイラを使いたくない場合は、LINUX環境ですとGNUのgccとgfortranという無料コンパイラがあります。でその場合はLAPACK, BLAS, FFTWを自前で揃えるという作業が増えます。 ただし、yum標準のLAPACK, BLASは遅いので、後に紹介するAMD製のBLAS,LAPACKパッケージであるACMLをお勧めします。 しかしまずここでは、yum標準のBLAS,LAPACKを使ったインストールを紹介します。- Cコンパイラ:GNUのgcc
- FORTRANコンパイラ:GNUのgfortran
- LAPACK, BLAS, FFTW:CentOSの標準インストールから
yum -y install gcc *c++ |
yum -y install *fortran |
yum -y install lapack lapack-devel blas blas-devel fftw fftw-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 -v |
- gcc4.6.x以降:ACML最新版(執筆時点で5.3.1)
- gcc4.4.x以前:ACML4.4
- acml-4-4-0-gfortran-32bit.tgz
- acml-4-4-0-gfortran-64bit.tgz
- acml-4-4-0-gfortran-64bit-int64.tgz
tar xvfz acml-4-4-0-gfortran-64bit.tgz su (ここでスーパーユーザーになる) ./install-acml-4-4-0-gfortran-64bit.sh (以後は指示に従う) exit (ここでスーパーユーザーから戻る) |
#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コマンドとして次のようになっていると仮定して進めていきます。- MPI上のCコンパイルコマンド:mpicc
- MPI上のFORTRANコンパイルコマンド:mpif90
- MPI上のjob実行コマンド:mpiexec
OpenMXのインストール
まず、公式サイト(http://www.openmx-square.org/)からOpenMXの最新版をDLします。 また、同じ場所に修正パッチあるので、それもダウンロードします。 ファイル名は- メインソース:openmx3.7.tar.gz
- パッチ:patch3.7.*.tar.gz
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並列数を多目にして誤魔化します。 まあでも速度は環境に寄ります。ほんとうに、ほんとうに。