はじめに
FrontISTRはintel Math Kernel Libraly(MKL)のPardisoソルバインターフェースを持っています。Pardisoはスレッド並列ながら非常に高速な直接法ソルバであり、こちらを用いると商用コードと遜色ない計算速度を得られます。
intelコンパイラは有償ですが、MKL自体は無償配布されていますので、使わない手はありませんね。早速使い方を見ていきましょう。
なお、ノード間並列計算を行いたい場合はcluster pardisoを使いますが、こちらは別記事で扱います。また、現状のFrontISTRのcluster pardiso対応は、接触解析で使えないなど限定的です。
intel MKLを入手する(無償)
APTで簡単にインストールができます。素晴らしい解説Qiita記事:
「Intel MKLをAPTでインストールする」
https://qiita.com/ymzkd/items/55a9c936df60394572fc
YUMコマンドなどでもできるそうです。こちらはintel公式を参照ください:
https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries
の「Free Intel Performance Libraries for Everyone」
以下はUbuntu & APTでインストールした場合を想定して説明します
FrontISTRのインストール
intelのドキュメントにも説明がありますが、コンパイラはLinuxであれば「GNU Compiler Collection 4.4 and later」でOKです。
https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-2019-system-requirements
環境設定スクリプトを忘れずにsourceしておきます。
source /opt/intel/mkl/bin/mklvars.sh intel64
など。
v4.6以前のバージョンであれば、以下記事「オープンソース大規模並列FEM非線形構造解析プログラム FrontISTR v4.6のインストール (ubuntu 16.04 LTS)」
https://qiita.com/michioga/items/b9bc6d5c04318b107714
の手順において、Makefile.confを
MKLDIR = $MKLROOT
F90FLAGS = -m64 -I${MKLROOT}/include
F90LDFLAGS = -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed
-lmkl_gf_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl
と修正し、./setup.shに「--with-mkl」オプションを追加して実行の上、makeします。
v5.0alpha以降でcmakeが使える場合は、cmake実行時に-DWITH_MKL=1を指定します(簡単!)。
お試し実行
pardisoソルバを使うには、!SOLVERキーワードのMETHODに「DIRECTmkl」を指定します。ただし、今のところpardisoソルバは接触解析でしか使えません。接触なしで使うには、実際には接触しない接触定義を作成して無理やり使うほかありません。この辺は要改善ですね。
接触解析のチュートリアルで試してみましょう。
FrontISTR/tutorial/10_contact_2tubes
解析制御ファイル「2tubes.cnt」の!SOLVERキーワードを以下のように編集します。
!SOLVER,METHOD=DIRECTmkl
一応、スレッド並列数も設定しておきましょう。何も指定しない場合、スレッド数は使用できる最大の数となります。
export OMP_NUM_THREADS=8
export MKL_NUM_THREADS=8
FrontISTRのビルド時にopenmpも有効にしておけば、線形ソルバ部分以外もスレッド並列化されますよ。
tutorial/10_contact_2tubesディレクトリでfistr1コマンドを実行します。
うまく使えていれば標準出力に下記のようなメッセージが繰り返し登場するはずです。
[Pardiso_MKL]: Initialization completed !
[Pardiso_MKL]: Factorization completed !
[Pardiso_MKL]: Solve completed ...
筆者のノートPC(intel Core i5-8250U CPU @ 1.60GHz)での実行時間は約13秒でした。
====================================
TOTAL TIME (sec) : 13.67
pre (sec) : 0.04
solve (sec) : 13.63
====================================
4000節点で22回線形ソルバ実行した結果です。たぶん速い結果だと思うのですが、問題規模が小さくてよくわかりませんね。ぜひ、大きな問題で試してみてください。
参考
MKLのリンクオプション確認は下記サイトが便利です。
https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor