SX-ACEにおける流体コードの 高速化事例紹介SX-ACE における流体コードの...
Transcript of SX-ACEにおける流体コードの 高速化事例紹介SX-ACE における流体コードの...
計算条件 流体コード(Fortran) 有限差分法 格子点数 180x180x240(約780万点) 反復回数 50 フラットMPI 対象マシン SX-ACE 27MPIプロセス(分割3x3x3)
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
3
MPI通信の修正(tune1) 派生データタイプ†の変更 MPI関数の呼び出し回数の削減 通信データサイズの拡大
5
†派生データタイプ アドレスが飛び飛びのデータ(不連続データ)を、まとめて通信できるように新たに設定したデータタイプ。
派生データタイプの変更 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 ------------------------------------------
6
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
・・・
コンパイラ指示行(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
7
コンパイラ指示行(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 ・・・
8
アウターアンロール指示行の効果 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
9
ループ融合(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
10
性能情報(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
11