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

４．１
ハードウェアプリフェッチとソフト
ウェアプリフェッチの仕様について
富士通株式会社
内藤俊也
Copyright 2013 FUJITSU LIMITED

目次
ハードウェアプリフェッチとソフトウェアプリフェッチ

HWPFの動作アルゴリズム
HWPFとSWPFの協調の性能検証
HWPFとSWPFの協調を行う理由
HWPFとSWPFの協調をしないケース
HWFPに比べてSWPFを利用する方が性能が良い例
まとめ
トラブルシューティング
1

Copyright 2013 FUJITSU LIMITEDハードウェアプリフェッチとソフトウェアプリフェッチ
プリフェッチとは、あらかじめメインメモリからキャッシュメモリにデータを読み込み、メモリアク
セスのレイテンシを隠蔽する機能です。プリフェッチの方法としては以下の２つがあります。

 ハードウェアプリフェッチ(以降HWPFとする)プログラムのメモリアクセスの規則性から、今後のデータアクセスをハードウェアが予測し、あらかじめメインメモリからキャッシュメモリにデータを読み込む仕組みです。
 ソフトウェアプリフェッチ(以降SWPFとする)
ソフトウェア(コンパイラ)がプログラムを解析し、prefetch命令を生成することで、あらかじめメインメモリからキャッシュメモリにデータを読み込む仕組みです。
<<< Loop-information Start >>><<< [PARALLELIZATION]<<< Standard iteration count: 211 全18ストリーム<<< [OPTIMIZATION]
HWPF：１６ストリーム<<< SIMD(a2～a14,a16～a18)<<< SOFTWARE PIPELINING<<< PREFETCH:4
SWPF：２ストリーム<<<
a15: 2, a1: 2(a1,a15)<<< Loop-information End >>>1 pp 2v
do i=1,m
1 p 2va1(i) = a2(i) + a3(i) + a4(i) + a5(i) + a6(i) + a7(i) &1+ a8(i) + a9(i) + a10(i) + a11(i) + a12(i) + a13(i) &1+ a14(i) + a15(i) + a16(i) + a17(i) + a18(i)1 p 2venddo

 推奨オプションかつ連続アクセスの場合のSWPF生成アルゴリズム
 １６ストリーム以下はHWPFに任せ、
１７ストリーム以上をSWPFが補填する。
（HWPFとSWPFの協調）
1194
1195
1196
1197
1198
2

Copyright 2013 FUJITSU LIMITEDHWPFの動作アルゴリズム
1. キャッシュラインA のミスが発生すると、ラインA+1/A-1が、PFQ(プリフェッチキュー)と呼ばれる16 エントリあるFIFO(キュー)に新規登録される。 (図１)2. 後続アクセスがラインA+1にアクセスすると、PFQに登録されているA+1にヒットした時に昇順ストリームアクセスと判断して、以降は昇順方向にHWPFを開始する。また、PFQの
A+1はA+2に更新される。(図２)
 PFQ とプリフェッチアドレスの対応

 プリフェッチの概略
A+1

A

A+2

c h angee n try
L1 miss

PFQ
A+1 / A-1

L1 miss
A+ 1 PFQ-hit:

A+1 -> A+2

A+2 -> A+3

A+ 2 PFQ-hit:+1

A PFQ-miss

図１

PFQ

:

+1/ -1
A+ 2 L2 prefetch
A+ 3 L2 prefetch
L1PF

c h ange

L1 miss

PFQ

L2PF

+1
A+2,
A+3

L1PF

L2PF

A+ 4 L1 prefetch
A+ 4 L2 prefetch
A+ 5 L2 prefetch

図２

図３

A+4

A+4,
A+5

L1PF

L2PF

PFQ-hitL2HWPF-ADRS

A+ 1

A+ 2, A+ 3

L1PHWF-ADRS

A+ 2

A+ 4, A+ 5

A+ 4

A+ 3

A+ 6, A+ 7

A+ 5

A+ 4

A+ 8, A+ 9

A+ 6

A+ 5

A+10, A+11

A+ 7

A+ 6

A+12, A+13

A+ 8

A+ 7

A+14, A+15

A+ 9

A+ 8

A+16, A+17

A+10

A+ 9

A+18, A+19

A+11

A+10

A+20, A+21

A+12

A+11

A+22, A+23

A+13

A+12

A+24, A+25

A+14

A+13

A+26, A+27

A+15

A+14

A+28, A+29

A+16

A+15

A+30, A+31

A+17

A+16

A+32

A+18

A+17

A+33

A+19

注) A+1等の数字はラインで示している。バイト表記では 1 ライン = 128 バイトで読み替えて下さい。
3

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調の性能検証(1/2)
 検証内容
ロード数を増やしていった場合のスループットについて確認を行います。(ONL2
ケースで検証) 検証プログラム
 LD1
do i=1,mx = ｘ + a1(i)
enddo
 LD2
do i=1,mx = ｘ + a1(i) + a2(i)
enddo
・・・・・
 LD21
do i=1,mx = ｘ + a1(i) + a2(i) + a3(i) + …a21(i)
enddo

