More Related Content Similar to LexADV_TryDDM Ver. 0.1bの概要 (20) More from ADVENTURE Project (20) LexADV_TryDDM Ver. 0.1bの概要4. 領域分割法(DDM)
• 解くべき線形方程式
→ 領域分割による自由度並び替え
→ 式の分割
1. Schur補元方程式
2. 領域内部の方程式
𝐀𝐀𝐀𝐀 = 𝐛𝐛
𝐀𝐀II 𝐀𝐀IB
𝐀𝐀BI 𝐀𝐀BB
𝐱𝐱I
𝐱𝐱B
=
𝐛𝐛I
𝐛𝐛B
領域分割
𝐒𝐒𝐱𝐱B = 𝐠𝐠
𝐒𝐒 = 𝐀𝐀BB − 𝐀𝐀BI 𝐀𝐀II
†
𝐀𝐀IB,
𝐠𝐠 = 𝐛𝐛B − 𝐀𝐀BI 𝐀𝐀II
†
𝐛𝐛I
I: 領域内部自由度, B: 領域間境界上自由度
𝐀𝐀II 𝐱𝐱I = 𝐛𝐛I − 𝐀𝐀IB 𝐱𝐱B
(未知数𝐱𝐱B)
(未知数𝐱𝐱I)
5. DDMの実装
• 一般的な実装 (ADVENTUREなど)
– Schur補元行列を陰に構築
• 河合らによる実装 (ADV-K, '12)
– 部分領域(i)のローカルSchur補元行列を陽に構築
• 屋・荻野による実装 (LexADV_TryDDM, '13)
– 全体行列を陽に構築
𝐪𝐪 ← 𝐊𝐊BB − 𝐊𝐊BI 𝐊𝐊II
†
𝐊𝐊IB 𝐩𝐩
𝐪𝐪 ← �
i=1
N
𝐑𝐑 i T
𝐒𝐒 i
𝐑𝐑 i
𝐩𝐩
行列ベクトル積演算
行列ベクトル積演算
全体行列の成分が不明のため, 評価できる反復法・前処理法が限定される
ほとんどの反復法・前処理法が評価可能で, 新しい前処理の開発コストも低い
𝐪𝐪 ← 𝐒𝐒𝐒𝐒行列ベクトル積演算
7. ディレクトリ構成
• ライブラリに含まれるディレクトリ構成
– doc ... マニュアル
– lib ... ビルドされたライブラリがコピーされる
– samples ... サンプルデータ
– src
• common ... global/local共通のプログラムソース
• common-include ... global/local共通のヘッダーファイル
• global-schur-ver ... グローバル構築版
• local-schur-ver ... ローカル構築版
8. LexADV_TryDDM
FEM main-processing
処理の流れ
𝑨𝑨, 𝒃𝒃
𝑺𝑺, 𝒈𝒈
Domain
decomposition
FEM pre-processing
FEM post-processing
Assembly
Solver
𝒙𝒙
Reduction
Solver
Expansion
𝒙𝒙𝑩𝑩
𝒙𝒙
𝑨𝑨, 𝒃𝒃
Input
Output
𝒙𝒙
Input DD
メッシュの領域分割
ADVENTURE_Metis
領域分割メッシュ読み込み
ADVENTURE_IO
Schur補元方程式の構築
MUMPS
Schur補元方程式の求解
Lis
領域内部の方程式の求解
MUMPS
9. グローバル構築版とローカル構築版
𝐀𝐀 → [MUMPS] → 𝐒𝐒 = 𝐀𝐀BB − 𝐀𝐀BI 𝐀𝐀II
†
𝐀𝐀IB
グローバル構築版(global-schur-ver)
本来, DDMでは部分領域で並列性があるが, 組み立て済み方程式を入力
とする方法では不明な成分がある
𝐒𝐒 = �
i=1
N
𝐑𝐑B
i T
𝐀𝐀BB
i
− 𝐀𝐀BI
i
𝐀𝐀II
i
†
𝐀𝐀IB
i
𝐑𝐑B
i
MUMPSがマルチフロンタル法による並列行列分解と求解で構築
- 長所: 全体係数行列とベクトルを入力するのみで実装が容易
- 短所: 台数効果が低い
𝐀𝐀 = �
i=1
N
𝐑𝐑 i T 𝐀𝐀II
i
𝐀𝐀IB
i
𝐀𝐀BI
i
𝟎𝟎
𝐑𝐑 i
+
𝟎𝟎 𝟎𝟎
𝟎𝟎 𝐀𝐀BB
ローカル構築版(local-schur-ver)
→ [MUMPS] → 𝐒𝐒 i ′
= −𝐀𝐀BI
i
𝐀𝐀II
i
†
𝐀𝐀IB
i
MUMPSが局所Schur補行列を構築
- 長所: 台数効果が高い
- 短所: 実装が少し複雑になる
10. インストール手順: ADVENTURE
• ADVENTURE_IO
– 入出力ライブラリ
– Ver.1.2で動作確認
– ADVENTUREプロジェクト(日本)で開発
– ダウンロード
• http://adventure.sys.t.u-tokyo.ac.jp/
– ビルド方法
• (省略)
• ADVENTURE_Metis
– 領域分割ツール
– Ver.1.1の出力データに対応
– (省略)
12. インストール手順:Schur補元構築
• MUMPS
– 疎行列向け直接解法ライブラリ
– PARASOLプロジェクト(フランス)で開発
– Ver.4.10.0まで動作確認
– ダウンロード
• http://mumps.enseeiht.fr/
– 依存ライブラリ
• BLAS, BLACS, ScaLAPACK
netlib版, Intel MKL, 富士通SSL2で動作確認
– ビルド手順例
$ cp Make.inc/Makefile.generic Makefile.inc
$ vi Makefile.inc
$ make d
13. MUMPSの依存ライブラリについて
• netlib製を使う場合
以下のライブラリを順にビルド
• BLAS (http://www.netlib.org/blas/)
• LAPACK (http://www.netlib.org/lapack/)
• BLACS (http://www.netlib.org/blacs/)
• ScaLAPACK (http://www.netlib.org/scalapack/)
Makefile.incで以下を指定
SCLAP = -L$(dir)/lib -lscalapack -lmpiblacs ¥
-lmpiblacsF77int -lmpiblacs
LIBBLAS = -L$(dir)/lib -lblas
• Intel MKLを使う場合
SCLAP = -lmkl_scalapack_lp64 -lmkl_intel_thread ¥
-lmkl_core -lmkl_blacs_intelmpi_lp64 -lpthread
LIBBLAS =
• 富士通SSL2を使う場合
SCLAP = -SCLAPACK
LIBBLAS = -SSL2BLAMP
14. LexADV_TryDDMのビルド
• グローバル構築版
$ cd src/global-schur-ver
$ vi Makefile
$ make
$ ls ../../lib/
libtry_ddm_gl.a
• ローカル構築版
$ cd src/local-schur-ver
$ vi Makefile
$ make
$ ls ../../lib/
libtry_ddm_loc.a
15. Makefileの編集
#-----ADVENTURE------------------
ADVIO_DIR =
ADVIO_CONFIG = $(ADVIO_DIR)/bin/advsys-config
ADVIO_INCLUDES = `$(ADVIO_CONFIG) --cflags`
ADVIO_LIBS = `$(ADVIO_CONFIG) --libs docio`
#-------MUMPS----------------------------------
MUMPS_INCLUDES =
MUMPS_LIBS = -ldmumps -lmumps_common -lpord
SCALAP_LIBS =
BLAS_LIBS =
#-------Lis----------------------------------
LIS_INCLUDE = -I
LIS_LIBS = -L
MPI_INCLUDE = -I
MPI_LIBS = -lmpi
DDM_INCLUDES = -I../common-include
CC = mpifcc
CFLAGS = -O3 -DUSE_MPI -Kopenmp
INCLUDES = $(DDM_INCLUDES) $(ADVIO_INCLUDES) $(LIS_INCLUDE) $(MUMPS_INCLUDES) ¥
$(MPI_INCLUDE)
LIBS = $(ADVIO_LIBS) $(LIS_LIBS) $(MUMPS_LIBS) $(SCALAP_LIBS) $(BLAS_LIBS) $(MPI_LIBS) -lm
LINKER = mpifcc
PROGRAMS = libtry_ddm_gl.a
...
(ADVENTURE_IOインストールディレクトリ)
-I$(MUMPSインクルードディレクトリ)
(ScaLAPACKへのリンク)
(BLASへのリンク)
(MPI Cコンパイラ)
(コンパイラフラッグ)
(MPI Cリンカ)
-I$(Lisインクルードディレクトリ)
-L$(MUMPSリンクディレクトリ) -ldmumps -lmumps_common -lpord
-L$(Lisリンクディレクトリ) -llis
-I$(MPIインクルードディレクトリ) #必要に応じて
$(MPIへのリンク) #必要に応じて
16. 利用方法
int try_ddm(int argc, char** argv, int *csr_ptr, int
*csr_idx, double *csr_val, int A_nnz, int A_matdim, int
b_dim, double *b_val, char *mesh_file, char *mesh_type)
引数 説明
オプション指定 int argc 引数の数
char** argv 引数リスト
係数行列 int* csr_ptr 各行開始位置リスト (CSR形式)
int* csr_idx 非零要素の列番号リスト (CSR形式)
double* csr_val 非零要素の値リスト (CSR形式)
int A_nnz 非零要素数
int A_matdim 行列次元数
右辺ベクトル int b_dim ベクトル次元数
double* b_val 値リスト (密ベクトル形式)
領域分割メッシュ char* mesh_file 領域分割ファイル名
char* mesh_type メッシュタイプ (4面体2次: tetra)
17. サンプルプログラムとデータ
ディレクトリ構造
• samples/
– Makefile ... メイクファイル
– sample.c ... サンプルプログラム
– data/
• Ab/
– Ab-130k.dat ... 係数行列と右辺ベクトル
• Mesh/
– adv-metis/
» 130k/p1d240/model/advhddm_in_0.adv ... 領域分割メッシュ
– origin-mesh/
» 130k.adv ... 領域分割前メッシュ(AdvIO形式)
18. サンプルプログラム用の入力データ形式
• 係数行列&右辺ベクトル Ab.dat
n
nnz
ptr[0] ptr[1] ... ptr[n]
index[0] index[1] ... index[nnz-1]
value[0] value[1] ... value[nnz-1]
b[0] b[1] ... b[n-1]
行列次元数(int x 1)
行列非零要素数(int x 1)
CSR行開始位置データ (int x (n+1))
CSR列番号データ (int x nnz)
CSR値データ (double x nnz)
密ベクトル形式右辺ベクトルデータ (double x n)
上記並びをバイナリ形式で記録する
ただし, 行列は下三角のみ
19. 円孔付き薄板モデル
• 実験環境とベンチマーク問題
• 評価条件
評価環境とベンチマーク問題
Fujitsu PRIMERGY CX400 @名大
CPUs/Node 2
CPU Intel Xeon E5-2697v2
Cores/CPU 12
Memory/Node 128GiB
評価内容 領域数 反復法 前処理
解の精度評価 240 CG Jacobi
実行時間評価 2400 CG Jacobi
並列効率評価 240 CG Jacobi
収束性評価 2400 CG 複数
実験環境(1ノードの構成)
円孔付き薄板モデル
要素数 242,322
自由度 1,125,771
非零要素 89,211,015
ベンチマーク問題
20. 解の精度評価
( ) nn Axbxf −=
表:真の相対残差
収束判定値 真の相対残差
10-3
-3.077880
10-5
-5.076395
10-7
-7.078780
10-9
-9.086220
反復法の収束判定値:ε
Schur補元方程式の近似解は元の方程式でも同程度の残差である
ε<
2
2
g
rn
MUMPS
Lis
MUMPS
S,g
xBn
LexADV_TryDDM
A,b
xn
本来示すべき
残差
DDMの残差基準
2
2
10
)(
log
b
xf n
24. 現バージョンの制限事項
• 入力とする方程式
– 実対称正定値行列 (Ver.0.2bで少し緩和予定)
– 基本境界条件分を小さくしていない
– 係数行列は下三角成分のみ (Ver.0.3bで全成分に対応予定)
– 係数行列はCSR形式 (Ver.0.3bでCOO形式に対応予定)
• 入力とするメッシュ
– AdvMetisによる領域分割
– AdvMetisはPart数1で領域分割 (Ver.0.3bで緩和予定)
– 4面体2次要素のみ動作確認 (Ver.0.2bで辺要素対応予定)
– 節点あたり3自由度 (Ver.0.2bで緩和予定)