2.2. 少回転最内ループのループ交換

2.2.1. 動機

富士通Fortran/C/C++コンパイラはA64FXプロセッサのプレディケートレジスタを用いることにより、任意の繰り返し数のループをSIMD化します。 ただし、ループ繰り返し数が少なく、かつSIMD幅の倍数ではない場合、プレディケートレジスタによって無効化される演算の量は無視できない割合になります。

ここで、最内ループの繰り返し数が少ないものの、外側ループの繰り返し数が相対的に多い場合、これらのループをループ交換することによって、 プレディケートレジスタによって無効化される演算の割合を抑制 できるケースがあります。

その結果、無駄な演算が削減されて、実行時間を短縮できる可能性があります。

2.2.2. 適用例

A64FX向けチューニング技術検討会 で示されたコード例を用いて、性能改善の例を以下に示します。 この例では、ループ繰り返し数が少ないdo変数ichのループを、do変数kのループとループ交換しています。

改善前
  do k = 1, rd_kmax
     ip = indexP(k)
     length = gas(k,i,j,igasabs(igas,iw)) * PPM * dz_std(k)
     do ich = 1, chmax
        A1 = AKD(ich,ip-1,1,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ich,ip ,1,gasno,iw) * ( factP(k) )
        A2 = AKD(ich,ip-1,2,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ich,ip ,2,gasno,iw) * ( factP(k) )
        A3 = AKD(ich,ip-1,3,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ich,ip ,3,gasno,iw) * ( factP(k) )
        factPT = factT32(k)*(A3-A2) + A2 + factT21(k)*(A2-A1)
        tauGAS(k,ich) = tauGAS(k,ich) + 10.0_RP**factPT * length
     enddo
  enddo
改善後
  do ich = 1, chmax
     do k = 1, rd_kmax
        ip = indexP(k)
        A1 = AKD(ip-1,ich,1,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ip ,ich,1,gasno,iw) * ( factP(k) )
        A2 = AKD(ip-1,ich,2,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ip ,ich,2,gasno,iw) * ( factP(k) )
        A3 = AKD(ip-1,ich,3,gasno,iw) * ( 1.0_RP - factP(k) )&
             + AKD(ip ,ich,3,gasno,iw) * ( factP(k) )
        factPT = factT32(k)*(A3-A2) + A2 + factT21(k)*(A2-A1)
        length = gas(k,i,j,igasabs(igas,iw)) * PPM * dz_std(k)
        tauGAS(k,ich) = tauGAS(k,ich) + 10.0_RP**factPT * length
     enddo
  enddo

改善前および改善後コードのSIMD命令率とサイクルアカウンティング測定結果を下記グラフに示します。 なお、性能測定条件は以下のとおりです。

rd_kmax = 54、chmax = 5

改善前(上段のグラフ)に対して改善後(下段のグラフ)の測定結果では、実行時間が51%減ったことが分かります。 このとき浮動小数点演算命令実行数は35%減少し、浮動小数点演算パイプライン有効要素率は68%から86%に向上していました。

_images/dtrn3.29503716.1.simd.png _images/dtrn3.29503716.1.png _images/dtrn3.29503716.2.simd.png _images/dtrn3.29503716.2.png

2.2.3. 実例

A64FX向けチューニング技術検討会 にて、この種の事例が以下のとおり紹介されています。