DIC-PCGソルバーの
pimpleFoamに対する
時間計測と高速化
富岡 稔, 澤原 雅隆, 藤原 巧, 𠮷藤 尚生
目次
前回までの復習
– 目標
– 疎行列形式の変更
– Cuthill-McKee法による並列化の実装
時間計測
さらなる高速化
まとめ・今後の予定
© 2019 Fixstars Corporation, All rights reserved.
1
目次
前回までの復習
– 目標
– 疎行列形式の変更
– Cuthill-McKee法による並列化の実装
時間計測
さらなる高速化
まとめ・今後の予定
© 2019 Fixstars Corporation, All rights reserved.
2
目標
OpenFOAMのスレッド並列化を行いたい
– メニーコア環境だとハイブリッド並列の方が
フラットMPIよりも有利
OpenFOAMはそのままではスレッド並列
化が困難であるため、コードに手を加える
必要がある
© 2019 Fixstars Corporation, All rights reserved.
3
疎行列形式の変更
並列化のために「lduMatrix形式」から
「CSR形式」に変更
CSR形式を用いることで、疎行列ベクト
ル積(SpMV)をスレッド並列化可能に
© 2019 Fixstars Corporation, All rights reserved.
𝑈
𝐿
𝐷 A
lduMatrix形式 CSR形式
OpenFOAMスレッド並列化のための基礎検討 (http://proc-cpuinfo.fixstars.com/2018/02/openfoam-thread/)
4
Cuthill-McKee法
CSR形式でもDIC前処理はデータの依存性
により並列化が不可能
Cuthill-McKee(CM)法により依存を排除し、
DIC前処理をスレッド並列化可能に
© 2019 Fixstars Corporation, All rights reserved.
Cuthill-McKee法
CuthillMckee法によるOpenFOAMのDIC前処理に関するスレッド並列化 (http://proc-cpuinfo.fixstars.com/2018/06/openfoam/)
5
目次
前回までの復習
– 目標
– 疎行列形式の変更
– Cuthill-McKee法による並列化の実装
時間計測
さらなる高速化
まとめ・今後の予定
© 2019 Fixstars Corporation, All rights reserved.
6
時間計測
 これまではプロファイラが未実装
– 実行時間の比較ができていない
 プロファイラを実装し、オープンCAE学会がベンチ
マークとして作成したチャネル流問題[1]を使用して
時間を計測
 設定
– solver: pimpleFoam
– 5ステップだけ計算
 環境
– Xeon Phi 7210 (64コア, 256スレッド)
 OpenFOAM (Foundation版) Git-ID:16b559c1
© 2019 Fixstars Corporation, All rights reserved.
[1] OpenFOAM Benchmark Test for Channel Flow (Re_tau=110),
https://gitlab.com/OpenCAE/OpenFOAM-BenchmarkTest/tree/master/channelReTau110
7
時間計測(変更なし版)
結果
PCGの実行時間が大部分を占めている
– PCGのみに着目すればよい
© 2019 Fixstars Corporation, All rights reserved.
8
0
100
200
300
400
500
600
700
800
900
1000
1100
1200
CoreLoop pEqn PCG CoreLoop pEqn PCG
DDR4 MCDRAM
実行時間[s]
全体の実行時間
UEqn pEqn PCG 疎行列ベクトル積 DICcalcReciprocalD
DIC前処理 WAXPBY normFactor sumMag sumProd
スレッド並列化の前に…
スレッド並列化する前に、フラットMPI
並列ではどれくらい高速化できるのか確認
DDR4では32倍, MCDRAMでは84倍
– スレッド並列でもこれくらい速くすることが
目標
9
© 2019 Fixstars Corporation, All rights reserved.
プロセス 数 DDR4 MCDRAM
実行時間[s] 高速化率 実行時間[s] 高速化率
1 208 x1 210 x1
64 9.3 x22 5.5 x38
128 6.5 x32 2.5 x84
256 18 x12 11 x19
CSR化
疎行列形式をlduMatrix形式からCSR形式
に変更した際に、実行時間に変化があるか
を確認
© 2019 Fixstars Corporation, All rights reserved.
𝑈
𝐿
𝐷 A
lduMatrix形式 CSR形式
10
時間計測
DIC前処理の実行時間が増加
© 2019 Fixstars Corporation, All rights reserved.
11
0
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
lduMatrix形式 CSR形式 lduMatrix形式 CSR形式
DDR4 MCDRAM
実行時間[s]
PCG
疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd (other)
行列のデータの持ち方を変更
DIC前処理の実行時間が増加してしまった
アクセスパターンの違いが原因?
– lduMatrix形式では全ての要素が連続アクセス
– CSR形式では行列全体を持っているため一部
のアクセスが連続でない
CSR形式において上三角部分と下三角部
分も別に保持し、それを使用
© 2019 Fixstars Corporation, All rights reserved.
A
L
12
変更結果
lduMatrix形式と同程度になった
© 2019 Fixstars Corporation, All rights reserved.
13
0
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
変更前 変更後 変更前 変更後
lduMatrix形式 CSR形式 lduMatrix形式 CSR形式
DDR4 MCDRAM
実行時間[s]
PCG
疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd (other)
スレッド並列化
SpMVおよびDIC前処理は並列化可能
– SpMV: CSR化
– DIC前処理: CSR化 + CM法
OpenMPを用いてスレッド並列化
OpenMPの設定は明記されていない場合は
デフォルト(256スレッド)
© 2019 Fixstars Corporation, All rights reserved.
14
0
100
200
300
400
500
600
700
800
900
1000
lduMatrix形式 CSR化のみ 並列化 lduMatrix形式 CSR化のみ 並列化
DDR4 MCDRAM
実行時間[s]
PCG
疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd CuthillMcKee (other)
時間計測
スレッド並列化によるSpMVおよびDIC前
処理の高速化を確認
© 2019 Fixstars Corporation, All rights reserved.
15
DIC
前処理
x3.3
SpMV
x11.4
DIC
前処理
x3.4
SpMV
x13.5
CM法 CM法
目次
前回までの復習
– 目標
– 疎行列形式の変更
– Cuthill-McKee法による並列化の実装
時間計測
さらなる高速化
まとめ・今後の予定
© 2019 Fixstars Corporation, All rights reserved.
16
スレッド数の調整
スレッド数を変えたときにSpMVおよび
DIC前処理の実行時間が変化するかを
確認 (単位[s])
スレッド数によって、実行時間が大きく
異なる場合があるため、調整が必要
© 2019 Fixstars Corporation, All rights reserved.
スレッド数 DDR4 MCDRAM
SpMV DIC前処理 SpMV DIC前処理
64 17.6 123.6 13.8 122.7
128 21.0 108.7 17.7 105.7
256 27.8 160.8 23.7 152.1
17
行列の並び替え
DIC前処理を行う際に、アクセスする行列
の要素が飛び飛びになっている
– キャッシュミスを誘発
並び替えを行って実行時間の変化を確認
© 2019 Fixstars Corporation, All rights reserved.
18
行列の並び替え
CSR形式の場合は、行ごとに列番号を変
換しながらコピーを行えばよい
行列をL, D, Uに分けた後で並び替えを
行うと、L, Uが三角行列にならないことに
注意
© 2019 Fixstars Corporation, All rights reserved.
1 a b
A 2
B 3 c d
C 4
D 5
3 c d B
C 4
D 5
b 1 a
A 2
並び替え
19
ベクトルの並び替え
前処理行列を𝑀とおくと、前処理は以下の
式で表される
𝑧 = 𝑀−1
𝑟
並び替えた前処理行列 𝑀′
= 𝑃𝑀𝑃 𝑇
を用い
ると、前処理は以下の通りに計算できる
𝑧 = 𝑀−1
𝑟 = 𝑃 𝑇
𝑀′
𝑃 −1
𝑟
= 𝑃 𝑇
𝑀′−1
𝑃𝑟
1. 𝑟′= 𝑃𝑟
2. 𝑧′ = 𝑀′−1
𝑟′
3. 𝑧 = 𝑃 𝑇 𝑧′
ベクトルの並び替えの処理も追加で必要
© 2019 Fixstars Corporation, All rights reserved.
20
行列の並び替えの結果
実行時間の変化を確認 (単位[s])
DIC前処理の変更前後の最短の実行時間は
それぞれ105秒と39秒
– 約2.7倍の高速化
© 2019 Fixstars Corporation, All rights reserved.
スレッド数 DDR4 MCDRAM
DIC前処理 CM法 DIC前処理 CM法
変更前 変更後 変更前 変更後 変更前 変更後 変更前 変更後
64 123.6 61.7 95.5 112.8 122.7 39.4 103.3 119.2
128 108.7 80.5 94.1 110.0 105.7 50.8 99.8 118.2
256 160.8 164.6 97.4 110.5 152.1 91.9 103.1 120.6
21
DDR4 vs. MCDRAM
変更前は実行時間にあまり差がなかったが、
高速化によって差が大きくなった
22
© 2019 Fixstars Corporation, All rights reserved.
0
20
40
60
80
100
120
140
160
180
DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM
64 threads 128threads 256 threads 64 threads 128 threads 256 threads
変更前 変更後
実行時間[s]
DIC前処理
ほかの部分の並列化
ボトルネックだった部分が高速化されたこと
によって、ほかの部分が重くなってきた
– WAXPBY
– リダクション演算(sumMag, sumProd)
これらを並列化する
© 2019 Fixstars Corporation, All rights reserved.
23
0
100
200
300
400
500
600
700
800
900
1000
lduMatrix形式 CSR化のみ 並列化 lduMatrix形式 CSR化のみ 並列化
DDR4 MCDRAM
実行時間[s]
PCG
疎行列ベクトル積 DICcalcReciprocalD DIC前処理 WAXPBY normFactor sumMag sumProd CuthillMcKee (other)
WAXPBYの並列化
WAXPBY: 𝐰 = 𝑎𝒙 + 𝑏𝒚 という形で表され
る計算
ループ間に依存関係がないため並列化可能
© 2019 Fixstars Corporation, All rights reserved.
for (int i = 0; i < n; i++) {
w[i] = a * x[i] + b * y[i]
}
#pragma omp parallel for
for (int i = 0; i < n; i++) {
w[i] = a * x[i] + b * y[i]
}
24
WAXPBYの並列化の結果
並列化後の平均実行時間を確認
高速化率
– DDR4: x19
– MCDRAM: x67
© 2019 Fixstars Corporation, All rights reserved.
25
スレッド数 DDR4 [ms] MCDRAM[ms]
1 25.961 26.139
64 1.339 0.440
128 1.342 0.387
256 1.539 0.493
WAXPBYの並列化の結果
並列化後の平均実行時間を確認
高速化率
– DDR4: x19
– MCDRAM: x67
© 2019 Fixstars Corporation, All rights reserved.
26
0
5
10
15
20
25
30
DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM
1 thread 64 threads 128 threads 256 threads
平均実行時間[ms]
WAXBPY
リダクション演算の並列化
リダクション演算の例として内積がある
内積(𝑠 = 𝒙 𝑇
𝒚)は以下のように計算できる
このような計算を並列化するには、リダク
ション指示節を用いればよい
© 2019 Fixstars Corporation, All rights reserved.
double s = 0.0;
for (int i = 0; i < n; i++) {
s += x[i] * y[i]
}
double s = 0.0;
#pragma omp parallel for reduction(+:s)
for (int i = 0; i < n; i++) {
s += x[i] * y[i]
}
27
リダクション演算の並列化の結果
© 2019 Fixstars Corporation, All rights reserved.
sumMag sumProd
DDR4 x31 x25
MCDRAM x47 x56
並列化後の平均実行時間を確認
高速化率
28
スレッド数 sumMag sumProd
DDR4[ms] MCDRAM[ms] DDR4[ms] MCDRAM[ms]
1 14.907 14.962 18.402 18.267
64 0.480 0.317 0.727 0.325
128 0.565 0.343 0.780 0.364
256 1.253 1.137 1.380 1.101
リダクション演算の並列化の結果
© 2019 Fixstars Corporation, All rights reserved.
sumMag sumProd
DDR4 x31 x25
MCDRAM x47 x56
並列化後の平均実行時間を確認
高速化率
29
0
2
4
6
8
10
12
14
16
18
20
DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM DDR4 MCDRAM
1 thread 64 threads 128 threads 256 threads
平均実行時間[ms]
sumMag sumProd
SpMVの高速化率について
SpMVが MCDRAM-256スレッド でも13倍
しか速くなっていないのはおかしい
計測範囲内に含まれていた
updateMarixIntefaces(...)(未並列)が原因
分けて計測した時のSpMVの高速化率
30
© 2019 Fixstars Corporation, All rights reserved.
スレッド数 DDR4 MCDRAM
64 x24 x34
128 x25 x43
256 x24 x68
現状のスレッド並列化の結果
スレッド並列化の結果
PCG全体の高速化率
– DDR4: x4.3, MCDRAM: x4.8
© 2019 Fixstars Corporation, All rights reserved.
31
0
100
200
300
400
500
600
700
800
900
1000
変更前 64 threads 128 threads 256 threads 変更前 64 threads 128 threads 256 threads
DDR4 MCDRAM
実行時間[s]
PCG
疎行列ベクトル積 Cuthill-McKee法 DICcalcReciprocalD DIC前処理
WAXPBY normFactor reorderVector sumMag
sumProd updateMatrixInterfaces (other)
現状のスレッド並列化の結果
個別の高速化率
– DIC前処理があまり速くなっていない
並列化前にはなかったCM法が、実行時間
のかなりの割合を占めている
© 2019 Fixstars Corporation, All rights reserved.
DDR4 MCDRAM
SpMV x25 x68
DIC前処理 x6.7 x10
WAXPBY x19 x67
sumMag x31 x45
sumProd x21 x44
(理想高速化率) x32 x84
32
目次
前回までの復習
– 目標
– 疎行列形式の変更
– Cuthill-McKee法による並列化の実装
時間計測
高速化
まとめ・今後の予定
© 2019 Fixstars Corporation, All rights reserved.
33
まとめ
プロファイラを作成し、実行時間を計測した
ボトルネックであるPCGのSpMVおよびDIC
前処理をスレッド並列化した。それに加えて
様々な高速化も行った
– SpMVは最大68倍の高速化
– DIC前処理は最大10倍の高速化
DIC前処理とCM法がボトルネックとなり、
PCG全体の高速化率は4.8倍にとどまった
– まだまだ高速化が必要
© 2019 Fixstars Corporation, All rights reserved.
34
今後の予定
CM法の実行時間短縮
– 疎行列の構造が変化しない場合は最初の1回の
結果を使い回す
– 差分更新が可能かを調査・検討
– CM法自体の高速化(並列化)
© 2019 Fixstars Corporation, All rights reserved.
35
今後の予定
DIC前処理の高速化
– 前処理を行う度にベクトルの並び替えを行っ
ており、ここでも時間がかかっている
– 代わりにPCGの最初と最後にベクトルの並び
替えを行うような実装に変更する
• 𝐴𝒙 = 𝒃 ⇔ 𝐴′ 𝒙′ = 𝒃′ (𝐴′ = 𝑃𝐴𝑃 𝑇, 𝒙′ = 𝑃𝒙, 𝒃′ = 𝑃𝒃)
– 高速化率は10倍→16倍に改善されるはず
– 理想高速化率は84倍なのでそれでも足りてな
い。さらなる高速化方法を調査する
© 2019 Fixstars Corporation, All rights reserved.
前処理全体[s] 並び替え[s]
39.7 14.1 (36%)
36

DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化