43
「京」、HPCIにおける高速化事例紹介 201512一般財団法人 高度情報科学技術研究機構 神戸センター 産業利用推進室 浅見

「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

「京」、HPCIにおける高速化事例紹介

2015年12月 一般財団法人 高度情報科学技術研究機構

神戸センター 産業利用推進室 浅見 暁

Page 2: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

3つのプログラムの高速化事例を紹介する。 事例1 CFDコード(その1) @「京」 事例2 CFDコード(その2) @SX-ACE 事例3 CFDコード(その3) @SX-ACE

1

Page 3: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

マシンの特徴 「京」 計算ノード単体 プロセッサ: SPARC64TMVIIIfx (コア数 8, L2キャッシュ 6MB) 主記憶: 16GB 演算性能: 128GFLOPS メモリ転送性能: 64GB/s インターコネクト種類: Tofu (6次元メッシュ/トーラス)

SX-ACE 計算ノード単体 プロセッサ:NEC SX-ACEベクトルプロセッサ(コア数4)×1 主記憶容量:64GB 演算性能:276GFLOPS メモリ転送性能:256GB/s インターコネクト:IXS (Internode Crossbar Switch)

2

Page 4: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

CFDコード(その1)

3

Page 5: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化施策とその効果 ソフトウェアパイプライン化 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

4

Page 6: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

計算条件 流体コード(Fortran) 有限差分法 7億格子点 フラットMPI 「京」 2400並列(300ノード、ノード形状1次元指定)

5

Page 7: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

オリジナル版の実行性能 ・実行時情報出力機能によるハードウェアモニタ情報 (200ステップ実行)

• サブルーチンA、B、Cで、計算コストの91%を占める • 上記3ルーチンのFLOPS値はそれぞれ、589,236,506MFLOPS

であり、計算効率は高くない

Routine name

Time (sec) % MFLOPS

メモリ バンド幅 (GB/s)

SIMD化率

A 67.93 33.81 589 15.41 4.82 B 63.18 31.45 236 38.91 23.24 C 52.07 25.92 506 35.22 17.57 D 8.29 4.13 0 13.84 0.43 E 3.27 1.63 352 44.90 7.13 F 2.55 1.27 839 45.35 19.74

6

Page 8: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

サブルーチンA ループ1 最適化情報(オリジナル版)

5971 2 do ir=is, ie 5972 3 do k=1, nz(ir) 5973 4 do j=1, ny(ir) <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< Loop-information End >>> 5974 5 v do i=1, nx(ir) 5975 5 v 5985 5 v end do 5986 4 end do 5987 3 end do 5989 2 end do 5990 2 do ir=is, ie 5991 3 do k=1, nz(ir) 5992 4 do j=1, ny(ir) <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING

SIMD化はされているが、ソフトウェアパイプライン化されていない (下のループはSIMD化、ソフトウェアパイプライン化されている。)

jwd6004s-i "sub.f90", line 5974: SIMD conversion is applied to DO loop with DO variable 'i'. The DO loop contains a reduction operation. jwd8665o-i "sub.f90", line 5974: This loop is not software pipelined because of shortage of integer registers.

7

Page 9: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

サブルーチンA ループ1 ソースコードの確認

ループ内の(整数)演算が多すぎるため、 パイプライン演算に必要な整数レジスタが不足

ループ内の演算を分けて、ループ内の演算量を減らしてみる

5974 do i=1, nx(ir) 5975 res(ir)%a(i,j,k)= v(ir)%cm(i)*v(ir)%p( i-v(ir)%ind(i-1,j,k) , j, k) & 5976 +v(ir)%cp(i)*v(ir)%p( i+v(ir)%ind(i+1,j,k) , j, k) & ・・・ 5982 res(ir)%a(i,j,k)=res(ir)%a(i,j,k)*real( v(ir)%ind(i,j,k) ) 5984 sum=sum+res(ir)%a(i,j,k)**2 5985 end do

8

Page 10: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

サブルーチンA ループ1 最内側iのループを分割

81 2 do ir=is, ie 82 3 do k=1, nz(ir) 83 4 do j=1, ny(ir) <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING <<< Loop-information End >>> 84 5 v do i=1, nx(ir) 85 5 v 89 5 v end do <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING <<< Loop-information End >>> 90 5 v do i=1, nx(ir) 91 5 v 99 5 v end do 100 4 end do 101 3 end do 102 2 103 3 do k=1, nz(ir) 104 4 do j=1, ny(ir) <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING <<< Loop-information End >>> 106 5 4v do i=1, nx(ir) 107 5 4v

SIMD化、ソフトウェアパイプライン化された SIMD化、ソフトウェアパイプライン化された

元のループ構造 5971 2 do ir=is, ie 5972 3 do k=1, nz(ir) 5973 4 do j=1, ny(ir) <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< Loop-information End >>> 5974 5 v do i=1, nx(ir) 5975 5 v 5985 5 v end do 5986 4 end do 5987 3 end do 5989 2 end do

9

jwd6001s-i “sub.f90", line 84: SIMD conversion is applied to DO loop with DO variable 'i'. jwd8204o-i “sub.f90", line 84: This loop is software pipelined. jwd6004s-i “sub.f90", line 90: SIMD conversion is applied to DO loop with DO variable 'i'. The DO loop contains a reduction operation. jwd8204o-i “sub.f90", line 90: This loop is software pipelined.

Page 11: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

サブルーチンB、C ループ2 最適化情報(オリジナル版)

4149 1 do i=1, nx 4150 2 do j=1, ny <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING <<< Loop-information End >>> 4151 3 v do k=1,nz 4152 3 v gu(i,j,k)= ・・・ & ・・・ 4158 3 v gv(i,j,k)= ・・・ & ・・・ 4164 3 v gw(i,j,k)= ・・・ & ・・・ 4170 3 v end do 4171 2 end do 4172 1 end do

SIMD化、ソフトウェアパイプライン化はされているが、添え字kについての飛びアクセス。 交換可能だが、コンパイラは交換していない。

10

Page 12: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

サブルーチンB、C ループ2

321 1 do k=1,nz 322 2 do j=1, ny <<< Loop-information Start >>> <<< [OPTIMIZATION] <<< SIMD <<< SOFTWARE PIPELINING <<< Loop-information End >>> 323 3 v do i=1, nx 324 3 v gu(i,j,k)= ・・・ & ・・・ 330 3 v gv(i,j,k)= ・・・ & ・・・ 336 3 v gw(i,j,k)= ・・・ & ・・・ 342 3 v end do 343 2 end do 344 1 end do

※修正を行った不連続アクセスをしているループの数 サブルーチンB:13個のループ/13個 サブルーチンC:31個のループ/34個

最適化情報(修正後)

11

Page 13: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

最適化後の実行性能(サブルーチン) ・実行時情報出力機能によるハードウェアモニタ情報 (200ステップ実行)

※メモリバンド幅 (GB/s)は、ノード当りの値

Routine name

Time (sec) % MFLOP

S メモリ バンド幅 (GB/s)

SIMD化率

A 67.93 33.81 589 15.41 4.82 B 63.18 31.45 236 38.91 23.24 C 52.07 25.92 506 35.22 17.57 D 8.29 4.13 0 13.84 0.43 E 3.27 1.63 352 44.90 7.13 F 2.55 1.27 839 45.35 19.74

Routine name

Time (sec) % MFLOPS

メモリ バンド幅 (GB/s)

SIMD化率

A 48.53 53.87 825 22.04 13.20 C 10.75 11.94 2129 38.80 38.10 B 10.41 11.56 1446 37.64 33.95 D 8.34 9.25 0 14.33 0.36 E 3.25 3.61 355 45.19 7.12 F 2.59 2.87 827 45.41 19.85

サブルーチンAは20秒短縮 サブルーチンBは52秒短縮 サブルーチンCは41秒短縮

12

Page 14: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

最適化後の実行性能(全体) 2倍以上の性能向上が得られた 200秒 ⇒ 90秒

Time (sec) MFLOPS メモリ

バンド幅 SIMD化率

オリジナル版 200.90 433 29.07 9.43 ループ1の修正 176.96 492 32.99 17.51 ループ2の修正 (ループ1の修正を含む) 90.08 934 26.82 17.83

13

ループ1の修正:ソフトウェアパイプライン化 ループ2の修正:配列アクセスの連続化

Page 15: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化のポイント ホットスポット部分の最適化、性能情報の確認が重要 ソフトウェアパイプライン化(コンパイルリストより) レジスタ不足などの阻害要因のチェック MFLOPS値(fipp、fappより) メモリアクセス方法(コンパイルリストより) SIMD化ループのアクセスが連続か不連続か

最適化メッセージ、コンパイルリストの出力方法 frtpxの場合 -Koptmsg=2 -Nlst=tオプション fccpxの場合 -Koptmsg=2 -Nlst=tオプション

14

Page 16: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

CFDコード(その2)

15

Page 17: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化

(修正前と比較して)約2倍の高速化

16

Page 18: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

計算条件 圧縮性流体コード(Fortran) 格子点数 151x111x111(約180万点) 反復数 nmax=20 ハイブリッド並列(MPI+OpenMP) 対象マシン SX-ACE 8ノード×4スレッド

17

Page 19: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

Global Data of 8 processes : Min [U,R] Max [U,R] Average Real Time (sec) : 16.281 [0,5] 16.369 [0,0] 16.312 User Time (sec) : 21.729 [0,0] 24.103 [0,7] 22.899 Sys Time (sec) : 0.031 [0,7] 0.240 [0,0] 0.063 Vector Time (sec) : 8.927 [0,0] 18.824 [0,7] 17.088 Inst. Count : 5439959371 [0,3] 13999347945 [0,0] 6539590012 V. Inst. Count : 1944028126 [0,0] 2075116451 [0,1] 2044642963 V. Element Count : 135107180190 [0,7] 139322295184 [0,1] 137364271805 V. Load Element Count : 16556116289 [0,0] 17827345163 [0,2] 17479103913 FLOP Count : 56642416905 [0,7] 59283055382 [0,0] 57947372208 MOPS : 5747.426 [0,7] 6835.242 [0,0] 6202.318 MFLOPS : 2349.976 [0,7] 2728.304 [0,0] 2533.149 MOPS (concurrent) : 8823.119 [0,7] 11134.362 [0,0] 9753.216 MFLOPS (concurrent) : 3607.549 [0,7] 4444.308 [0,0] 3982.919 A. V. Length : 66.122 [0,7] 70.198 [0,0] 67.202 V. Op. Ratio (%) : 91.883 [0,0] 97.606 [0,1] 96.865 Total Memory Size (MB) : 1856.000 [0,0] 1856.000 [0,0] 1856.000 Memory Size (MB) : 1728.000 [0,0] 1728.000 [0,0] 1728.000 Global Memory Size (MB) : 128.000 [0,0] 128.000 [0,0] 128.000 Max Concurrent Proc. : 4 [0,0] 4 [0,0] 4 MIPS : 226.882 [0,7] 644.273 [0,0] 288.261 MIPS (concurrent) : 348.296 [0,7] 1049.497 [0,0] 455.954 I-Cache (sec) : 0.008 [0,7] 0.030 [0,0] 0.012 O-Cache (sec) : 0.450 [0,1] 1.215 [0,0] 0.554 Bank Conflict Time CPU Port Conf. (sec) : 0.107 [0,5] 0.266 [0,7] 0.170 Memory Network Conf. (sec): 1.744 [0,0] 2.560 [0,1] 2.357 ADB Hit Element Ratio (%) : 61.040 [0,2] 67.743 [0,0] 62.103

平均ベクトル長が 短い(最長の256に近づけた方が

性能が出る)

ベクトル演算率は 今一つ

99%~99.5%程度は欲しい

性能情報(MPIPROGINF)

18

Page 20: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

PROC.NAME FREQUENCY EXCLUSIVE AVER.TIME MOPS MFLOPS V.OP AVER. VECTOR I-CACHE O-CACHE BANK CONFLICT ADB HIT TIME[sec]( % ) [msec] RATIO V.LEN TIME MISS MISS CPU PORT NETWORK ELEM.% output 1 7.428( 31.7) 7427.536 1045.1 6.0 5.79 93.3 0.092 0.001 0.031 0.004 0.020 14.18 subA 676500 3.427( 14.6) 0.005 11760.4 4664.7 98.19 70.9 2.736 0.010 0.097 0.000 0.031 99.98 -micro1 171600 0.865( 3.7) 0.005 11819.2 4688.1 98.19 70.9 0.694 0.005 0.031 0.000 0.008 99.98 -micro2 171600 0.874( 3.7) 0.005 11701.7 4641.5 98.19 70.9 0.695 0.004 0.023 0.000 0.008 100.00 -micro3 171600 0.869( 3.7) 0.005 11765.5 4666.8 98.19 70.9 0.694 0.000 0.021 0.000 0.008 99.98 -micro4 161700 0.819( 3.5) 0.005 11755.6 4662.2 98.18 70.9 0.653 0.001 0.021 0.000 0.008 99.93 subB 676500 1.657( 7.1) 0.002 11597.1 4836.7 96.70 68.0 1.146 0.000 0.187 0.007 0.130 98.71 -micro1 171600 0.420( 1.8) 0.002 11605.8 4840.4 96.70 68.0 0.289 0.000 0.055 0.001 0.032 98.70 -micro2 171600 0.421( 1.8) 0.002 11574.5 4827.4 96.70 68.0 0.292 0.000 0.045 0.002 0.033 98.72 -micro3 171600 0.420( 1.8) 0.002 11594.2 4835.6 96.70 68.0 0.292 0.000 0.044 0.002 0.033 98.71 -micro4 161700 0.395( 1.7) 0.002 11615.2 4843.8 96.70 67.9 0.274 0.000 0.043 0.002 0.032 98.70 subC$2 240 1.300( 5.5) 5.415 27233.9 12475.5 98.84 65.0 1.261 0.001 0.004 0.074 0.361 89.79 -micro1 60 0.326( 1.4) 5.438 27614.9 12650.3 98.84 65.0 0.321 0.000 0.001 0.016 0.092 89.80 -micro2 60 0.324( 1.4) 5.397 27824.3 12746.4 98.84 65.0 0.321 0.000 0.001 0.020 0.092 89.79 -micro3 60 0.325( 1.4) 5.409 27762.1 12717.9 98.84 65.0 0.321 0.000 0.001 0.020 0.092 89.78 -micro4 60 0.325( 1.4) 5.419 25736.4 11788.1 98.82 65.0 0.298 0.000 0.002 0.018 0.085 89.77 init 1 1.240( 5.3) 1239.739 1088.4 22.5 7.14 159.6 0.011 0.000 0.003 0.000 0.000 80.76 main 1 1.089( 4.6) 1088.937 215.3 0.1 16.89 52.5 0.052 0.001 0.709 0.000 0.004 0.08 sub$3 240 1.074( 4.6) 4.474 1458.5 422.2 79.35 57.7 0.347 0.000 0.056 0.006 0.203 31.76 -micro1 60 0.161( 0.7) 2.680 2428.5 714.5 80.63 57.7 0.090 0.000 0.015 0.002 0.052 31.76 -micro2 60 0.293( 1.3) 4.884 1358.5 392.0 79.08 57.7 0.087 0.000 0.012 0.002 0.051 31.77 -micro3 60 0.288( 1.2) 4.800 1381.6 398.8 79.12 57.7 0.087 0.000 0.013 0.002 0.052 31.76 -micro4 60 0.332( 1.4) 5.533 1143.6 327.8 78.56 57.7 0.083 0.000 0.015 0.002 0.049 31.76 sub$2 240 0.996( 4.2) 4.149 1570.3 455.4 79.49 57.7 0.312 0.001 0.054 0.002 0.154 31.76 -micro1 60 0.154( 0.7) 2.560 2542.5 747.9 80.62 57.7 0.080 0.000 0.015 0.001 0.038 31.76 -micro2 60 0.273( 1.2) 4.548 1456.3 420.9 79.22 57.7 0.079 0.000 0.014 0.001 0.040 31.76 -micro3 60 0.273( 1.2) 4.553 1455.5 420.5 79.19 57.7 0.078 0.000 0.008 0.001 0.038 31.76 -micro4 60 0.296( 1.3) 4.934 1277.0 367.6 78.91 57.7 0.075 0.000 0.017 0.001 0.038 31.75 sub$1 240 0.640( 2.7) 2.665 2138.8 573.8 82.74 78.0 0.119 0.000 0.037 0.004 0.020 40.48 -micro1 60 0.087( 0.4) 1.454 3942.0 1070.8 83.78 78.0 0.031 0.000 0.010 0.001 0.005 40.50 -micro2 60 0.174( 0.7) 2.908 2000.3 535.4 82.55 78.0 0.030 0.000 0.009 0.001 0.005 40.43 -micro3 60 0.161( 0.7) 2.679 2166.9 581.2 82.72 78.0 0.029 0.000 0.008 0.001 0.005 40.50 -micro4 60 0.217( 0.9) 3.619 1504.9 399.5 81.88 78.0 0.028 0.000 0.011 0.001 0.005 40.49

性能情報(ftrace)

サブルーチン”sub”と ”output” を性能向上の対象に!

outputの時間が全体の30%以上

subのMFLOPS、 平均ベクトル長の値が小さい

19

Page 21: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

do nt=1,5 do k=1,kmax do l=1,lmax do j=1,jmax w2tmp(j,l,k,nt) = w(j,k,l,nt)*w(j,k,l,6) do k=1,kmax do l=1,lmax do j=1,jmax rwtmp(j,l,k) = r(j,k,l)*w(j,k,l,6) open(unit=4,file=***,form='unformatted') write(4) jmax,kmax,lmax write(4) 6,0 write(4) w2tmp write(4) rwtmp close(4)

outputの変更 ※ initについても同様

出力形式のDOループ回避 write(4) jmax,kmax,lmax write(4) 6,0 do nt=1,5 write(4) (((w(j,k,l,nt)*w(j,k,l,6),j=1,jmax),k=1,kmax),l=1,lmax) enddo write(4)(((r(j,k,l)*w(j,k,l,6),j=1,jmax),k=1,kmax),l=1,lmax) close(4)

PROC.NAME FREQUENCY EXCLUSIVE TIME[sec]( % ) 【オリジナル版】 output 1 7.428( 31.7) init 1 1.240( 5.3) 【修正版】 output 1 0.094( 0.9) init 1 0.007( 0.0)

CPU負荷のトップだったoutputがランク外へ CPU負荷の上位にあったinitは無視できるレベルに

20

作業配列に格納しなおし、 DO型並びを変更

Page 22: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

sub内の3重ループ構造は、 全て同様。

データ(配列)への アクセス・パターンが異なる sub$1:連続 sub$2:2次元目 sub$3: 3次元目

sub$2/$3は 飛びアクセス

23 do l=ls,le 24 do k=ks,ke 25 do j=js,je 26 fv(j,1) = v1(j,k,l,1) 38 do j=jsta,jend 42 xx(j) = x(j,k,l,1,1) + x(j+1,k,l,1,1) 50 do j=jsta,jend 51 s1(j,k,l,1) = - ( fv(j,1) - fv(j-1,1) ) 58 enddo 59 enddo

67 do j=js,je 68 do l=ls,le 69 do k=ks,ke 70 fv(k,1) = v1(j,k,l,1) 82 do k=ksta,kend 85 yy(k) = y(j,k,l,6) + y(j,k+1,l,6) 94 do k=ksta,kend 95 s1(j,k,l,1) = s1(j,k,l,1) - ( fv(k,1) - fv(k-1,1) ) 102 enddo 103 enddo

111 do j=js,je 112 do k=ks,ke 113 do l=ls,le 114 fv(l,1) = v1(j,k,l,1) 126 do l=lstab,lend 130 zz(l) = z(j,k,l,1,3) + z(j,k,l+1,1,3) 138 do l=lsta,lend 139 s1(j,k,l,1) = s1(j,k,l,1) - ( fv(l,1) - fv(l-1,1) ) 146 enddo 147 enddo

sub$1

sub$2

sub$3

配列アクセスの連続化(1)

21

Page 23: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

修正前の編集リスト P------> do j=js,je |+-----> do l=ls,le ||V----> do k=ks,ke ||| A fv(k,1) = v1(j,k,l,1) ||V---- enddo || ||V----> do k=ks,ke ||| A yy(k) = y(j,k,l,1,2) + y(j,k+1,l,1,2) ||V---- enddo || ||V----> do k=ks,ke ||| A s1(j,k,l,1) = s1(j,k,l,1) -(fv(k,1)- fv(k-1,1) ) ||V---- enddo |+----- enddo P------ enddo

修正後の編集リスト P------> do l=ls,le |+-----> do k=ks,ke ||V----> do j = js,je ||| A fv(j,k,1) = v1(j,k,l,1) ||V---- enddo |+----- enddo | |+-----> do k=ks,ke ||V----> do j = js,je ||| A yy(j,k)= y(j,k,l,1,2) + y(j,k+1,l,1,2) ||V---- enddo |+----- enddo | |+-----> do k=ks,ke ||V----> do j = js,je ||| A s1(j,k,l,1) = s1(j,k,l,1) - (fv(j,k,1)-fv(j,k-1,1) ) ||V---- enddo |+----- enddo P------ enddo

※上記の変更に伴い、関数もデータを多重 で処理するように仕様変更したため、 sub$1も同様な対応を行った。

配列アクセスの連続化(2) kで連続アクセスしている配列もあるが、配列y、S1は飛びアクセス

fv、yyの次元を拡張し、 連続アクセスとなるようにjのループを最内側へ

22

Page 24: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

性能情報(1)

修正後 sub$1 240 0.148( 0.7) 0.617 8050.7 2477.5 94.96 62.0 0.080 0.002 0.005 0.008 0.041 39.72 -micro1 60 0.031( 0.1) 0.511 9882.9 3045.0 95.07 62.0 0.020 0.001 0.001 0.002 0.010 40.20 -micro2 60 0.032( 0.1) 0.528 9566.3 2947.0 95.06 62.0 0.020 0.000 0.001 0.002 0.010 39.86 -micro3 60 0.023( 0.1) 0.379 13309.0 4107.2 95.23 62.0 0.021 0.001 0.000 0.002 0.011 39.32 -micro4 60 0.063( 0.3) 1.050 4498.0 1376.7 94.45 62.0 0.019 0.000 0.003 0.002 0.010 39.47 sub$2 240 0.119( 0.6) 0.495 10874.2 3812.0 96.13 75.0 0.069 0.001 0.004 0.009 0.038 20.78 -micro1 60 0.024( 0.1) 0.404 13564.1 4759.1 96.22 75.0 0.017 0.000 0.001 0.002 0.009 21.29 -micro2 60 0.026( 0.1) 0.429 12782.1 4484.3 96.21 75.0 0.018 0.000 0.001 0.002 0.010 20.81 -micro3 60 0.020( 0.1) 0.329 16642.6 5844.5 96.30 75.0 0.018 0.000 0.000 0.002 0.010 20.67 -micro4 60 0.049( 0.2) 0.820 6235.8 2177.9 95.78 75.0 0.017 0.000 0.002 0.002 0.009 20.34 sub$3 240 0.116( 0.5) 0.484 11124.9 3900.3 96.14 75.0 0.069 0.001 0.004 0.009 0.038 19.99 -micro1 60 0.023( 0.1) 0.389 14075.6 4938.8 96.22 75.0 0.016 0.000 0.001 0.002 0.008 20.44 -micro2 60 0.025( 0.1) 0.409 13394.5 4700.2 96.23 75.0 0.018 0.000 0.001 0.002 0.010 20.00 -micro3 60 0.020( 0.1) 0.328 16674.0 5855.9 96.31 75.0 0.018 0.000 0.000 0.002 0.010 19.75 -micro4 60 0.049( 0.2) 0.810 6310.8 2204.3 95.79 75.0 0.017 0.000 0.002 0.002 0.010 19.74

修正前 PROC.NAME FREQUENCY EXCLUSIVE AVER.TIME MOPS MFLOPS V.OP AVER. VECTOR I-CACHE O-CACHE BANK CONFLICT ADB HIT TIME[sec]( % ) [msec] RATIO V.LEN TIME MISS MISS CPU PORT NETWORK ELEM.% sub$1 240 0.640( 2.7) 2.665 2138.8 573.8 82.74 78.0 0.119 0.000 0.037 0.004 0.020 40.48 -micro1 60 0.087( 0.4) 1.454 3942.0 1070.8 83.78 78.0 0.031 0.000 0.010 0.001 0.005 40.50 -micro2 60 0.174( 0.7) 2.908 2000.3 535.4 82.55 78.0 0.030 0.000 0.009 0.001 0.005 40.43 -micro3 60 0.161( 0.7) 2.679 2166.9 581.2 82.72 78.0 0.029 0.000 0.008 0.001 0.005 40.50 -micro4 60 0.217( 0.9) 3.619 1504.9 399.5 81.88 78.0 0.028 0.000 0.011 0.001 0.005 40.49 sub$2 240 0.996( 4.2) 4.149 1570.3 455.4 79.49 57.7 0.312 0.001 0.054 0.002 0.154 31.76 -micro1 60 0.154( 0.7) 2.560 2542.5 747.9 80.62 57.7 0.080 0.000 0.015 0.001 0.038 31.76 -micro2 60 0.273( 1.2) 4.548 1456.3 420.9 79.22 57.7 0.079 0.000 0.014 0.001 0.040 31.76 -micro3 60 0.273( 1.2) 4.553 1455.5 420.5 79.19 57.7 0.078 0.000 0.008 0.001 0.038 31.76 -micro4 60 0.296( 1.3) 4.934 1277.0 367.6 78.91 57.7 0.075 0.000 0.017 0.001 0.038 31.75 sub$3 240 1.074( 4.6) 4.474 1458.5 422.2 79.35 57.7 0.347 0.000 0.056 0.006 0.203 31.76 -micro1 60 0.161( 0.7) 2.680 2428.5 714.5 80.63 57.7 0.090 0.000 0.015 0.002 0.052 31.76 -micro2 60 0.293( 1.3) 4.884 1358.5 392.0 79.08 57.7 0.087 0.000 0.012 0.002 0.051 31.77 -micro3 60 0.288( 1.2) 4.800 1381.6 398.8 79.12 57.7 0.087 0.000 0.013 0.002 0.052 31.76 -micro4 60 0.332( 1.4) 5.533 1143.6 327.8 78.56 57.7 0.083 0.000 0.015 0.002 0.049 31.76

連続アクセス化(ループ長も長くなる)により、ベクトル演算率がアップ

23

Page 25: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

Min [U,R] Max [U,R] Average 7.870 [0,3] 7.919 [0,2] 7.886 11.825 [0,0] 14.674 [0,2] 13.443 0.031 [0,5] 0.088 [0,0] 0.039 8.915 [0,0] 10.710 [0,2] 10.255

4426903895 [0,5] 4812109059 [0,2] 4546107940 1896286968 [0,7] 1945716129 [0,1] 1921260489

132892937486 [0,7] 138255756617 [0,0] 135813054772 16006341819 [0,7] 16560621249 [0,0] 16352081277 56622332310 [0,7] 59262291481 [0,0] 57926949210

9515.087 [0,2] 11920.434 [0,0] 10338.832 3967.252 [0,2] 5011.779 [0,0] 4326.679

18906.209 [0,2] 32255.451 [0,0] 23372.989 7882.819 [0,2] 13561.351 [0,0] 9783.271 70.081 [0,7] 71.760 [0,0] 70.688 97.941 [0,2] 98.172 [0,5] 98.104

2048.000 [0,0] 2048.000 [0,0] 2048.000 1920.000 [0,0] 1920.000 [0,0] 1920.000 128.000 [0,0] 128.000 [0,0] 128.000

4 [0,0] 4 [0,0] 4 0 [0,0] 0 [0,0] 0

0.000 [0,0] 0.000 [0,0] 0.000 0 [0,0] 0 [0,0] 0

0.000 [0,0] 0.000 [0,0] 0.000 0 [0,0] 0 [0,0] 0

0.000 [0,0] 0.000 [0,0] 0.000 323.462 [0,7] 391.157 [0,0] 339.293 651.592 [0,2] 1058.430 [0,0] 766.459 0.009 [0,7] 0.033 [0,0] 0.012 0.160 [0,1] 0.865 [0,2] 0.260

0.149 [0,5] 0.271 [0,7] 0.201 1.503 [0,5] 1.650 [0,4] 1.565

60.461 [0,5] 61.552 [0,0] 60.864

Global Data of 8 processes : Min [U,R] Max [U,R] Average Real Time (sec) : 16.281 [0,5] 16.369 [0,0] 16.312 User Time (sec) : 21.729 [0,0] 24.103 [0,7] 22.899 Sys Time (sec) : 0.031 [0,7] 0.240 [0,0] 0.063 Vector Time (sec) : 8.927 [0,0] 18.824 [0,7] 17.088 Inst. Count : 5439959371 [0,3] 13999347945 [0,0] 6539590012 V. Inst. Count : 1944028126 [0,0] 2075116451 [0,1] 2044642963 V. Element Count : 135107180190 [0,7] 139322295184 [0,1] 137364271805 V. Load Element Count : 16556116289 [0,0] 17827345163 [0,2] 17479103913 FLOP Count : 56642416905 [0,7] 59283055382 [0,0] 57947372208 MOPS : 5747.426 [0,7] 6835.242 [0,0] 6202.318 MFLOPS : 2349.976 [0,7] 2728.304 [0,0] 2533.149 MOPS (concurrent) : 8823.119 [0,7] 11134.362 [0,0] 9753.216 MFLOPS (concurrent) : 3607.549 [0,7] 4444.308 [0,0] 3982.919 A. V. Length : 66.122 [0,7] 70.198 [0,0] 67.202 V. Op. Ratio (%) : 91.883 [0,0] 97.606 [0,1] 96.865 Total Memory Size (MB) : 1856.000 [0,0] 1856.000 [0,0] 1856.000 Memory Size (MB) : 1728.000 [0,0] 1728.000 [0,0] 1728.000 Global Memory Size (MB) : 128.000 [0,0] 128.000 [0,0] 128.000 Max Concurrent Proc. : 4 [0,0] 4 [0,0] 4 Event Busy Count : 0 [0,0] 0 [0,0] 0 Event Wait (sec) : 0.000 [0,0] 0.000 [0,0] 0.000 Lock Busy Count : 0 [0,0] 0 [0,0] 0 Lock Wait (sec) : 0.000 [0,0] 0.000 [0,0] 0.000 Barrier Busy Count : 0 [0,0] 0 [0,0] 0 Barrier Wait (sec) : 0.000 [0,0] 0.000 [0,0] 0.000 MIPS : 226.882 [0,7] 644.273 [0,0] 288.261 MIPS (concurrent) : 348.296 [0,7] 1049.497 [0,0] 455.954 I-Cache (sec) : 0.008 [0,7] 0.030 [0,0] 0.012 O-Cache (sec) : 0.450 [0,1] 1.215 [0,0] 0.554 Bank Conflict Time CPU Port Conf. (sec) : 0.107 [0,5] 0.266 [0,7] 0.170 Memory Network Conf. (sec): 1.744 [0,0] 2.560 [0,1] 2.357 ADB Hit Element Ratio (%) : 61.040 [0,2] 67.743 [0,0] 62.103

性能情報(2) オリジナル版 修正版

2.1倍

96.9%から98.1%へ

24

出力形式のDOループ回避 配列アクセスの連続化

Page 26: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

性能情報(3) 何がどう変わったのかをFtrace Viewerで見てみる(MPI)

MPI並列プロセス0のoutputが減少 (緑色部分)

I/Oを削減した結果、MPI通信

(IDLE)も 改善

SMP並列スレッド0のoutputが減少し、インバランスが改善

通信時間

アイドル時間

25

Page 27: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

性能解析ツール(ftrace)の利用 MFLOPS値が極端に小さい場合、要チェック 例:ピーク性能の1%以下 VLEN(平均ベクトル長)の値が小さい場合、要チェック 例:100以下

編集リストの利用 ベクトル化対象ループ(ループ添え字)の確認 連続アクセスでなければ入れ替えが可能か?

高速化のポイント

26

Page 28: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

CFDコード(その3)

27

Page 29: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化施策とその効果 MPI通信(派生データタイプ)の修正 メモリアクセスの削減(アウターアンロール) メモリアクセスの削減(ループ融合) (修正前と比較して)約2倍の高速化

28

Page 30: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

計算条件 流体コード(Fortran) 有限差分法 格子点数 180x180x240(約780万点) 反復回数 50 フラットMPI 対象マシン SX-ACE 27MPIプロセス(分割3x3x3)

29

Page 31: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

性能情報(ftrace) 849sec, 2700MFLOPS(全体) para_send_recv 時間コスト 50%、MPI通信部分 bicgstab 時間コスト 33%、4500MFLOPS(ピーク性能比 7%) subA 時間コスト 4.8%、初期化ルーチン (メインループの外側) FREQUENCY EXCLUSIVE AVER.TIME MOPS MFLOPS V.OP AVER. VECTOR I-CACHE O-CACHE BANK CONFLICT ADB HIT PROC.NAME

TIME[sec]( % ) [msec] RATIO V.LEN TIME MISS MISS CPU PORT NETWORK ELEM.% 210983 497.768( 49.8) 2.359 936.8 0.3 69.43 106.1 248.331 11.173 39.973 1.576 49.883 0.00 para_send_recv 50 333.472( 33.4) 6669.437 10961.8 4468.8 97.99 65.6 252.982 1.191 3.367 0.094 84.930 30.43 bicgstab 1 48.373( 4.8) 48373.480 20563.6 6327.1 98.64 254.2 39.019 0.000 0.672 0.042 0.102 99.32 subA 50 37.977( 3.8) 759.532 4458.5 558.0 98.69 191.4 31.762 0.020 0.183 0.593 5.968 18.86 subB 2500 19.313( 1.9) 7.725 27139.5 14092.2 99.81 61.7 19.310 0.001 0.001 0.000 6.296 75.26 subC ELAPSED COMM.TIME COMM.TIME IDLE TIME IDLE TIME AVER.LEN COUNT TOTAL LEN PROC.NAME TIME[sec] [sec] / ELAPSED [sec] / ELAPSED [byte] [byte] 497.983 440.644 0.885 253.739 0.510 721.1 67961738 45.6G para_send_recv 333.641 94.022 0.282 16.405 0.049 16.0 619940 9.5M bicgstab 48.386 0.000 0.000 0.000 0.000 0.0 0 0.0 subA 37.988 32.740 0.862 17.038 0.449 82.1M 800 64.1G subB 19.325 0.000 0.000 0.000 0.000 0.0 0 0.0 subC

30

Page 32: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

ソースコード修正 MPI通信の修正(tune1) コンパイラ指示行の挿入(tune2) ループ融合(tune3)

31

Page 33: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

MPI通信の修正(tune1) 派生データタイプ†の変更 MPI関数の呼び出し回数の削減 通信データサイズの拡大

32

†派生データタイプ アドレスが飛び飛びのデータ(不連続データ)を、まとめて通信できるように新たに設定したデータタイプ。

Page 34: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

派生データタイプの変更 do k=2,MZ-2 c ------------------------------------------ call MPI_ISEND &(A(MX-1-len,2,k), 1,TYPE1,Iup ,1, & MPI_COMM_WORLD,ISEND1,IERR) call MPI_ISEND &(A(2,2,k) ,1,TYPE1,Idown,1, & MPI_COMM_WORLD,ISEND2,IERR) c ------------------------------------------ call MPI_IRECV &(A(MX-1,2,k) ,1,TYPE1,Iup ,1, & MPI_COMM_WORLD,IRECV1,IERR) call MPI_IRECV &(A(2-len,2,k) ,1,TYPE1,Idown,1, & MPI_COMM_WORLD,IRECV2,IERR) c ------------------------------------------ call MPI_WAIT(ISEND1,ISTATUS,IERR) call MPI_WAIT(ISEND2,ISTATUS,IERR) call MPI_WAIT(IRECV1,ISTATUS,IERR) call MPI_WAIT(IRECV2,ISTATUS,IERR) c ------------------------------------------ enddo

call MPI_ISEND &(A(MX-1-len,2,2),MZ-3,TYPE2,Iup ,1, & MPI_COMM_WORLD,REQ(1),IERR) call MPI_ISEND &(A(2,2,2) ,MZ-3,TYPE2,Idown,1, & MPI_COMM_WORLD,REQ(2),IERR) c ------------------------------------------ call MPI_IRECV &(A(MX-1,2,2) ,MZ-3,TYPE2,Iup ,1, & MPI_COMM_WORLD,REQ(3),IERR) call MPI_IRECV &(A(2-len,2,2) ,MZ-3,TYPE2,Idown,1, & MPI_COMM_WORLD,REQ(4),IERR) c ------------------------------------------ call MPI_WAITALL(4,REQ,MPI_STATUSES_IGNORE,IERR) c ------------------------------------------

33

