SS研
ポストペタアプリ性能WG資料

3.3 圧縮流体解析「UPACS-L」
tune1コード:プレ処理の性能劣化について
2015年3⽉17⽇
富⼠通株式会社
千葉 修⼀
Copyright 2015 FUJITSU LIMITED

サマリー（１）
課題
構造体の変更(tune1)により構造体の初期化処理の性能が劣化

対象コード圧縮流体解析「UPACS-L」
viscous-pre（プレ処理：構造体の初期化）

チューニング構造体×３次元 →構造体の各メンバ×３次元•type cellFaceType•type visCellFaceType1

8 / 24

Copyright 2015 FUJITSU LIMITEDサマリー（２）
回答
性能低下の原因•配列宣⾔の変化により並列化される次元が変化•並列化された次元が回転数が少なく、ロードインバランスが発⽣

対処•オプションで回転数不⾜のループを並列化の対象から除外•内側の次元を並列化することでオリジナルと同等性能を達成•ただし最内の回転数が少ないためxfillの効果が低い

区間(sec)original

tune1

対処済

Viscous_pre

0.51

1.66

0.50
※社内機での実測値

2

Copyright 2015 FUJITSU LIMITED

分析
対象コードoriginal

tune1!omp parallel do private(i,j,k)
do k=-1,blk%kn
do j=-1,blk%kn
do i=-1,blk%kn･･･
cface(i,j,k)%nv(:) =0.0･･････
cface%nv = 0.0･･･
doループを明⽰的に書いても性能は変化せず

性能データ区間(sec)original

tune1

Viscous_pre

0.58701.720「宇宙航空研究機構) ⾼⽊様 SS研 ポストペタアプリ性能WG 第３回 報告資料」より
3

9 / 24

Copyright 2015 FUJITSU LIMITED

分析（１）
originalの詳細PA情報
各スレッドで均等に処理が実⾏メモリビジー率
0%[秒]

6.0E-0110%

20%

L2エンジンビジー率
30%

40%

50%

60%

L1エンジンビジー率
70%

80%

90%

100%

Process

5.0E-01
4.0E-01
3.0E-01

浮動少数点ロードキャッシュアクセス待ち

2.0E-01
1.0E-01
0.0E+00

Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread
01
2
34
5678
910
11
12
13
14154

Copyright 2015 FUJITSU LIMITED

分析（２）tune1の詳細PA情報
ロードインバランスが発⽣している
メモリビジー率0%[秒]

1.8E+00

10%

20%

L2エンジンビジー率
30%

40%

50%

60%

L1エンジンビジー率
70%

80%

90%100%Process

1.6E+00
1.4E+00
1.2E+00
1.0E+00

同期待ち

8.0E-01
6.0E-01
4.0E-01
2.0E-01
0.0E+00

Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread
012
3
4
5
67
8
910
11
12
13
14
15
510 / 24

Copyright 2015 FUJITSU LIMITED

分析（３）
コードの分析1から3次元⽬までは 161要素
4次元⽬以降の最終次元は 3から5要素、特に3が多い
type visCellFaceType･･･
real(8), pointer, dimension(:,:,:,:):: nv･･･
end typetype(visCellFaceType) :: cfaceallocate( cface%area(-1:blk%in,-1:blk%jn,-1:blk%kn ))allocate( cface%nv (-1:blk%in,-1:blk%jn,-1:blk%kn,3 ))allocate( cface%flux(-1:blk%in,-1:blk%jn,-1:blk%kn,5 ))allocate( cface%mu (-1:blk%in,-1:blk%jn,-1:blk%kn ))allocate( cface%dTdx(-1:blk%in,-1:blk%jn,-1:blk%kn,3 ))allocate( cface%u(-1:blk%in,-1:blk%jn,-1:blk%kn,3 ))allocate( cface%dudx(-1:blk%in,-1:blk%jn,-1:blk%kn,3,3 ))6

Copyright 2015 FUJITSU LIMITED

分析（３）コードの分析最適化情報では並列化を確認
並列化次元は、イメージコードの最外次元"l"で並列化
3738
3940
4142

pp
pp
pp
ppvvv
v
pp

call start_collection("tune1A")
cface%dudx = 0.0
cface%dTdx = 0.0 ; cface%u = 0.0
cface%area = 0.0 ; cface%nv = 0.0
cface%mu = 0.0 ; cface%flux = 0.0
call stop_collection("tune1A")
do l=1,3
do k=-1,blk%kn
do j=-1,blk%kn
do i=-1,blk%kn
cface%nv(i,j,k,l) =0.0･･･
7

11 / 24

1から3スレッドに処理が集中

Copyright 2015 FUJITSU LIMITED対処（１）
翻訳オプション -Kprallel_iteration による対処% fccpx -Kparallel_iteration=16 ...
[-Kparallel_iteration=N]
翻訳時にN回転未満のループは⾃動並列化の対象外とし、内側のループで並列化を⾏う。
pp

do l=1,3
do k=-1,blk%kn
do j=-1,blk%kn
do i=-1,blk%kn･･･

pp

do l=1,3
do k=-1,blk%kn
do j=-1,blk%kn
do i=-1,blk%kn･･･イメージコードでは、内側次元"k"で並列化originalコードとほぼ同等の実⾏時間、1.66 → 0.50(sec)8

Copyright 2015 FUJITSU LIMITED

対処（２）-Kparallel_iterationによる性能の変化
回転数が少なくxfillの効果が弱い、ループの⼀重化などが必要
メモリビジー率
0%

10%

20%

L2エンジンビジー率

30%

40%

50%

60%

L1エンジンビジー率70%

80%

90%

100%

[秒]

6.0E-01

Process

5.0E-01
4.0E-01
3.0E-01
2.0E-01
1.0E-01
0.0E+00

ストア待ちThread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread Thread
01
234
56789101112
131415912 / 24

Copyright 2015 FUJITSU LIMITEDCopyright 2010 FUJITSU LIMITED

13 / 24