4

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調の性能検証(2/2)
HWPF

HWPF+SWPF

21ストリームまで安定した性能が得られている。
⇒HWPFとSWPFの協調がうまく機能している(*1)-Kprefetch_cache_level=1を指定

Cache
L1D ミス率(/ロード・ストア数)
HWPFとSWPFの協調あり
HWPFとSWPFの協調なし

6.34%
6.33%

L1D ミス dm率(/L1D ミス数)
18.86%
25.81%

5

ロード・ストア数
6.90E+09
6.90E+09

L1D ミス数
4.37E+08
4.37E+08

L1D ミス hwpf 率 L1D ミス swpf 率(/L1D ミス数)(/L1D ミス数)
73.86%
74.16%

7.28%
0.03%

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調を行う理由(1/2)
SWPFは命令でありコミット時間の対象になるため、性能が低下する場合があります。本検証では、アンローリング、ソフトウェアパイプライニングの最適化を抑止した状態(冗長なSWPFが生成される状態)の性能を検証します。

 冗長なSWPF
同一キャッシュラインに対して複数のSWPFが実行されることです。一般にアンローリングやソフトウェアパイプライニングなどの最適化によって冗長なSWPF抑えることができます。
キャッシュミスするSWPF
キャッシュヒットするSWPF(冗長なSWPF)
配列１要素（８バイト）
キャッシュライン 冗長なSWPFなし

1

2

3

4

5

6

7

8

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

 冗長なSWPFあり(今回の検証パターン)

1

2

3

4

5

6

7

8

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

6

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調を行う理由(2/2)
 冗長なSWPFの影響

冗長なSWPFによるコミット時
間増加の影響(*1)-Kprefetch_cache_level=1を指定(*2)-Kprefetch_cache_level=1,prefetch_sequential=soft指定

全てのケースにおいて冗長SWPFを無くすことができれば良いが、ボディが大きいループなど
展開できないケースはどうしても冗長SWPFの影響を受けてしまう。
⇒HWPFは冗長プリフェッチとはならないため
HWPFに任せるところはHWPFに任せHWPFに任せられない部分のみSWPFで補填している。
7

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調をしないケース（１） -Kprefetch_sequential=softが有効な場合
HWPFには以下のデメリットがあるため協調をやめることで性能向上することがあります。
 HWPFのデメリット-Kprefetch_sequential=soft
ループ内で使用される連続的にアクセスされる配列データに対して、ハードウェアプリフェッチを利用せずに、 prefetch
命令を出力します。

• ストロングプリフェッチへの変更ができない。
• 距離の変更ができない。

(*1)-Kprefetch_cache_level=1を指定(*2)-Kprefetch_cache_level=1,prefetch_sequential=soft,prefetch_strong,prefetch_line=3を指定

ストロングプリフェッチによりロストを軽減⇒L1ミスdm率が減少

Cache
L1D ミス率(/ロード・ストア数)
HWPFとSWPFの協調あり
HWPFとSWPFの協調なし

ロード・ストア数

6.43%
6.44%

1.66E+09
1.66E+09

L1D ミス dm率(/L1D ミス数)

L1D ミス数
1.07E+08
1.07E+08

L1D ミス hwpf 率 L1D ミス swpf 率(/L1D ミス数)(/L1D ミス数)

15.39%
3.64%

8

84.49%
28.11%

0.12%
68.26%

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調をしないケース（２） IF構文のブロックの中にメモリアクセスがある場合

4
5
6
7
8

1 pp
2 p
2 p
2 p
1 p

<<< Loop-information Start >>><<< [PARALLELIZATION]<<< Standard iteration count: 696<<< [OPTIMIZATION]<<< PREFETCH: 32<<<
b: 16, a: 16<<< Loop-information End >>>8s
do i=1,n8m
if(c(i) < i) then8sa(i) = b(i)
8v
endif
8v
enddo 真率により連続にアキャッシュライン
配列のアクセス 連続にアクセスするケース

B(1)

・・・

B(17)

・・・

B(33)

・・・

B(49)

・・・

B(65)

・・・

HWPFが動作する

クセスしないことがある ストライドアクセスするケース

B(1)推奨オプションでは、最悪ケースを考えIF
構文のブロックの中のメモリアクセスに関してはSWPFを常に生成する。

・・・

B(17)

・・・

B(33)

・・・

B(49)

・・・

B(65)

・・・

HWPFが動作しない

9

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFの協調をしないケース（３） IF構文のブロックの中で条件付きストア命令を使用している場合(-Ksimd=2)

4
5
6
7
8

