OpenMXのコンパイル方法

Truong Vinh Truong Duy(The University of Tokyo)
2014/10/10

OpenMXのダウンロード
1. OpenMXのダウンロード% wget http://www.openmx-square.org/openmx3.7.tar.gz% tar openmx3.7.tar.gz

2. パッチのダウンロード% wget http://www.openmx-square.org/bugfixed/14Feb17/patch3.7.8.tar.gz% cp ./patch3.7.8.tar.gz openmx3.7/source% cd openmx3.7/source% tar zxvf patch3.7.8.tar.gz

3. これから、OpenMXのコンパイルへ

2

OpenMX Ver.3.7のコンパイル
1. openmx3.7/source/makefileのCC,FC,LIBを適切に設定する
CC: C コンパイラ
FC: Fortran コンパイラ
LIB: FFTライブラリ, LAPACKとBLASライブラリ

2. コンパイル% make3. インストール% make install

4. 実行ファイル
openmx3.7/work/openmx

3CC,FC,LIBの基本的な設定
FFTROOT=/path/to/fft/folder (FFTライブラリ）
LBSROOT=/path/to/lapack/and/blas/folder (LAPACKとBLASライブラリ）
openmp_flag = -openmp(インテルコンパイラ）
openmp_flag = -fopenmp(GNUコンパイラ）
openmp_flag = -mp -Dnosse (PGIコンパイラ）
fortran_lib = -lifcore(インテルコンパイラ）
fortran_lib = -lgfortran(GNUコンパイラ）
fortran_lib = -pgf90libs(PGIコンパイラ）

CC＝mpicc -O3 openmp_flag-I/$(FFTROOT)/include ¥-I/$(LBSROOT)/include
FC＝mpif90 -O3 -I/$(LBSROOT)/include
LIB＝-L/$(FFTROOT)/lib -lfftw ¥-L/$(LBSROOT)/lib -llapack –lblas ¥fortran_lib4

サンプル1：インテルコンパイラとMKLライブラリ

FFTROOT=/usr/local/fftw3 (FFTライブラリ）
LBSROOT=/opt/intel/mkl(MKLのLAPACKとBLASライブラり）
openmp_flag = -openmp(インテルコンパイラ）
fortran_lib = -lifcore(インテルコンパイラ）
CC＝mpicc -O3 -openmp ¥-I/$(FFTROOT)/include ¥-I/$(LBSROOT)/include
FC＝mpiifort -O3 -I/$(LBSROOT)/include
LIB＝-L/$(FFTROOT)/lib -lfftw3 ¥-L/$(LBSROOT)/lib/intel64 -lmkl_intel_lp64 ¥-lmkl_intel_thread -lmkl_core -lpthread ¥-lifcore5サンプル2：PGIコンパイラとACMLライブラリ

FFTROOT=/usr/local/fftw3(FFTライブラリ）
LBSROOT=/usr/local/acml/gnu64 (ACMLのLAPACKとBLASライブラり）
openmp_flag = -mp -Dnosse(PGIコンパイラ）
fortran_lib = -pgf90libs(PGIコンパイラ）
CC＝mpicc -O3 -mp -Dnosse ¥-I/$(FFTROOT)/include ¥-I/$(LBSROOT)/include
FC＝mpif90 -O3 -I/$(LBSROOT)/include
LIB＝-L/$(FFTROOT)/lib -lfftw3 ¥-L/$(LBSROOT)/lib/ -lacml ¥-pgf90libs
6サンプル3：GNUコンパイラとMKLライブラリ

FFTROOT=/usr/local/fftw3
LBSROOT=/opt/intel/mkl
openmp_flag = -fopenmp
fortran_lib = -lgfortran(FFTライブラリ）(MKLのLAPACKとBLASライブラり）(GNUコンパイラ）(GNUコンパイラ）

CC＝mpicc -O3 -fopenmp ¥-I/$(FFTROOT)/include ¥-I/$(LBSROOT)/include
FC＝mpif90 -O3 -I/$(LBSROOT)/include
LIB＝-L/$(FFTROOT)/lib -lfftw3 ¥-L/$(LBSROOT)/lib/intel64 -lmkl_intel_lp64 ¥-lmkl_intel_thread -lmkl_core -lpthread ¥-lgfortran7

サンプル4：GNUコンパイラとACMLライブラリ

FFTROOT=/usr/local/fftw3(FFTライブラリ）
LBSROOT=/usr/local/acml/gnu64 (ACMLのLAPACKとBLASライブラり）
openmp_flag = -fopenmp (GNUコンパイラ）
fortran_lib = -lgfortran(GNUコンパイラ）
CC＝mpicc -O3 -fopenmp ¥-I/$(FFTROOT)/include ¥-I/$(LBSROOT)/include
FC＝mpif90 -O3 -I/$(LBSROOT)/include
LIB＝-L/$(FFTROOT)/lib -lfftw3 ¥-L/$(LBSROOT)/lib/ -lacml ¥-lgfortran8

役に立つコマンド コンパイラが分からないとき%mpicc -compile-info(MPICHの場合)%mpicc -help(OpenMPIの場合)
 フォートランライブラリが見つからないとき/usr/bin/ld: cannot find -lifcore(インテルコンパイラ)/usr/bin/ld: cannot find -lpgf90(PGIコンパイラ)/usr/bin/ld: cannot find -lgfortran (GNUコンパイラ)
まず、コンパイラのフォルダーを探す%which ifort(インテルコンパイラ)/opt/intel/fce/10.0.026/bin/ifort%which pgf90(PGIコンパイラ)/opt/pgi/linux86-64/7.0/bin/pgf90%which gfortran (GNUコンパイラ)/usr/bin/gfortran
次に、LIBに追加
LIB= ... -L/opt/intel/fce/10.0.026/lib -lifcore (インテルコンパイラ)
LIB= ... -L/opt/pgi/linux86-64/7.0/lib -pgf90libs (PGIコンパイラ)
LIB= ... -L/usr/lib -lgfortran (GNUコンパイラ)
9よく出るエラーメッセージ1
 オブジェクトファイルがありません

gcc: openmx.o: No such file or directorygcc: openmx_common.o: No such file or directory………

OR
icc: error #10236: File not found: 'elpa1.o'
icc: error #10236: File not found: 'solve_evp_real.o'
icc: error #10236: File not found: 'solve_evp_complex.o‘………


原因：（１） openmp_flagが違う、または、（２）mpicc、mpif90が違う

解決法（１） openmp_flagをチェック
openmp_flag = -openmp(インテルコンパイラ）
openmp_flag = -fopenmp(GNUコンパイラ）
openmp_flag = -mp -Dnosse (PGIコンパイラ）

（２）mpicc、mpif90をチェック（mpiccでなくmpiicc、mpipgcc。 mpif90でなく
mpiifort、mpifc77、mpipgf77 、mpipgf90など ）10よく出るエラーメッセージ2
 MPIフォートランライブラリが見つかりません
elpa1.o: In function `elpa1_mp_tridiag_real_':elpa1.f90:(.text+0x2b7): undefined reference to `mpi_comm_rank_'
elpa1.f90:(.text+0x2d6): undefined reference to `mpi_comm_size_'
elpa1.f90:(.text+0x2f5): undefined reference to `mpi_comm_rank_'
elpa1.f90:(.text+0x314): undefined reference to `mpi_comm_size_‘………

 原因：リンクをするとき、CコンパイラがMPIフォートランライブ

ラリを見つけられない。特に、インテルコンパイラによく起こる問題。
 解決法- LIBにMPIフォートランライブラリを追加
LIB = ... -lmpi_f77 -lmpi_f90 -lifcore11よく出るエラーメッセージ3
 OpenMPランタイムライブラリが見つかりません/libmkl_intel_thread.a(dgeqrf_par.o): In function `mkl_lapack_dgeqrf':__tmp_par_dgeqrf_omp.f:(.text+0x730): undefined reference to`__kmpc_critical'__tmp_par_dgeqrf_omp.f:(.text+0x833): undefined reference to `__kmpc_flush'__tmp_par_dgeqrf_omp.f:(.text+0x85c): undefined reference to `__kmpc_flush'__tmp_par_dgeqrf_omp.f:(.text+0xa32): undefined reference to `__kmpc_flush'………
libmkl_intel_thread.a(zher2k_drv.o): In function `mkl_blas_zher2k':../../../../blas/thread/32e/level3/zher2k.c:(.text+0x66b): undefinedreference to `__kmpc_global_thread_num'../../../../blas/thread/32e/level3/zher2k.c:(.text+0x68b): undefinedreference to `__kmpc_ok_to_fork'../../../../blas/thread/32e/level3/zher2k.c:(.text+0x6aa): undefinedreference to `__kmpc_push_num_threads'

 原因：リンクをするとき、CコンパイラがOpenMPランタイムライ

ブラリを見つけられない。特に、MKLライブラリによく起こる問
題。
 解決法

- LIBにOpenMPランタイムライブラリを追加
LIB = ... -liomp5 -lpthread12よく出るエラーメッセージ4
 MKLライブラリが見つかりません/usr/bin/ld: cannot find -lmkl_intel_lp64
collect2: ld returned 1 exit status
make: *** [openmx] Error 1
 原因：リンクをするとき、CコンパイラがダイナミックにMKLライブラリを見つけられない。特に、MKLライブラリによく起こる問題。
 解決法- LIBのMKLイブラリ部分をダイナミックからスタティックに変更
LIB＝-L/$(FFTROOT)/lib -lfftw3 ¥-L/$MKLROOT/lib/intel64 -Wl,--start-group$(MKLROOT)/lib/intel64/libmkl_lapack95_lp64.a ¥$(MKLROOT)/lib/intel64/libmkl_intel_lp64.a¥$(MKLROOT)/lib/intel64/libmkl_intel_thread.a¥$(MKLROOT)/lib/intel64/libmkl_core.a -Wl,--end-group ¥-lifcore13困ったとき14