FrontISTR 5.0 のコンパイル方法 (Intel MKL + Intel MPI版)
FrontISTR 5.0 のコンパイル(Intel MKL + Intel MPI版)
はじめに
FrontISTR 5.0をIntel MKLとIntel MPIを使ったインストール方法を説明します。
FrontISTRは、FrontISTR-Commonsで開発が進められている、有限要素法の構造解析プログラムです。
UbuntuとCentOSで手順が違う箇所は別々に記述します。
また、公式ダウンロードサイト からは docker イメージや Windows10用のバイナリもダウンロードすることが出来ます。面倒な方はこちらをご利用ください。
その他のインストール方法や使い方は、公式マニュアル がありますので、こちらも参考にして下さい。
準備
バイナリパッケージのインストール (Ubuntu 18.04の場合)
$ sudo apt install build-essential curl cmake gfortran
バイナリパッケージのインストール(CentOS7.7の場合)
$ sudo yum groupinstall "Development Tools"
$ sudo yum install cmake
ただし、yum でインストールされる cmake のバージョンが古いため、Trilinosがコンパイル出来ません。https://www.cmake.org から最新版バイナリをダウンロードできますので、そちらの利用をお勧めします。
Intel プロダクトのインストール (Ubuntu18.04の場合)
Intel MKL/MPI は、サポートが無いバージョンを利用します。
また、簡単のためIntelで用意されている Ubuntu 用 DEB パッケージをインストールします。
$ curl -O https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
$ apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
$ curl -O https://apt.repos.intel.com/setup/intelproducts.list -o /etc/apt/sources.list.d/intelproducts.list
$ sudo apt update
してから
$ sudo apt install intel-mkl
と入力すると、現在サポートされている仮想パッケージの候補が表示されます。
パッケージ intel-mkl は、以下によって提供される仮想パッケージです:
intel-mkl-2019.5-075 2019.5-075
intel-mkl-2019.4-070 2019.4-070
intel-mkl-2019.3-062 2019.3-062
intel-mkl-2019.2-057 2019.2-057
intel-mkl-2019.1-053 2019.1-053
intel-mkl-2019.0-045 2019.0-045
intel-mkl-2018.4-057 2018.4-057
intel-mkl-2018.3-051 2018.3-051
intel-mkl-2018.2-046 2018.2-046
intel-mkl-2018.1-038 2018.1-038
intel-mkl-2018.0-033 2018.0-033
インストールするには、明示的にいずれかを選択する必要があります。
E: パッケージ 'intel-mkl' にはインストール候補がありません
この中でインストールしたい仮想パッケージを選択し、インストールします。この時点での最新版をインストールしてみましょう。
$ sudo apt install intel-mkl-2019.5-075
同様な手順で intel-mpi もインストールします。念のためintel-mklと同じリビジョンのものをインストールします。
$ sudo apt install intel-mpi
パッケージ intel-mpi は、以下によって提供される仮想パッケージです:
intel-mpi-2019.6-085 2019.6-085
intel-mpi-2019.5-075 2019.5-075
intel-mpi-2019.4-070 2019.4-070
intel-mpi-2019.3-062 2019.3-062
intel-mpi-2019.2-057 2019.2-057
intel-mpi-2019.1-053 2019.1-053
intel-mpi-2019.0-045 2019.0-045
intel-mpi-2018.4-057 2018.4-057
intel-mpi-2018.3-051 2018.3-051
intel-mpi-2018.2-046 2018.2-046
インストールするには、明示的にいずれかを選択する必要があります。
E: パッケージ 'intel-mpi' にはインストール候補がありません
$ sudo apt install intel-mpi-2019.5-075
Intel プロダクトのインストール(CentOS7の場合)
また、簡単のためIntelで用意されている RedHat 用 RPM パッケージをインストールします。
$ sudo yum-config-manager --add-repo https://yum.repos.intel.com/setup/intelproducts.repo
$ sudo rpm --import https://yum.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
Intel-MKLとIntel-MPIを同時に使う場合、バージョン番号が一致している必要があるようなので、バージョン番号を明示してインストールします。
$ sudo yum install intel-mkl-2018.4
$ sudo yum install intel-mpi-2018.4
コンパイル環境の設定と確認
ここからの手順は Ubuntu/CentOS 共に同じです。
Intel MKLやIntel MPIを利用する前に以下のシェルスクリプトを実行してください。
$ source /opt/intel/bin/compilervars.sh intel64
$ source /opt/intel/compilers_and_libraries/linux/mpi/intel64/bin/mpivars.sh intel64
環境設定が出来たか確認してください。
$ echo $I_MPI_ROOT
/opt/intel/compilers_and_libraries_2019.5.281/linux/mpi
$ echo $MKLROOT
/opt/intel/compilers_and/libraries_2019.5.281/linux/mkl
以上の環境変数が設定されていれば、コンパイルの準備は完了です。
コンパイル
ライブラリのダウンロード
FrontISTRをコンパイルするには、以下のライブラリが必要になります。
名前 | ダウンロード先 |
---|---|
FrontISTR_V50.tar.gz | https://www.frontistr.com/ |
REVOCAP_Refiner-1.1.04.tar.gz | http://www.frontistr.com/ |
metis-5.1.0.tar.gz | http://glaros.dtc.umn.edu/gkhome/metis/metis/download |
MUMPS_5.1.2.tar.gz | http://mumps.enseeiht.fr/ |
Trilinos-trilinos-12.18.1-release-12-18-1.zip | https://github.com/trilinos/Trilinos/tree/trilinos-release-12-18-1 の 「Download ZIP」から |
LAPACK, ScaLAPACKは、バイナリでインストールした MKL パッケージに入っていますので、これを利用します。
ダウンロードしたファイルは $HOME/work
へ保存し、コンパイルします。
また、コンパイルしたライブラリを $HOME/local
以下にコピーするためディレクトリを作成しておきます。
また、MKLを導入することにより
!SOLVER, METHOD=MKL
と指定して、MUMPS以外の直接法ソルバーを使うことが出来るようになります。
$ cd $HOME
$ mkdir -p local/bin
$ mkdir local/include
$ mkdir local/lib
$ export PATH=$HOME/local/bin:$PATH
REVOCAP_Refiner のコンパイル
$ tar xvf REVOCAP_Refiner-1.1.04.tar.gz
$ cd REVOCAP_Refiner-1.1.04
$ make
$ cp lib/x86_64-linux/libRcapRefiner.a $HOME/local/lib
$ cp Refiner/rcapRefiner.h $HOME/local/include
Metisのコンパイル
$ cd $HOME/work
$ tar xvf metis-5.1.0.tar.gz
$ cd metis-5.1.0
$ make config prefix=$HOME/local cc=gcc openmp=1
$ make
$ make install
MUMPSのコンパイル
インテル用のテンプレートを、Makefile.inc
としてコピーします。
$ cd $HOME/work
$ tar xvf MUMPS_5.1.2.tar.gz
$ cd MUMPS_5.1.2
$ cp Make.inc/Makefile.INTEL.PAR Makefile.inc
コピーした Makefile.inc
gcc/Intel MKL/Intel MPI用に編集します。
LMETISDIR = $(HOME)/local
IMETIS = -I$(LMETISDIR)/include
LMETIS = -L$(LMETISDIR)/lib
ORDERINGSF = -Dprod -Dmetis
CC = mpigcc
FC = mpifc
FL = mpifc
LIBOTHERS = -liomp5 -lpthread
OPTF = -O3 -DBLR_MT -fopenmp -DGEMM_AVAILABLE
OPTL = -O3 -fopenmp
OPTC = -O3 -I. -fopenmp
編集が済んだらコンパイルし、ライブラリ/ヘッダを $HOME/local
以下へコピーします。
$ make
$ cp lib/*.a $HOME/local/lib
$ cp include/*.h $HOME/local/include
Trilinosのコンパイル
$ unzip Trilinos-trilinos-12.18.1-release-12-18-1.zip
$ cd Trilinos-trilinos-release-12-18-1
$ mkdir build
$ cd build
$ cmake \
-DCMAKE_INSTALL_PREFIX=$HOME/local \
-DCMAKE_C_COMPILER=mpigcc \
-DCMAKE_CXX_COMPILER=mpigxx \
-DCMAKE_Fortran_COMPILER=mpifc \
-DTPL_ENABLE_MPI=ON \
-DTPL_ENABLE_LAPACK=ON \
-DTPL_ENABLE_SCALAPACK=ON \
-DTPL_ENABLE_METIS=ON \
-DTPL_ENABLE_MUMPS=ON \
-DTrilinos_ENABLE_ML=ON \
-DTrilinos_ENABLE_Zoltan=ON \
-DTrilinos_ENABLE_OpenMP=ON \
-DTrilinos_ENABLE_Amesos=ON \
-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES=OFF \
-DTPL_ENABLE_MKL=ON \
-DTPL_ENABLE_PARDISO_MKL=ON \
-DMKL_INCLUDE_DIRS="${MKLROOT}/include" \
-DMKL_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DPARDISO_MKL_INCLUDE_DIRS="${MKLROOT}/include" \
-DPARDISO_MKL_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DAmesos_ENABLE_PARDISO_MKL=ON \
-DMKL_INCLUDE_DIRS="${MKLROOT}/include" \
-DMKL_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DPARDISO_MKL_INCLUDE_DIRS="${MKLROOT}/include" \
-DPARDISO_MKL_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DAmesos_ENABLE_PARDISO_MKL=ON \
-DBLAS_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DLAPACK_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DSCALAPACK_LIBRARY_DIRS="${MKLROOT}/lib/intel64" \
-DBLAS_LIBRARY_NAMES="mkl_intel_lp64;mkl_gnu_thread;mkl_core" \
-DLAPACK_LIBRARY_NAMES="mkl_intel_lp64;mkl_gnu_thread;mkl_core" \
-DSCALAPACK_LIBRARY_NAMES="mkl_scalapack_lp64;mkl_blacs_intelmpi_lp64" \
..
$ make
$ make install
FrontISTRのコンパイル
$ tar xvf FrontISTR.tar.gz
$ cd FrontISTR
$ mkdir build
$ cd build
$ cmake \
-DCMAKE_INSTALL_PREFIX=$HOME/local \
-DCMAKE_PREFIX_PATH=$HOME/local \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-DBLAS_LIBRARIES="${MKLROOT}/lib/intel64/libmkl_intel_lp64.so;${MKLROOT}/lib/intel64/libmkl_gnu_thread.so;${MKLROOT}/lib/intel64/libmkl_core.so" \
-DLAPACK_LIBRARIES="${MKLROOT}/lib/intel64/libmkl_intel_lp64.so;${MKLROOT}/lib/intel64/libmkl_gnu_thread.so;${MKLROOT}/lib/intel64/libmkl_core.so" \
-DSCALAPACK_LIBRARIES="${MKLROOT}/lib/intel64/libmkl_scalapack_lp64.so;${MKLROOT}/lib/intel64/libmkl_intel_lp64.so;${MKLROOT}/lib/intel64/libmkl_gnu_thread.so;${MKLROOT}/lib/intel64/libmkl_core.so;${MKLROOT}/lib/intel64/libmkl_blacs_intelmpi_lp64.so;iomp5;pthread;m;dl" \
-DWITH_MKL=1 \
..
$ make -j4
$ make install
$(HOME)/local/bin
へ FrontISTR fistr1
がインストールされます。
念のため、各ダイナミックリンクライブラリーが正しいものをリンクしているかを確認してください。
$ ldd fistr1
linux-vdso.so.1 (0x00007fff48547000)
libmkl_intel_lp64.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/mkl/lib/intel64_lin/libmkl_intel_lp64.so (0x00007f254ed3d000)
libmkl_scalapack_lp64.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/mkl/lib/intel64_lin/libmkl_scalapack_lp64.so (0x00007f254e435000)
libmkl_blacs_intelmpi_lp64.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/mkl/lib/intel64_lin/libmkl_blacs_intelmpi_lp64.so (0x00007f254e1f3000)
libmkl_gnu_thread.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/mkl/lib/intel64_lin/libmkl_gnu_thread.so (0x00007f254c91a000)
libmkl_core.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/mkl/lib/intel64_lin/libmkl_core.so (0x00007f25485e9000)
libiomp5.so => /opt/intel/compilers_and_libraries_2019.5.281/linux/compiler/lib/intel64_lin/libiomp5.so (0x00007f25481f4000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2547fd5000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2547c37000)
libmpifort.so.12 => /opt/intel/compilers_and_libraries_2019.5.281/linux/mpi/intel64/lib/libmpifort.so.12 (0x00007f2547879000)
libmpi.so.12 => /opt/intel/compilers_and_libraries_2019.5.281/linux/mpi/intel64/lib/release/libmpi.so.12 (0x00007f2546874000)
libgfortran.so.4 => /usr/lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f2546495000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f254627d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2545e8c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f255088a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2545b03000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f25458ff000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f25456f7000)
libfabric.so.1 => /opt/intel/compilers_and_libraries_2019.5.281/linux/mpi/intel64/libfabric/lib/libfabric.so.1 (0x00007f25454bf000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f254527f000)
以上で FrontISTR 5.0のインストールは完了です。
テスト
最初に、チュートリアルを実行してみましょう。
OpenMP並列(共有メモリスレッド並列)
スレッド並列の問題を実行してみます。
CPUは4コアあり、4スレッド並列実行をする場合、
$ cd FrontISTR/tutorial/01_elastic_hinge
$ fistr1 -t 4
のようになります。
-t
の後にスペースを空けて並列数を整数で指定します。
OpenMP並列で解析した結果。Paraviewで生成したVTKファイルのNodalMISESを表示し、変位は50倍に強調しました。
MPI並列(分散メモリプロセス並列)
複数のマシン間で並列実行する場合、MPI並列を使うことが有ります。
FrontISTRの場合、メッシュファイルを予め分割して計算をします。
$ cd FrontISTR/tutorial/02_elastic_hinge_parallel
$ hecmw_part1
分割されたら、mpirunでFrontISTRをMPIプロセスとして起動します。
$ mpiexec -np 4 fistr1 -t 1
上記のコマンドラインは、MPIプロセスを4、各マシンで1スレッドと指定しています。
MPI並列で解析した結果。Paraviewで生成したVTKファイルのNodalMISESを表示し、変位は50倍に強調しました。
Author And Source
この問題について(FrontISTR 5.0 のコンパイル方法 (Intel MKL + Intel MPI版)), 我々は、より多くの情報をここで見つけました https://qiita.com/michioga/items/3ef75c1d8e41ab22d176著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .