25
CFDコード(その115

CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

CFDコード(その1)

15

Page 2: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

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

16

Page 3: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

17

Page 4: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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 5: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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 6: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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 7: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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 8: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

修正前の編集リスト

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 9: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

性能情報(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 10: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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] 45461079401896286968 [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 11: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

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

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

(IDLE)も 改善

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

通信時間

アイドル時間

25

Page 12: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

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

高速化のポイント

26

Page 13: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

CFDコード(その2)

27

Page 14: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

28

Page 15: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

29

Page 16: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

性能情報(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 17: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

31

Page 18: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

32

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

Page 19: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

派生データタイプの変更 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 20: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

コンパイラ指示行(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 21: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

コンパイラ指示行(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 22: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

アウターアンロール指示行の効果 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 23: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

ループ融合(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 24: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

性能情報(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 25: CFDコード(その1CFDコード(その1 ) 15 高速化施策とその効果 出力形式のDOループ回避 配列アクセスの連続化 (修正前と比較して)約2倍の高速化

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

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

39