1 pp
2 p
2 p
2 p
1 p

 アセンブラ(IF構文のブロックの中のメモリアクセ
ス抜粋）<<< Loop-information Start >>><<< [PARALLELIZATION]<<< Standard iteration count: 696<<< [OPTIMIZATION]<<< SIMD<<< SOFTWARE PIPELINING<<< PREFETCH
:4
<<<
a: 4
<<< Loop-information End >>>6v
do i=1,n6v
if(c(i) < i) then6v
a(i) = b(i)
6v
endif
6v
enddo 真率により連続にア-Ksimd=2によりIF構文が削減されたことでロード命令は連続アクセスとなる。

ldd,s [%o3+%xg3],%f38
stdfr,d %f38,%f36,[%xg2]
条件付きストア命令のマスクがOFFの時はキャッシュをアクセスしない⇒HWPFが動作しないことがある

クセスしないことがある

推奨オプションでは、最悪ケースを考え条件付きストア命令に関しては
SWPFを常に生成する。

キャッシュライン
マスクOFF
マスクON
 条件付きストア命令の動き
ストライドアクセスになる
のでHWPFが動作しない

配列a
10

Copyright 2013 FUJITSU LIMITEDHWFPに比べてSWPFを利用する方が性能が良い例
 オリジナルプログラムの説明 連続アクセスだが途中でアクセスが飛ぶ場合（配列aa）
オリジナル
do k=1,zz
do j=1,yytemp(1,j,k) = aa(1,j-1,js,k-1)
temp(2,j,k) = aa(2,j-1,js,k-1)
temp(3,j,k) = aa(3,j-1,js,k-1)
temp(4,j,k) = aa(4,j-1,js,k-1)
temp(5,j,k) = aa(5,j-1,js,k-1)
temp(6,j,k) = aa(6,j-1,js,k-1)
temp(7,j,k) = aa(7,j-1,js,k-1)
temp(8,j,k) = aa(8,j-1,js,k-1)
enddo
enddo

■宣言
real(4)::temp(1:8,1:102,1:102)
real(4)::aa(1:8,0:101,0:101,0:101)
integer(4):: js ←値は１

 配列aa のメモリのアクセス(1,0,1,0)(2,0,1,0)(3,0,1,0)(4,0,1,0)(5,0,1,0)(6,0,1,0)

連続アクセス(816要素)（k=1,j=1～101）

・・・(8,101,1,0) (1,0,2,0)・・・(1,0,1,1)(2,0,1,1)・・・

10404要素離れたアクセス
11

Copyright 2013 FUJITSU LIMITEDSWPFを利用する方が性能が良い例のPA情報
 PA情報（HWPF利用）

Cache
L1I ミス率(/有効総命令数)

L1D ミス率(/ロード・ストア数)

0.03%

3.32%

SAMPLEL2 ミス率(/ロード・ストア数)
SAMPLE

L2ミス率とL2ミスdm率が
高い

[秒]

0.010

4.15%

L2 ミス数L1D ミス数

ロード・ストア数
5.37E+06
L2 ミス dm 率(/L2 ミス数)

2.23E+05

L2 ミス pf 率(/L2 ミス数)

20.65%

4命令コミット
整数レジスタ書き込み制約
uOPコミット
分岐命令待ち浮動小数点ロードキャッシュアクセス待ち
ストア待ち

1.787E+05

L1D ミス dm率(/L1D ミス数)

L1D ミス hwpf
率(/L1D ミス数)

L1D ミス swpf 率(/L1D ミス数)

13.71%

86.27%

0.02%

メモリスループット(GB/sec)

L2 スループット(GB/sec)

79.35%

4.06

2/3命令コミット
1命令コミット
バリア同期待ち浮動小数点演算待ち
整数ロードキャッシュアクセス待ち
浮動小数点ロードメモリア クセス待ち

μDTLB ミス率(/ロード・ストア
数)

2.63

0.00039%mDTLB ミス率(/ロード・ストア数)
0.00000%

浮動小数点レジスタ書き込み制約
その他の待ち命令フェッチ待ち
整数演算待ちI/Oアクセス待ち
整数ロードメモリアクセス 待ち

0.009
0.008
0.007

浮動小数点ロードキャッ
シュアクセス待ち

0.006
0.005
0.004

連続アクセスの場合のL2ミス率の理論値 0.003
単精度：3.125% 0.002
倍精度：6.250%

浮動小数点ロードメモ
リアクセス待ち

0.001

0.000
単精度：32回に1度ミスをする
倍精度：16回に1度ミスをする

SAMPLE
12

Copyright 2013 FUJITSU LIMITEDSWPFを利用する方が性能が良い例のSWPFプログラム
 L2ミス率・L2ミスデマンド率を改善するため、SWPFを生成
オリジナル(HWPF)
do k=1,zz
do j=1,yytemp(1,j,k) = aa(1,j-1,js,k-1)
temp(2,j,k) = aa(2,j-1,js,k-1)
temp(3,j,k) = aa(3,j-1,js,k-1)
temp(4,j,k) = aa(4,j-1,js,k-1)
temp(5,j,k) = aa(5,j-1,js,k-1)
temp(6,j,k) = aa(6,j-1,js,k-1)
temp(7,j,k) = aa(7,j-1,js,k-1)
temp(8,j,k) = aa(8,j-1,js,k-1)
enddo
enddo

SWPFプログラム
do k=1,zz
do j=1,yy!OCL PREFETCH_READ(aa(1,j-1,js,k-1+2),level=2,strong=1)!OCL PREFETCH_READ(aa(1,j-1,js,k-1+1),level=1,strong=1)
temp(1,j,k) = aa(1,j-1,js,k-1)
temp(2,j,k) = aa(2,j-1,js,k-1)
temp(3,j,k) = aa(3,j-1,js,k-1)
temp(4,j,k) = aa(4,j-1,js,k-1)
temp(5,j,k) = aa(5,j-1,js,k-1)
temp(6,j,k) = aa(6,j-1,js,k-1)
temp(7,j,k) = aa(7,j-1,js,k-1)
temp(8,j,k) = aa(8,j-1,js,k-1)
enddo
enddo

1. 余計なL2キャッシュミスの削減(L2ミス率)⇒ SWPFを出すことにより、L1,2ミスをしなくなり、
HWPFの動作を止める
2. メモリアクセスレイテンシを隠蔽する(L2ミスデマンド率)⇒外側ループ(4次元目)に対するプリフェッチ
13

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFのアクセスの違い
 HWPFは、アクセスしない領域にアクセスしている。
 長いレンジで連続にアクセスするため、ハードウェアプリフェッチにより、プログラ
ム上アクセスしないaa(1,0,2,0)～aa(8,8,2,0)をアクセス(2Kbyte)している。
<配列aa>(1,0,1,0)(2,0,1,0)(3,0,1,0)(4,0,1,0)・・・(8,101,1,0)(1,0,2,0)(2,0,2,0)(3,0,2,0)(4,0,2,0)・・・(8,8,2,0)・・・(1,0,1,1)(2,0,1,1)(3,0,1,1)(4,0,1,1)

・・・(8,101,1,1)(1,0,2,1)(2,0,2,1)(3,0,2,1)(4,0,2,1)

・・・(8,8,2,1)・・・(1,0,1,2)(2,0,1,2)(3,0,1,2)(4,0,1,2)

・・・(8,101,1,2)(1,0,2,2)(2,0,2,2)(3,0,2,2)(4,0,2,2)・・・(8,8,2,2)・・・・・・ (8,101,1,101)(1,0,2,101) (2,0,2,101) (3,0,2,101) (4,0,2,101) ・・・ (8,8,2,101)

・・・

：

：

(1,0,1,101) (2,0,1,101) (3,0,1,101) (4,0,1,101)

 SWPFを指定することで、無駄なアクセスをしない。
 !OCL PREFETCH_READ(aa(1,j-1,js,k-1+2),level=2,strong=1)

HWPF

アクセスする !OCL PREFETCH_READ(aa(1,j-1,js,k-1+1),level=1,strong=1)

SWPF

アクセスしない<配列aa>(1,0,1,0)(2,0,1,0)(3,0,1,0)(4,0,1,0)・・・(8,101,1,0)(1,0,2,0)(2,0,2,0)(3,0,2,0)(4,0,2,0)・・・(8,8,2,0)・・・(1,0,1,1)(2,0,1,1)(3,0,1,1)(4,0,1,1)

・・・(8,101,1,1)(1,0,2,1)(2,0,2,1)(3,0,2,1)(4,0,2,1)

・・・(8,8,2,1)・・・(1,0,1,2)(2,0,1,2)(3,0,1,2)(4,0,1,2)

・・・(8,101,1,2)(1,0,2,2)(2,0,2,2)(3,0,2,2)(4,0,2,2)・・・(8,8,2,2)・・・・・・ (8,101,1,101)(1,0,2,101) (2,0,2,101) (3,0,2,101) (4,0,2,101) ・・・ (8,8,2,101)

・・・

：

：

(1,0,1,101) (2,0,1,101) (3,0,1,101) (4,0,1,101)

14

Copyright 2013 FUJITSU LIMITEDHWPFとSWPFのPA情報
 PA情報L2ミス率は、
ほぼ理論値

Cache

SAMPLESAMPLE tune

L1D ミス率(/ロード・ストア数)

0.03%
0.01%

3.32%
3.20%

L2 ミス率(/ロード・ストア数)
SAMPLESAMPLE tune

L2ミスdm率が減少

L1I ミス率(/有効総命令数)

0.010

4.15%
3.21%

ロード・ストア数
5.37E+06
5.34E+06
L2 ミス dm 率(/L2 ミス数)

L2 ミス数
2.23E+05
1.71E+05

20.65%
9.87%

0.007

L1D ミス dm率(/L1D ミス数)

L1D ミス hwpf
率(/L1D ミス数)

L1D ミス swpf 率(/L1D ミス数)

13.71%
1.30%

86.27%
49.01%

0.02%
49.69%

メモリスループット(GB/sec)

L2 スループット(GB/sec)

4.06
3.85

2.63
3.21

1.79E+05
1.71E+05
L2 ミス pf 率(/L2 ミス数)
79.35%
90.13%μDTLB ミス率(/ロード・ストア
数)
0.00039%0.00056%mDTLB ミス率(/ロード・ストア数)
0.00000%
0.00002%

[秒]

HWPF

0.009
0.008

L1D ミス数

1命令コミット

メモリースループットが多少減少しているが、ほぼ上限値。

28%向上

SWPF

浮動小数点ロードキャッ
シュアクセス待ち

0.006
1命令コミット

0.005
0.004

連続アクセスの場合の 0.003
L2ミス率の理論値
0.002
単精度：3.125%
倍精度：6.250%
0.001
0.000
単精度：32回に1度ミスをする

倍精度：16回に1度ミスをする

浮動小数点ロードメモリ
アクセス待ち浮動小数点ロードキャッ
シュアクセス待ち

ストア待ち

SAMPLE
15

SAMPLE tune
Copyright 2013 FUJITSU LIMITEDまとめ 連続アクセスケースにおいて、推奨オプションで行っている
HWPFとSWPFの協調はうまくいっている。
⇒基本的には、コンパイラにお任せあれ。
 ただし、HWPFのデメリット（ウィークプリフェッチであること、距離が一定であること）の影響を受けている場合(*1)は以下のオプションにより性能向上する可能性がある。
 -Kprefetch_sequential=soft,prefetch_strong,prefetch_line=N (N=2,3,4)(*1)：L1ミスdm率が10%が目安

16

Copyright 2013 FUJITSU LIMITEDSWPF利用時のトラブルシューティング
 翻訳時オプションと最適化指示子（*）によるプリフェッチの違いは？
翻訳時オプションの場合は、コンパイラが解析してプリフェッチ命令を出すため、複雑等の理由で、プリフェッチ命令が出ない場合がある。
最適化指示子の場合は、必ずプリフェッチ命令が出る。
* : !ocl prefetch read と!ocl prefetch write なぜ、最適化指示子によるプリフェッチを使うのか？
かなりアバウトですが、以下の場合に使います。
L2ミスデマンド率が高い。
翻訳時オプションを指定して、SWPFを試す。
L2ミスデマンド率が改善しない。

ほとんどの場合はここで解決する。

プリフェッチ命令が出ない。
プリフェッチ命令は出るが、妥当でない。

最適化指示子によるプリフェッチを試す。
P11-P15のパターンくらい。
17

Copyright 2013 FUJITSU LIMITED

最適化指示子プリフェッチ指定の例(連続アクセス) 連続アクセス（HWPFと同じプリフェッチ命令出力の例）
DO I = 1,N!OCL PREFETCH_READ(A(I+32))
T = T + A(I)
Aは倍精度
ENDDO
A(1)

A(2)

A(3)

A(4)

A(5)

A(6)

A(7)

A(8)

A(9)

A(10) A(11) A(12) A(13) A(14) A(15) A(16)A(17) A(18) A(19) A(20) A(21) A(22) A(23) A(24) A(25) A(26) A(27) A(28) A(29) A(30) A(31) A(32)
A(33) A(34) A(35) A(36) A(37) A(38) A(39) A(40) A(41) A(42) A(43) A(44) A(45) A(46) A(47) A(48)

I=1

I=2

I=3

I=4

・・・

I=4(A(4)) を処理している時に、A(36)に対するプリフェッチ命令が実行される。

A(49) A(50) A(51) A(52) A(53) A(54) A(55) A(56) A(57) A(58) A(59) A(60) A(61) A(62) A(63) A(64)： 利用時の注意：プリフェッチの機能上(P2参照)、最適化指示子プリ
フェッチ指定を利用する場合は、ループ長やループ内の処理等が違いますので、試行錯誤(*)して利用して下さい。
* : 実行時間が速くなっていること。または、デマンドミスが減っていることを判断材料として下さい。
18

Copyright 2013 FUJITSU LIMITED

最適化指示子プリフェッチ指定の例(リストアクセス) リストアクセス（A(INDX(I+16))に対してプリフェッチ命令を生成する）
DO I = 1,N!OCL PREFETCH_READ(A(INDX(I+16)))
T = T + A(INDX(I))
Aは倍精度
ENDDO
A(1)

A(2)

A(3)

A(4)

A(5)

A(6)

A(7)

I
I+16
INDX(I+16)

A(8)

A(9)

I=2

1 2 3 4 5 6 7 8 ・・
17 18 19 20 21 22 23 24 ・・
10 3 41 55 28 19 22 13 ・・A(10) A(11) A(12) A(13) A(14) A(15) A(16)

I=1

I=8

A(17) A(18) A(19) A(20) A(21) A(22) A(23) A(24) A(25) A(26) A(27) A(28) A(29) A(30) A(31) A(32)

I=6

I=5

I=7

A(33) A(34) A(35) A(36) A(37) A(38) A(39) A(40) A(41) A(42) A(43) A(44) A(45) A(46) A(47) A(48)

I=3
A(49) A(50) A(51) A(52) A(53) A(54) A(55) A(56) A(57) A(58) A(59) A(60) A(61) A(62) A(63) A(64)

I=4

I=4 を処理している時に、A(55)に対してプリフェッチ命令が実行される。

19

Copyright 2013 FUJITSU LIMITED参考：プリフェッチ系オプション(1/2)
【Fortran/C/C++共通】[default 欄] ＊ デフォルト時のオプション－ 該当なしdefault

オプション形式‑‑Kprefetch̲cache̲level=N N=1,2,all

どのキャッシュレベルにデータをプリフェッチするかを指示します。

‑Kprefetch̲conditional

IF構文やCASE構文に含まれるブロックの中で使用される配列データに対して
prefetch命令を生成するかどうかを指示します。

*‑Kprefetch̲noconditional‑Kprefetch̲indirect

*

*
‑

機能概要

‑Kprefetch̲noindirect

ループ内で使用される間接的にアクセス（リストアクセス）される配列データに対して、prefetch命令を使用したオブジェクトを生成するかどうかを指示します。

‑Kprefetch̲infer

プリフェッチする距離が不明な場合でも連続アクセスのprefetch命令を生成するかどうかを指示します。

‑Kprefetch̲noinfer‑Kprefetch̲iteration=N
1≦N≦10000‑Kprefetch̲iteration̲L2=N‑

1≦N≦10000‑

1≦N≦100‑1≦N≦100‑Kprefetch̲line=N‑Kprefetch̲line̲L2=N

prefetch命令を生成する際、ループのN回転後に参照または定義されるデータを対象とすることを指示します。ただし、本機能では一次キャッシュにプリフ
ェッチするprefetch命令を対象とします。
prefetch命令を生成する際、ループのN回転後に参照または定義されるデータを対象とすることを指示します。ただし、本機能では二次キャッシュにのみプ
リフェッチするprefetch命令を対象とします。
prefetch命令を生成する際、Nキャッシュライン先に該当するデータをプリフェッチの対象とすることを指示します。ただし、本機能では一次キャッシュにプリフェッチするprefetch命令を対象とします。
prefetch命令を生成する際、Nキャッシュライン先に該当するデータをプリフェッチの対象とすることを指示します。ただし、本機能では二次キャッシュにプリフェッチするprefetch命令を対象とします。

20

Copyright 2013 FUJITSU LIMITED

参考：プリフェッチ系オプション(2/2)
【Fortran/C/C++共通】
default*[default 欄] ＊ デフォルト時のオプション

オプション形式‑Kprefetch̲sequential[=kind]
kind={auto￨soft}－ 該当なし機能概要
ループ内で使用される連続的にアクセスされる配列データに対して、prefetch命令を使用したオブジェクトを生成するかどうかを指示します。
kind=auto
ループ内で使用される連続的にアクセスされる配列データに対して、ハードウェア
プリフェッチを利用するか、prefetch命令を出力するかをコンパイラが自動的に選択します。
kind=soft
ループ内で使用される連続的にアクセスされる配列データに対して、ハードウェア
プリフェッチを利用せずに、 prefetch命令を出力します。

‑Kprefetch̲ nosequential‑Kprefetch̲ stride

*
*
*
‑

‑Kprefetch̲ nostride‑Kprefetch̲strong‑Kprefetch̲nostrong‑Kprefetch̲strong̲L2‑Kprefetch̲nostrong̲L2‑Knoprefetch

ループ内で使用されるキャッシュのラインサイズよりも大きなストライドでアクセスされる配列データに対して、prefetch命令を使用したオブジェクトを生成するかどうかを指示します。
一次キャッシュに対するprefetch命令を生成する際、strong prefetch命令を生成するかどうかを指示します。
二次キャッシュに対するprefetch命令を生成する際、strong prefetch命令を生成するかどうかを指示します。
prefetch命令を使用したオブジェクトを生成しないことを指示します。

21

Copyright 2013 FUJITSU LIMITED参考：プリフェッチ系最適化指示子
指定可能な最適化制御行最適化指示子

意味
翻訳
単位

プログラ
ム単位

ループ
単位

文単
位

配列代入
文単位

F:PREFETCH
C:prefetch

コンパイラの自動prefetch機能を有効にします。

○

○

○

×

×

F:NOPREFETCH
C:noprefetch

コンパイラの自動prefetch機能を無効にします。

○

○

○

×

×

F:PREFETCH̲CACHE̲LEVEL(level)

キャッシュレベルlevelにデータをプリフェッチすることを指示します。
levelは1、2、または all です。

×

○

○

×

×

F:PREFETCH̲INFER

プリフェッチのためのアドレス計算を省略し、既存の情報から距離を推測してプリフェッチすることを指示しま
す。

×

○

○

×

×

F:PREFETCH̲NOINFER

プリフェッチのためのアドレス計算を省略し、既存の情報から距離を推測してプリフェッチすることを指示しません。

×

○

○

×

×

F:PREFETCH̲ITERATION(m)prefetch命令を生成する際、ループのm回転後に参照されるデータを対象とすることを指示します。
mは1～10000の10進数です。

×

○

○

×

×

F:PREFETCH̲ITERATION̲L2(m)prefetch命令を生成する際、ループのm回転後に参照または定義されるデータを対象とすることを指示します。ただし、本機能では2次キャッシュにのみプリフェッチする
prefetch命令を対象とします。
mは1～10000の10進数です。

×

○

○

×

×

F:PREFETCH̲READ(name[,level={1￨2}][,strong={0￨1}])

参照されているデータに対してprefetch命令を生成する
ことを指示します。
nameは配列要素名、levelはプリフェッチを行うキャッシ
ュレベルです。

×

×

×

○

×

F:PREFETCH̲WRITE(name[,level={1￨2}][,strong={0￨1}])

定義されているデータに対してprefetch命令を生成する
ことを指示します。
nameは配列要素名、levelはプリフェッチを行うキャッシ
ュレベルです。

×

×

×

○

×

22

Copyright 2013 FUJITSU LIMITED

参考：OCL PREFETCH_READの説明
 最適化制御行(PREFETCH_READ)の説明(使用手引書より抜粋)!OCL PREFETCH_READ(name[,level={1|2}][,strong={0|1}])
参照されているデータに対してprefetch 命令を生成することを指示します。
nameにはプログラム中で参照されているデータ（配列要素）を指定します。
添字には、式も指定可能です。
level={1|2}を指定することにより、どのキャッシュレベルにデータをプリフェッチするかを指示します。デフォルトは、level=1です。
strong={0|1}を指定することにより、strong prefetchとするかどうかを指示します。
strong=0が指定された場合はstrong prefetchとせず、strong=1が指定された場合はstrong prefetchとします。

23

Copyright 2013 FUJITSU LIMITEDサイエンティフィック・システム研究会
マルチコアクラスタ性能WG資料

４．２
キャッシュミス数／ミス率のデータの見方や使い方について
富士通株式会社
内藤俊也
Copyright 2013 FUJITSU LIMITED

目次
キャッシュ／メモリとは

キャッシュのヒット／ミスとは
PA情報に出てくるミス数／ミス率とは
ミス率の理論値
データの使い方

1

Copyright 2013 FUJITSU LIMITEDキャッシュ／メモリとは
 キャッシュとは、CPUとメモリの間にある記憶装置です。
演算器から距離が近いほどアクセス時間が短いです。
メモリへのアクセスが一番時間が掛かります。
CPU
演算器
近
小容量

1次キャッシュ演算器からの距離

中容量

2次キャッシュ
遠
メモリ

大容量

2

Copyright 2013 FUJITSU LIMITED

キャッシュのヒット／ミスとは キャッシュにデータがある場合

 キャッシュにデータが無い場合

1次キャッシュにデータがあるため、1次キャッシュからデータを読むことが出来ます。演算器から近いので、データを短時間で読み込むことが出来ます。

1次2次キャッシュにデータが無いため、メモリにデータを探しに行きます。メモリは演算器から遠いので、アクセスに時間が掛かります。

CPU

CPU
演算器

ヒット

A

演算器
ミス（L1$dmミス）
1次キャッシュにデータが無いため、
2次キャッシュを検索

1次キャッシュ

2次キャッシュミス（L2$dmミス）
2次キャッシュにデータが無いため、メモリを検索

メモリ

ヒット
3

A

A

1次キャッシュA

2次キャッシュメモリ
Copyright 2013 FUJITSU LIMITEDPA情報のミス数とミス率（１次データキャッシュ） PA情報（ １次データキャッシュ） L1Dミス数
１次データキャッシュミス数です。
ミスには以下の３パターンあります。
• ロード・ストア命令（3ページの例）• ハードウェアプリフェッチ• ソフトウェアプリフェッチ命令

 L1Dミス率 (/ロード・ストア数)
ロード・ストア数に対する１次データキャッシュミスの割合(％)• L1Dミスdm率 (/L1Dミス数)
１次データキャッシュミス数に対する、ロード・ストア命令による１次データキャッシュミ
スの割合(％)• L1Dミスhwpf率 (/L1Dミス数)
１次データキャッシュミス数に対するハードウェアプリフェッチによる１次データキャッ
シュミスの割合(％)• L1Dミスswpf率 (/L1Dミス数)
１次データキャッシュミス数に対するソフトウェアプリフェッチ命令による１次データキャッシュミスの割合(％)
4

Copyright 2013 FUJITSU LIMITED

PA情報のミス数とミス率（２次キャッシュ） PA情報（２次キャッシュ） L2ミス数
２次キャッシュミス数です。
ミスには以下の２パターンあります。
• ロード・ストア命令（3ページの例）• プリフェッチ

 L2ミス率 (/ロード・ストア数)
ロード・ストア数に対する２次キャッシュミスの割合(％)• L2ミスdm率 (/L2ミス数)
２次キャッシュミス数に対するロード・ストア命令による２次キャッシュミスの割合(％)• L2ミスpf率 (/L2ミス数)
２次キャッシュミス数に対するプリフェッチによる２次キャッシュミスの割合(％)
２次キャッシュの場合は、ハードプリフェッチとソフトウェアプリフェッチ命令の区別は出来ません。

5

Copyright 2013 FUJITSU LIMITED

連続アクセスの場合のミス率の理論値
 連続アクセスの場合の１次データキャッシュのミス率の理論値
 単精度：3.125%(32回に1度ミスをする) 倍精度：6.250%(16回に1度ミスをする) 連続アクセスの場合の２次キャッシュのミス率の理論値(１次データキャッシュと同じ)
 単精度：3.125%(32回に1度ミスをする) 倍精度：6.250%(16回に1度ミスをする) １次データキャッシュと２次キャッシュ共に、１ラインは１２８バイトです。
ミス 単精度の場合の例
A(1)

A(2)

A(3)

A(4)

A(5)

A(6)

A(7)

A(8)

A(9)

ヒット

A(10) A(11) A(12) A(13) A(14)

・・・

A(32)

A(33) A(34) A(35) A(36) A(37) A(38) A(39) A(40) A(41) A(42) A(43) A(44) A(45) A(46)

・・・

A(64)

 倍精度の場合の例
A(1)

A(2)

A(3)

A(4)

A(5)

A(6)

A(7)

A(8)

A(9)

A(10) A(11) A(12) A(13) A(14) A(15) A(16)A(17) A(18) A(19) A(20) A(21) A(22) A(23) A(24) A(25) A(26) A(27) A(28) A(29) A(30) A(31) A(32)6

Copyright 2013 FUJITSU LIMITED

キャッシュミス数/ミス率のデータの使い方
 PA情報のミス数とミス率のデータの使い方は、チューニングチュー
トリアルを参考にして下さい。

7

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

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

富士通株式会社
千葉 修一
Copyright 2013 FUJITSU LIMITED【 背景 】
■ 課題
■ コーディングスタイルとFMA命令化※1の関係性■ FMA命令を効率的に出力する手法※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でループ分割が可能

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)*if5d229vvl(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)*dz2i245
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)*dv2i248
flow=-(cc1*(flz+flv)-cc2*(flz2+flv2))249
df(l,k,j,i)=flow
250 enddo
251 enddo*2「京」は、理化学研究所が2010年7月に決定した「次世代スーパーコンピュータ」の愛称です。
1

