サイエンティフィック・システム研究会
マルチコアクラスタ性能WG
４．３

コンパイラにおけるFMA命令化の検証報告

富士通株式会社
千葉 修一

Copyright 2013 FUJITSU LIMITED【 背景 】■ 課題■

コーディングスタイルとFMA命令化※1の関係性■

FMA命令を効率的に出力する手法

223 do i = 1,nx
224 dzi=czi/rg(i)**2
225 dz2i=cz2i/rg(i)**2
226 do j = 1,ny
227 do l = 1,nv
228 vzl(l)=2*vz(l,j,i)*if5d
229 vvl(l)=(vv(l,j,i)+vv(l-1,j,i))
230 vvr(l)=(vv(l,j,i)+vv(l+1,j,i))
231 vvl2(l)=(vv(l,j,i)+vv(l-2,j,i))
232 vvr2(l)=(vv(l,j,i)+vv(l+2,j,i))
233 enddo
234 do k = 1,nz
235 do l = 1,nv
236 fzl=(f(l,k,j,i)+f(l,k-1,j,i))
237 fzr=(f(l,k,j,i)+f(l,k+1,j,i))
238 flz = (fzr-fzl)*vzl(l)*dzi
239 fvl=(f(l,k,j,i)+f(l-1,k,j,i))
240 fvr=(f(l,k,j,i)+f(l+1,k,j,i))
241 flv = (vvr(l)*fvr-vvl(l)*fvl)*dvi
242 fzl2=(f(l,k,j,i)+f(l,k-2,j,i))
243 fzr2=(f(l,k,j,i)+f(l,k+2,j,i))
244 flz2 = (fzr2-fzl2)*vzl(l)*dz2i
245 fvl2=(f(l,k,j,i)+f(l-2,k,j,i))
246 fvr2=(f(l,k,j,i)+f(l+2,k,j,i))
247 flv2 = (vvr2(l)*fvr2-vvl2(l)*fvl2)*dv2i
248 flow=-(cc1*(flz+flv)-cc2*(flz2+flv2))
249 df(l,k,j,i)=flow
250 enddo
251 enddo※1 FMA命令：浮動小数点積和演算命令(Floating-Point Multiply and Add)

■ 検証コード■■

GT5Dコードにおける line 223 差分演算部
ループ分割を適用し line 234 以降のループを検証
検証マシンは、FX1および京※2■ ループの特徴■

回転数は、nx=48, ny=80, nz=64, nv=100■

イタレーション方向に依存なし■SIMD命令化可能、SoftwarePipelining可能■

大きく２系統の演算ツリー■

line 226、234でループ分割が可能*2「京」は、理化学研究所が2010年7月に決定した「次世代スーパーコンピュータ」の愛称です。
1

Copyright 2013 FUJITSU LIMITED

Copyright 2013 FUJITSU LIMITED1【 FMA命令化の状況 】■ FX1 vs 京■■

ループアンローリング、ソウトウェアパイプライニングの適用状況に応じて、アセンブラ上の命令数に差は生じているが、双方とも同等のＦＭＡ命令化率となっている
等価となるオプション(○)でFX1と京を比較した場合、ＦＭＡ命令の種類に変化があるが、これは、FMA命令化のアルゴリズムが変化したことに起因しており、性能に影響はない

コンパイラ種別/オプション○○

FMA:Multiply&Add

FMA:Multiply&Sub

nosimdsimd※1

nosimdsimd※1

FMA数/unroll(scalar換算)

unroll

FX1 -Kfast

4801205FX1-Kfast,noswp

240605

京-Kfast8※2080125

京-Kfast,nosimd

61801205

京-Kfast,noswp

4※204065

京-Kfast,nosimd,noswp

260405※1 京は、2 wide-simdであるため、SIMD命令は２命令として計上※2 SIMD化で展開する２展開を含む
2Copyright 2013 FUJITSU LIMITED【 FMA命令化の状況 】■ FMA化の状況（その１）■■■line 241をFMA化
line 247をFMA化
line 248をFMA化

234 do k = 1,nz
235 do l = 1,nv
236
fzl = f(l,k,j,i) + f(l,k-1,j,i)237fzr = f(l,k,j,i) + f(l,k+1,j,i)238
flz = ( fzr - fzl ) * vzl(l) * dzi
239
fvl = f(l,k,j,i) + f(l-1,k,j,i)240
fvr = f(l,k,j,i) + f(l+1,k,j,i)241
flv = ( vvr(l) * fvr - vvl(l) * fvl ) * dvi
242 fzl2= f(l,k,j,i) + f(l,k-2,j,i)
243 fzr2= f(l,k,j,i) + f(l,k+2,j,i)
244 flz2= ( fzr2 - fzl2 ) * vzl(l) * dz2i
245 fvl2= f(l,k,j,i) + f(l-2,k,j,i)
246 fvr2= f(l,k,j,i) + f(l+2,k,j,i)
247 flv2= ( vvr2(l) * fvr2 - vvl2(l) * fvl2 ) * dv2i
248 flow=-( cc1 * ( flz + flv ) - cc2 * ( flz2 + flv2 ) )249
df(l,k,j,i)=flow
250 enddo
251 enddo

