目次

2. 性能評価サブWG報告[添付]

ＰＡイベント情報活用チュートリアル-サイクルアカウンティング ＦＸ１編-

富士通株式会社

 ＰＡイベント情報概略
 代表的なＰＡイベント情報
 演算コミット数
 メモリアクセス待ち 浮動少数点演算待ち
 キャッシュアクセス待ち チューニング事例
 ＰＡイベント情報採取ツール

サイクルアカウンティングとは性能ボトルネック要因分析の手法である。 SPARC64VIIでは豊富なPAイベント情報を備えており、アプリケーションプログラム実行時のCPU動作状態の情報が取得できる。あるアプリケーションプログ
ラムを実行するためにかかった総時間（CPUサイクル数）をCPUの動作状態で分類(*)し、CPU内のどの部分にボトルネックがあるかを把握することで、詳細な性能分析やチューニングを行うことができる。

青木正樹(*)命令実行中、メモリアクセス待ち、演算完了待ちである、など

予告：次世代スパコン向けにも＋α充実させていきます。目標2010年末
1

ＰＡイベント情報概略
命令コミット数

実行時間制約要因4

最大4コミット

3/2

整数レジ
書込み制約

1

その他コミット

メモリアクセス待ちキャッシュアクセス待ち

FX1 実行時間(実測)0

浮動小数点演算待ち

ｽﾄｱ待ち
命令ﾌｪｯﾁ待ち
その他待ち

最大４コミット

完了命令数が４である時間

整数レジスタ書き込み
制約

整数レジスタを２個更新しているため、４命令完了できなかった時間、命令完了数は２もしくは３

その他コミット

整数レジスタ書き込み制約を伴わない、完了命令数が１，２，３のいずれかである時間

メモリアクセス待ち

主記憶からのデータ待ちのため命令完了数が０である時間

キャッシュアクセス待ちキャッシュからのデータ待ちのため命令完了数が０である時間

浮動小数点演算待ち

実行中の命令の中で一番古い命令が、浮動小数点の演算実行中で、命令完了数が０である時間

ストア待ち

ストアポートフル(*1)要因でCSE(*2)が空となっている時間

命令フェッチ待ち(*3)

ストアポートフル要因以外でCSEが空となっている時間

その他待ち

メモリアクセス待ち、キャッシュアクセス待ち、浮動小数点演算待ち、ス
トア待ち、命令フェッチ待ち以外の要因で、命令完了数が０である時間

代表的なＰＡイベント情報
代表的なＰＡイベント情報
ーどのようなコード？
ーどのようなコード？ どのような情報？－
どのような情報？－(*1) ストアポートフル
ストアーポートとはストアデータを格納するキューです。SPARC64TM VIIIfxはストアポートが満杯となった時点でストアポートに空きができるまで、以降の命令デコードを停止します。ストアポートフルの典型的なトリガはストア命令のデータキャッシュミスです。
(*2) CSE（コミットスタックエントリ）
CSEとは実行中の（発行されてまだ完了していない）命令の情報を保持するためのバッファです。
(*3) 命令フェッチ待ち
典型的なケースは以下の２つです。
- 命令キャッシュミスによりCPU内で実行すべき命令を供給できない- スレッド並列実行において、ソフトから他コアとの同期を指示され同期成立を待っている23

代表的なＰＡ情報：演算コミット数

代表的なＰＡ情報：メモリアクセス待ちプログラム例：行列積
A=MATMUL(B,C)

プログラム例：STREAM COPY
DO I=1,L2$に乗らない大きさ
A(I)=B(I)
ENDDO

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

時間 (sec)
整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

ストア待ち

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間 (sec)

0 Commit

時間(sec)2.5E-01

1 Commit

2.0E-01

整数ロードメモリアクセス待ち

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

ストア待ち

I/Oアクセス待ち

整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)
8.0E-01

1.5E-01

2-3 Commit

1.0E-01

7.0E-01
6.0E-01

4 Commit

5.0E-02

5.0E-014.0E-01
3.0E-01

0.0E+00
2.0E-01

Process 0

1.0E-01
0.0E+00

１マシンサイクルでn命令実行したことを示す。

-1.0E-01

０Commit部分は、何らかの要因で命令が動作していない時間。
※モノクロ印刷ではグラフの色識別が不鮮明です。SS研Webサイト「WG成果報告書」のPDFでカラー版をご覧ください。 以降同様。

Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

浮動小数点ロードメモリアクセス待ち、整数ロードメモリアクセス待ち、ス
トア待ち部分は、それぞれのメモリアクセス命令が引き起こすL2$ミス要因で他の命令が動作していない時間。

45

代表的なＰＡ情報：浮動少数点演算待ちプログラム例：除算
配列A,B,CはL1$上
DO I=1,M
A(I)=B(I)/C(I)
ENDDO

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

参考）ただしSPARC64Viiifxでの除算はプログラム例：除算
配列A,B,CはL1$上
DO I=1,M
A(I)=B(I)/C(I)
ENDDO

浮動小数点演算待ち

時間 (sec)
整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

Process 0 Thread 3

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間 (sec)

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)
8.0E-03

時間(sec)7.0E-03

6.0E-06

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ち(x)uOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

6.0E-035.0E-035.0E-06

4.0E-033.0E-03

FX1性能比約5倍向上
除算影響の待ちは無くなる

4.0E-06

2.0E-03
1.0E-033.0E-06

0.0E+00
Process 0
2.0E-06

浮動小数点演算待ち部分は、浮動小数点演算命令が要因で他の命令が動作していない時間。
除算はレイテンシの長い、かつ、パイプライン実行できないハード命令で実装されているため、浮動小数点演算待ちが発生。
6

1.0E-06

0.0E+00

FX1

SPARC64VIIIfx

7代表的なＰＡ情報：キャッシュアクセス待ちプログラム例
DO J=1,M
配列A,BはL2$上
DO I=1,N
A(I,J)=B(I,J)+1.0
ENDDO
ENDDO

チューニング事例
チューニング事例

時間 (sec)
整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)浮動小数点ロードキャッシュ
アクセス待ち整数ロードキャッシュアクセ
ス待ち時間(sec)2.5E-04

2.0E-04

1.5E-04

1.0E-04

5.0E-05

0.0E+00
Process 0

１次キャッシュ・スラッシング回避リストアクセスに対するプリフェッチ
キャッシュ・チューニング（多重ループ融合）スレッド並列のロードバランス不均等リストアクセスのチューニング（配列マージ）
メモリアクセスの局所化（タイリング）


浮動小数点ロードキャッシュアクセス待ち、整数ロードキャッシュアクセス待ちは、それぞれのメモリアクセス命令がキャッシュアクセスの待ち要因で他の命令が動作していない時間。
89

１次キャッシュ・スラッシング回避（前）SPARC６４ViiのL1D$キャッシュは、６４KB/2Wayです。

１次キャッシュ・スラッシング回避（後）パディング（内側にすき間を空ける）を行うことにより、キャッシュ競合を削減します。

配列の形状が２のべき乗になっていると、キャッシュ競合で性能低下する場合があります。
オリジナルソース

コンパイラ最適化のイメージ

時間 (sec)

REAL*8 A(1024, 1024, 4)
DO I=1,N
A(I,1,1)=A(I,1,2)+A(I,1,3)+A(I,1,4)
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間 (sec)

REAL*8 A(1025, 1024, 4)
DO I=1,N
A(I,1,1)=A(I,1,2)+A(I,1,3)+A(I,1,4)
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット（キャッシュライン）（メモリ上のデータ配置）
2.0E-02A(A(1, 1, 1)
2, 1, 1)
・・・
A(1024, 1024, 1)
A( 1, 1, 2)
A( 2, 1, 2)
・・・

1.0E-022.0E-02

1.5E-02
1.0E-02

A(1025, 1024, 1)
A( 1, 1, 2)
A( 2, 1, 2)
・・・

5.0E-03
0.0E+00
Process 0

5.0E-03
0.0E+00
Process 0

異なるキャッシュラインで競合回避

キャッシュ待ち時間
10

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)（メモリ上のデータ配置）
A( 1, 1, 1)
A( 2, 1, 1)
・・・
A(1024, 1024, 1)

1.5E-02

同じキャッシュラインへの競合

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)2.5E-02

時間(sec)2.5E-02（キャッシュライン）浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

キャッシュ待ち時間激減
11リストアクセスに対するプリフェッチ（前）リストアクセスに対するプリフェッチ（後）配列のリスト参照のようなインダイレクト（リスト）アクセスについては、-Kfastオプションでは、プリフェッチ命令を生成しません。

コンパイラオプション-Kprefetch_indirectもしくは最適化制御行による直接指示でリストアクセスについてもプリフェッチ命令を生成することができます。

オリジナルソース

コンパイラ最適化のイメージ

時間 (sec)

REAL*8 A(N),B(N),C(N)REAL*8 D(N),E(N),F(N)DO I=1,N

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)2.5E-01

配列D,E,Fに対してプリフェッチ命令を生成

時間 (sec)

REAL*8 A(N),B(N),C(N)REAL*8 D(N),E(N),F(N)DO I=1,N

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

2.0E-01

1.5E-01

A(D(I))=B(E(I))+SCALAR*C(F(I))
ENDDO

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)2.5E-01

配列A,B,C,D,E,Fに対してプリフェッチ命令を生成

2.0E-01

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

1.5E-01

A(D(I))=B(E(I))+SCALAR*C(F(I))
ENDDO

1.0E-01

1.0E-01

5.0E-02

5.0E-02

0.0E+00

0.0E+00
Process 0

Process 0

リストアクセスのメモリア
クセス待ち時間

プリフェッチにより待ち時間減少

1213

キャッシュ・チューニング：多重ループ融合（前）キャッシュ・チューニング：多重ループ融合（後）キャッシュのチューニングとは、時間的/空間的に近くをアクセスすることです。チューニ
ングの際は、メモリアクセスの状況を大域的に見てチューニングすることを薦めます。

LOOP-PEELINGを行い、２つの２重ループを融合することにより、キャッシュアクセ
スのチューニングを行った例です。

オリジナルソース

時間 (sec)

REAL*8 A(N,N),B(N,N),C(N,N)
DO J=1,N
DO I=1,N
A(I,J)=B(I,J)+C(I,J)
ENDDO
ENDDO
DO J=1,N-1
DO I=1,N
C(I,J)=A(I,J)+B(I,J)+1.0
ENDDO
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)7.0E-01
6.0E-01
5.0E-01
4.0E-01
3.0E-01
2.0E-01
1.0E-01
0.0E+00
Process 0

N=1000

時間 (sec)

チューニング後ソース
ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

REAL*8 A(N,N),B(N,N),C(N,N)
A(N,N)=B(N,N)+C(N,N)
DO J=1,N-1
DO I=1,N
A(I,J)=B(I,J)+C(I,J)
C(I,J)=A(I,J)+B(I,J)+1.0
ENDDO
ENDDO
J=N
DO I=1,N
A(I,J)=B(I,J)+C(I,J)
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)7.0E-01
6.0E-01
5.0E-01
4.0E-01
3.0E-01
2.0E-01
1.0E-01
0.0E+00
Process 0

配列のアクセス時間が全体の2/3
14浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

配列のアクセス時間が半減
15スレッド並列のロードバランス不均等（前）スレッド並列のロードバランス不均等（後）並列チューニングの観点から、解決しなければならない課題にロードバランスの均等化があります。スレッド並列の三角ループを外側ループで均等に割り付ける場合は、注意が必要です。

三角ループは、サイクリック割付を行うことにより、ロードバランスの均等化が可能となります。

オリジナルソース

チューニング後ソース

時間 (sec)

COMMON A,B,C,D
REAL*8 A(4097,4096),B(4097,4096),C(4097,4096)!$OMP PARALLEL DO
DO J=1,4096
DO I=J,4096
A(I,J)=B(I,J)+C(I,J)
三角ループ
ENDDO
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)
3.0E-022.0E-02

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

Process 0 Thread 1

Process 0 Thread 2

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間(sec)
3.0E-02
2.5E-02

三角ループ

2.0E-02

1.5E-02

各ｽﾚｯﾄﾞのバランス悪い！

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット!$OMP PARALLEL DO SCHEDULE(STATIC,1)
DO J=1,4096
DO I=J,4096
A(I,J)=B(I,J)+C(I,J)
ENDDO
ENDDO

2.5E-02

時間 (sec)

COMMON A,B,C,D
REAL*8 A(4097,4096),B(4097,4096),C(4097,4096)

1.5E-02

1.0E-02

1.0E-02ｊｊ
5.0E-03ｉ

5.0E-03ｉ

0.0E+00
Process 0 Thread 0

Process 0 Thread 1

Process 0 Thread 2

0.0E+00
Process 0 Thread 0Process 0 Thread 3

Process 0 Thread 3

バリア待ち時間均一。ただし、１刻みだと L1$のFalse sharing影響見える

バリア待ち時間
1617

リストアクセスのチューニング：配列マージ（前）リストアクセスのチューニング：配列マージ（後）リストアクセス時、リストの値が不連続＆遠い場合、キャッシュの使用効率が悪い場合があります。

複数の配列を１個にマージすることでデータアクセスが改善される可能性があります。
最適化制御行！ocl array_mergeも用意されています。
融合後イメージ

オリジナルソース

時間 (sec)

REAL*8 A(N),B(N),C(N)DO I=1,N
A(L(I))=B(L(I))+C(L(I))
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)1.2E-01A( 1)
A( 2)
・・・
B( 1)
B( 2)
・・・
C( 1)
C( 2)
・・・

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

時間 (sec)

REAL*8 ABC(3,N)
DO I=1,100ABC(1,L(I))=ABC(2,L(I))+ABC(3,L(I))
ENDDO

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

8.0E-02
6.0E-02
4.0E-022.0E-02

1.0E-01
8.0E-02
6.0E-02
4.0E-022.0E-02

連続アクセス

0.0E+00

ランダムアクセス

0.0E+00
Process 0⇒キャッシュの使用効率が良くない
18

ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)1.2E-01

ABC( 1, 1)
ABC( 2, 1)
ABC( 3, 1)
ABC( 1, 2)
ABC( 2, 2)ABC( 3, 2)
・・・

1.0E-01

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

Process 0⇒キャッシュ使用効率向上
19

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)メモリアクセスの局所化：タイリング（前）メモリアクセスを局所化するために,配列をM×Mサイズに分割します。これをタイル化といいます。(Mのサイズはアクセス状況/キャッシュサイズに依存します) 今回は、タイルサイズ４０での実測結果。

大きな配列の転置は、キャッシュの使用効率が良くありません。

時間 (sec)

オリジナルソース
整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

REAL*8 A(1000,1000),B(1000,1000)
DO I=1,N
DO J=1,N
A(I,J)=B(J,I)
ENDDO
ENDDO

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

時間 (sec)

チューニング後ソース
ストア待ち
整数演算待ちuOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)5.0E+00
4.5E+00
4.0E+00
3.5E+00
3.0E+00
2.5E+00
2.0E+00

配列Ｂは１０００要素飛びアクセス

メモリアクセスの局所化：タイリング（後）1.5E+00
1.0E+00
5.0E-01
0.0E+00
Process 0

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)

整数ロードメモリアクセス待ち
整数ロードキャッシュアクセス待ち
分岐命令待ち1命令コミット
4命令コミット

REAL*8 A(1000,1000),B(1000,1000)
M=40
DO II=1,N,M
DO JJ=1,N,M
DO I=II,MIN(II+M,N)
DO J=JJ=MIN(JJ+M,N)
A(I,J)=B(J,I)
ENDDO
ENDDO
ENDDO
ENDDO

ストア待ち整数演算待ち
uOPコミット
浮動小数点レジスタ書き込み制約

時間(sec)5.0E+00
4.5E+00
4.0E+00
3.5E+00
3.0E+00
2.5E+00
2.0E+00
1.5E+00
1.0E+00
5.0E-01
0.0E+00
Process 0

配列ＢはＭ要素飛びアクセス

20

浮動小数点ロードメモリアクセス待ち
浮動小数点ロードキャッシュアクセス待ち
命令フェッチ待ち
整数レジスタ書き込み制約

21

I/Oアクセス待ち
浮動小数点演算待ち
その他の待ち2/3命令コミット(その他)