Copyright 2013 FUJITSU LIMITED

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

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

FMA:Multiply&Sub

unroll

FMA数/unroll(scalar換算)

nosimdsimd※1

nosimdsimd※1

4

8

0

12

0

5

-Kfast,noswp

2

4

0

6

0

5

京

-Kfast

8※2

0

8

0

12

5

京

-Kfast,nosimd

6

18

0

12

0

5

京

-Kfast,noswp

4※2

0

4

0

6

5

-Kfast,nosimd,noswp

2

6

0

4

0

5

FX1 -Kfast
○ FX1

○ 京

※1 京は、2 wide-simdであるため、SIMD命令は２命令として計上※2 SIMD化で展開する２展開を含む
2

Copyright 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)
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
3

Copyright 2013 FUJITSU LIMITED

【 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

（＊）
（－）

（－）

f(l,k,j,i)f(l,k,j,i)vzl(l)

（＊）
dvi
（－）
cc1系
（＊）

（＋）

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

（＊）

dvi

vzl(l)
（＋）

（＋）

②
dzi

（＊）

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

①～⑤

④

（－）

③ （＊）
（＋）

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

⑤
（＊）

（＊）
vvr(l)

vvl(l)

vvl(l)（＋）
vvr(l)
f(l,k,j,i) f(l-1,k,j,i)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)■ データストアを起点に演算ツリーを構築し、M&Aを探索