3

Copyright 2013 FUJITSU LIMITED

Copyright 2013 FUJITSU LIMITED2

【 FMA命令化の状況 】■ FMA化の状況（その２）■■line 241 + 247をFMA化
line 247 + 247をFMA化

234 do k = 1,nz
235 do l = 1,nv
236
fzl = f(l,k,j,i) + f(l,k-1,j,i)237
fzr = f(l,k,j,i) + f(l,k+1,j,i)238
flz = ( fzr - fzl ) * vzl(l) * dzi
239 fvl = f(l,k,j,i) + f(l-1,k,j,i)240
fvr = f(l,k,j,i) + f(l+1,k,j,i)241
flv = ( vvr(l) * fvr - vvl(l) * fvl ) * dvi
242 fzl2= f(l,k,j,i) + f(l,k-2,j,i)
243 fzr2= f(l,k,j,i) + f(l,k+2,j,i)
244 flz2= ( fzr2 - fzl2 ) * vzl(l) * dz2i
245 fvl2= f(l,k,j,i) + f(l-2,k,j,i)
246 fvr2= f(l,k,j,i) + f(l+2,k,j,i)
247 flv2= ( vvr2(l) * fvr2 - vvl2(l) * fvl2 ) * dv2i
248 flow=-( cc1 * ( flz + flv ) - cc2 * ( flz2 + flv2 ) )249 df(l,k,j,i)=flow
250 enddo
251 enddo

4

Copyright 2013 FUJITSU LIMITED【 コンパイラの動作 】■ コンパイラのアルゴリズム
df(l,k,j,i)

（－）

①
（＊）

FMA化対象

（＊）
（＋）

-cc1
（＋）

-cc1

（＊）

②

（＊）
（＊）

（＊）
dzi

（＊）
dzi

（＊）
（－）
（－）

f(l,k,j,i)f(l,k,j,i)f(l,k-1,j,i)

dvi
dvi

（－）

vzl(l)

cc1系

vzl(l)

f(l,k,j,i)f(l,k+1,j,i)（＋）（＋）
f(l,k+1,j,i)f(l,k,j,i)

⑤

③ （＊）

（＊）
（＊）

（＋）
（＋）
f(l,k-1,j,i)f(l,k,j,i)

（－）

（＊）

（＋）
（＋）

①～⑤

④

vvr(l)
f(l,k,j,i)f(l-1,k,j,i)vvl(l)

vvr(l)

vvl(l)（＋）
f(l-1,k,j,i)f(l,k,j,i)f(l,k,j,i)（＋）

f(l+1,k,j,i)f(l+1,k,j,i)

cc2系
■

cc1系

データストアを起点に演算ツリーを構築し、M&Aを探索命令数= add=4、sub=2、mult=7、madd=3、msub=2 ※共通式の除去最適化を適用済み

■

■

■

大きな演算ツリーごとに２か所、ストア部分で１か所、計５か所をFMA化
コンパイラは演算ツリーにより最適化を適用するため、FMA命令化の適用条件は、コーディングスタイルに依存しない
現状、ＦＭＡ化を判断できるメッセージは提供されていないため、アセンブラコードから計上する必要がある
5

Copyright 2013 FUJITSU LIMITED

Copyright 2013 FUJITSU LIMITED3

【 FMA命令化による性能効果 】

FMA命令化指示あり

FMA命令化指示なし

2/3命令コミットに含まれる演算が4命令コミットへ吸収される

コンパイル
オプション

実行時間
(sec)

Fピーク比

MFLOPSMIPS

F演算数

FMA命令化
指示なし

0.12

34.60%

5535

5140

6.53E+08 1.68E-02

4.22E-02

4.41E-02

FMA命令化
指示あり

0.10

38.82%

62115151

6.51E+08 1.60E-02

2.93E-02

4.41E-02

1命令コミット

6

2/3命令コミット
4命令コミット(その他)

Copyright 2013 FUJITSU LIMITED【 まとめ 】■ コーディングスタイルとFMA命令化の関係性コーディングスタイルに依存しない■ FMA命令を効率的に出力する手法コンパイラは、コード列を演算ツリーに置き換えて最適化を適用するため、利用者が意識する必要はないコンパイラがFMA命令の対象を判断するため、利用者が操作することができな
い■ コンパイラへの課題抽出利用者がFMA命令化されたコード列を判断できないため、コンパイラで以下の機能を検討する－メッセージの出力－リスティング情報の出力
7

Copyright 2013 FUJITSU LIMITED

Copyright 2013 FUJITSU LIMITED

4