サイエンティフィック・システム研究会
マルチコアクラスタ性能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