do k=2, mz-2 call MPI_ISEND(A(MX-1-len,2,k), 1, TYPE1 …. ・・・ enddo

・・・

TYPE1

mz-3要素 call MPI_ISEND(A(MX-1-len,2,2), mz-3, TYPE2 ….

MPI_ISENDの呼び出し回数を削減し、1回あたりの通信量を大きくする

TYPE2

・・・

Page 35: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

コンパイラ指示行(tune2) outerunroll=4 指示行の挿入

10115: |+-----> do k=2,MZ-2 10116: || !cdir outerunroll=4 10117: ||+----> do j=2,MY-2 10118: |||V---> do i=2,MX-2 10119: |||| A Amp(i,j,k) = -Am7(i,j,k)*t(i,j,k) 10120: |||| & +Am1(i,j,k)*t(i+1,j,k)+Am2(i,j,k)*t(i-1,j,k) 10121: |||| & +Am3(i,j,k)*t(i,j+1,k)+Am4(i,j,k)*t(i,j-1,k) 10122: |||| & +Am5(i,j,k)*t(i,j,k+1)+Am6(i,j,k)*t(i,j,k-1) 10123: |||| A r0rk = r0rk + r0(i,j,k)* r(i,j,k) 10124: |||| r0Apk = r0Apk + r0(i,j,k)*Amp(i,j,k) 10125: |||V--- enddo 10126: ||+---- enddo 10127: |+----- enddo

34

Page 36: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

コンパイラ指示行(tune2 続き) Jのループで(4段)アンロールされる 同一配列添字のベクトルロード命令が削減される その結果、メモリアクセスが減り、実行時間の短縮につながる

. do j = j1 + 1, my - 3, 4 . !cdir nodep . !cdir on_adb(r,r0,t,amp,am1,am7,am2,am3,am4,am5,am6) . do i = 1, mx-3 . amp(1+i,j+1,k) = am1(1+i,j+1,k)*t(2+i,j+1,k) - am7(1+i,j+1,k . 1 )*t(1+i,j+1,k) + am2(1+i,j+1,k)*t(i,j+1,k) + am3(1+i,j+1 . 2 ,k)*t(1+i,j+2,k) + am4(1+i,j+1,k)*t(1+i,j,k) + am5(1+i,j . 3 +1,k)*t(1+i,j+1,k+1) + am6(1+i,j+1,k)*t(1+i,j+1,k-1) . amp(1+i,j+2,k) = am1(1+i,j+2,k)*t(2+i,j+2,k) - am7(1+i,j+2,k . 1 )*t(1+i,j+2,k) + am2(1+i,j+2,k)*t(i,j+2,k) + am3(1+i,j+2 . 2 ,k)*t(1+i,j+3,k) + am4(1+i,j+2,k)*t(1+i,j+1,k) + am5(1+i . 3 ,j+2,k)*t(1+i,j+2,k+1) + am6(1+i,j+2,k)*t(1+i,j+2,k-1) . amp(1+i,j+3,k) = am1(1+i,j+3,k)*t(2+i,j+3,k) - am7(1+i,j+3,k . 1 )*t(1+i,j+3,k) + am2(1+i,j+3,k)*t(i,j+3,k) + am3(1+i,j+3 . 2 ,k)*t(1+i,j+4,k) + am4(1+i,j+3,k)*t(1+i,j+2,k) + am5(1+i . 3 ,j+3,k)*t(1+i,j+3,k+1) + am6(1+i,j+3,k)*t(1+i,j+3,k-1) . amp(1+i,j+4,k) = am1(1+i,j+4,k)*t(2+i,j+4,k) - am7(1+i,j+4,k . 1 )*t(1+i,j+4,k) + am2(1+i,j+4,k)*t(i,j+4,k) + am3(1+i,j+4 ・・・

35

Page 37: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

アウターアンロール指示行の効果 bicgstabルーチンの性能情報 5300MFLOPS ⇒ 6500MFLOPS(23%性能向上) 差分パターン(隣接点参照演算を含む多重ループ)で有効

FREQ UENCY

EXCLUSIVE TIME [sec]

( % ) MFLOPS V.OP RATIO

AVER. V.LEN

VECTOR TIME

CPU PORT CONFLICT

NETWORK CONFLICT

ADB HIT ELEM.

% tune1 50 279.7 55.7 5328.2 98.3 65.7 260.7 0.2 84.8 30.4

tune2 50 227.3 50.6 6564.4 98.3 62.9 205.7 0.2 92.5 26.9

36

Page 38: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

ループ融合(tune3) 同一添字配列tのベクトルロード命令を削減 メモリアクセスを減らすことが可能

10227: |+-----> do k=1,MZ 10228: ||+----> do j=1,MY 10229: |||V---> do i=1,MX 10230: |||| A x(i,j,k) = x(i,j,k) + alpha*p(i,j,k) + omega*t(i,j,k) 10231: |||| c enddo 10232: |||| c enddo 10233: |||| c enddo 10234: |||| 10237: |||| c do k=1,MZ 10238: |||| c do j=1,MY 10239: |||| c do i=1,MX 10240: |||| A r(i,j,k) = t(i,j,k) - omega*Am(i,j,k) 10241: |||| A r0rk1 = r0rk1 + r0(i,j,k)*r(i,j,k) 10242: |||V--- enddo 10243: ||+---- enddo 10244: |+----- enddo

37

Page 39: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

性能情報(PROGINF) 849sec ⇒ 425sec(約2倍の性能向上)

tune1:派生データタイプの変更 tune2:アウターアンロール指示行(含tune1) tune3:ループ融合(含tune2)

オリジナル版 tune1 tune2 tune3 Real Time (sec) 849.60 483.37 427.82 425.65 User Time (sec) 848.71 480.89 427.25 425.03 Sys Time (sec) 0.09 0.04 0.11 0.06 Vector Time (sec) 575.91 412.38 359.76 350.24 Inst. Count 2.834E+11 1.718E+11 1.681E+11 1.653E+11 V. Inst. Count 7.599E+10 7.397E+10 7.313E+10 7.310E+10 V. Element Count 6.038E+12 5.818E+12 5.607E+12 5.605E+12 V. Load Element Count 1.652E+12 1.585E+12 1.527E+12 1.496E+12 FLOP Count 2.287E+12 2.287E+12 2.289E+12 2.289E+12 MOPS 7358.97 12301.96 13346.22 13404.03 MFLOPS 2694.80 4755.96 5356.81 5384.78 A. V. Length 79.46 78.66 76.67 76.67 V. Op. Ratio (%) 96.68 98.35 98.33 98.38 Memory Size (MB) 1728.03 1728.03 1728.03 1728.03 MIPS 333.98 357.17 393.47 388.90 I-Cache (sec) 11.13 3.43 3.57 3.86 O-Cache (sec) 35.83 5.83 8.20 10.67 Bank Conflict Time CPU Port Conf. (sec) 2.50 2.09 2.10 2.03 Memory Network Conf. (sec) 145.64 114.32 122.47 116.11 ADB Hit Element Ratio (%) 37.75 39.29 36.64 37.39

38

Page 40: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化のポイント MPI通信回数の削減 派生データタイプの変更 有限差分法の隣接参照パターン アウターアンロール指示行が有効 コンパイラリスト(編集リスト)のループ処理の確認 ループ融合

編集リストの出力方法 sxf90の場合 –R5(または-R2)オプション

39

Page 41: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

高速化のポイントのまとめ 性能情報の確認 MFLOPS、VLENの確認(京:fipp、fapp、SX-ACE:ftraceより) MFLOPS値が極端に小さい場合(例:ピーク性能の1%以下など) VLENの値が小さい場合(例:100以下)

コンパイルリスト、編集リストの利用 ソフトウェアパイプライン化 レジスタ不足などの阻害要因のチェック

SIMD化/ベクトル化対象ループの添え字の確認 連続アクセス化

ループ融合可能か?(コンパイラが行っているか) ソースコード修正 有限差分法の隣接点参照パターン アウターアンロール指示行の利用 MPI通信回数の削減 派生データタイプの変更

パイプライン化 (「京」で有効)

メモリアクセス削減 (「京」/SX-ACEで有効)

MPI通信削減 (「京」/SX-ACEで有効)

40

Page 42: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

ご清聴ありがとうございました

41

Page 43: 「京」、HPCIにおける高速化事例紹介 · 「京」、HPCIにおける高速化事例紹介 2015 年 12月 一般財団法人 高度情報科学技術研究機構 神戸センター

ご参考

42

SIMD(Single Instrunction Multiple Data)化 同種類の複数の演算を、1命令

で演算するようにすること。 ソフトウェアパイプライン 命令スケジューリングの一種。

演算内の異なるステージをオーバラップさせ、並列に動作させる仕組み。

ベクトル化 同種類の複数の演算を、1命令

で演算するようにすること。SIMDと比べて1命令で処理できるデータ量が多い。

DO i=1, n C(i) = A(i) + B( ENDDO

SIMD化、ベクトル化 A(1) A(2) B(1) B(2) + A(3) A(4) B(3) B(4) + A(5) A(6) B(5) B(6) +

・・・ A(n-1) A(n) B(n-1) B(n) +

(時間方向)

A(1)

A(2)

B(1)

B(2) + +

A(n) B(n) + ・・・

(時間方向)

逐次処理

(時間方向) ソフトウェアパイプライン化

S1 S2 S3 S4

S1 S2 S3 S4

S1 S2 S3 S4

S1 S2 S3 S4