cc2系
cc1系

命令数= add=4、sub=2、mult=7、madd=3、msub=2 ※共通式の除去最適化を適用済み■ 大きな演算ツリーごとに２か所、ストア部分で１か所、計５か所をFMA化■ コンパイラは演算ツリーにより最適化を適用するため、FMA命令化の適用条件は、コーディング

スタイルに依存しない■ 現状、ＦＭＡ化を判断できるメッセージは提供されていないため、アセンブラコードから計上する必要がある5

Copyright 2013 FUJITSU LIMITED

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

FMA命令化指示あり

FMA命令化指示なし

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

コンパイル
オプション

実行時間
(sec)

Fピーク比

MFLOPS

MIPS

F演算数

1命令コミット

FMA命令化
指示なし

0.12

34.60%

5535

5140

6.53E+08

1.68E-02

4.22E-02

4.41E-02

FMA命令化
指示あり

0.10

38.82%

6211

5151

6.51E+08

1.60E-02

2.93E-02

4.41E-02

6

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

Copyright 2013 FUJITSU LIMITED

【 まとめ 】■ コーディングスタイルとFMA命令化の関係性 コーディングスタイルに依存しない■ FMA命令を効率的に出力する手法

 コンパイラは、コード列を演算ツリーに置き換えて最適化を適用するため、利用者が意識する必要はない
 コンパイラがFMA命令の対象を判断するため、利用者が操作することができない■ コンパイラへの課題抽出 利用者がFMA命令化されたコード列を判断できないため、
コンパイラで以下の機能を検討する－メッセージの出力－リスティング情報の出力
7

Copyright 2013 FUJITSU LIMITED