スライド 1

レジスタ間接分岐の高速化手法
情報理工学系研究科 電子情報学専攻 46424 豊島隆志
MTL 坂井・五島研究室
MTL
坂井・五島研究室
発表の流れ

背景
– 分岐予測
– アウト・オブ・オーダ実行


関連研究
提案手法
– レジスタ間接分岐ターゲット・フォワーディング


評価
まとめ
1
背景
MTL
坂井・五島研究室
概要
オブジェクト指向による大規模アプリケーションの増加
仮想関数の利用
レジスタ間接分岐の増加
1. 既存の履歴を利用した分岐予測では分岐先を予測できない
2. 分岐前後でアウト・オブ・オーダ実行では隠蔽できない遅延が発生
性能の低下
2
背景:分岐予測
MTL
坂井・五島研究室
既存の分岐予測手法


分岐方向予測 … 問題なし
分岐ターゲット予測 … 問題あり
– 分岐命令後の命令フェッチアドレスを予測する
– BTB (Branch Target Buffer) の利用


過去の分岐ターゲットを記録したバッファ
通常は分岐命令のPCをキーにしてバッファを検索
– 各分岐命令に対して高々1エントリ
– 分岐ターゲットが複数存在するレジスタ間接分岐には未対応
– cf.) 間接分岐予測器(Pentium M,他)

PCと分岐履歴の組み合わせを用いてBTBを検索
– 各分岐に対して複数のエントリを保持できる
– 分岐ターゲットが分岐履歴に依存している必要がある
3
背景:分岐予測
MTL
坂井・五島研究室
仮想関数と分岐履歴

一般的に分岐ターゲットは分岐履歴に依らない
class Drawable {
virtual void Draw(void) = NULL;
…
};
class Circle : public Drawable {
…
};
class Square : public Drawable {
…
};
void DrawObjects(void) {
Drawable *drawable = bottomObject;
for (; NULL != drawable; drawable = drawable->Next()) {
drawable->Draw();
}
};
– drawableのクラスのみが実際の分岐ターゲットに影響する
– 既存の分岐予測は当たらない
4
背景:分岐予測
MTL
坂井・五島研究室
パイプライン処理
cycle
i0
Fetch
i1
Decode
Execute
Memory
Write Back
Fetch
Decode
Execute
Memory
Write Back
Fetch
Decode
Execute
Memory
Fetch
Decode
Execute
Fetch
Decode
i2
i3
i4
5
背景:分岐予測
MTL
坂井・五島研究室
パイプライン処理と分岐予測
Branch check &
Branch target prediction
i0
Fetch
i1
cycle
Validatio
n
branc
h
Decode
Execute
Memory
Write Back
Fetch
Decode
Execute
Memory
Write Back
Fetch
Decode
Execute
Memory
Fetch
Decode
Execute
Fetch
Decode
i2
i3
i4
6
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
仮想関数の呼び出し手順
1.
2.
3.
Load
Load
Call
$2 = [$1 + 0]
$3 = [$2 + 0]
$3
Circle
Virtual Function Table
(this)
vtable ptr
var foo
var bar
・
・
・
void (*Draw(void))
・
・
・
void
Circle::Draw(void)
{
…
…
…
}
7
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
アウト・オブ・オーダ実行による遅延の隠蔽

パイプラインを複数用意して実行可能な命令から並列実行
– 依存のない,もしくは解消した命令
– 必要とするハードウェアが割り当て可能な命令
Load $1=[$2]
F
N
D
S
I
R
A
1
W
Alu $3=$1+$3
F
N
D
S
S
S
I
R
X
W
Alu $5=$4+$5
F
N
D
S
I
R
X
W
Load $1=[$3]
F
N
D
S
S
I
R
A
1
W
F
N
D
S
S
S
I
R
X
Alu $3=$1+$3
F:Fetch
N:Rename
D:Dispatch
S:Sched.
I:Issue
R:Reg.Read
X:Exec.
A:Addr.Calc.
1:L1 Cache
W:Write Back
W
・
・
・
– 依存による遅延に対して,耐性がある
8
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
分岐予測ミスからの復帰

分岐予測ミス後,正しい命令のフェッチが再開されるのは…
– 分岐ターゲットが確定する(分岐が実行される)タイミングに依存
– つまり,分岐命令はフェッチ後,可能な限り即座に発行・実行したい
F
Branch
F
N
Instructions
in
The Predicted Function
F
F:Fetch
S:Sched.
X:Exec.
D
S
I
R
X
・
・
・
Correct Next Instruction
F
N:Rename
D:Dispatch
I:Issue
R:Reg.Read
A:Addr.Calc. 1:L1 Cache
9
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
仮想関数呼び出しにおける分岐命令発行の遅延
F:Fetch
S:Sched.
X:Exec.
1. Load $2 = [$1 + 0]
2. Load $3 = [$2 + 0]
3. Call $3
N:Rename
D:Dispatch
I:Issue
R:Reg.Read
A:Addr.Calc. 1:L1 Cache
F
1st load
F
N
D
S
I
R
A
1
2nd load
F
N
D
S
S
I
R
A
1
F
N
D
S
S
S
I
R
Branch (Call)
Instructions F
in
The Predicted Function
X
・
・
・
Correct Next Instruction
F
10
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
遅延に対する対策

遅延を無くす事はできない
– 先ほどの例がアウト・オブ・オーダ実行による最善の例であり,動的
スケジューリングでは,これ以上分岐命令の遅延を小さくできない

これが通常の命令であれば・・・
– アウト・オブ・オーダ実行により,遅延の間に他の命令を実行できる
ため,遅延の影響は隠蔽できる

が,(分岐予測のはずれる)分岐命令では・・・
– 分岐命令以降の命令郡の中から,適切な命令を選んでアウト・オ
ブ・オーダ実行する事はできない
– 従って,分岐命令の遅延がそのまま性能に影響する
11
背景:アウト・オブ・オーダ実行
MTL
坂井・五島研究室
理想的な状態
1st load
F
N
D
S
I
R
A
1
W
F:Fetch
N:Rename
D:Dispatch
S:Sched.
I:Issue
R:Reg.Read
X:Exec.
A:Addr.Calc.
1:L1 Cache
W:Write Back
F
2nd load
・
・
・
F
N
D
S
I
R
A
1
W
・
・
・
F
N
D
S
I
R
X
F
Branch
Instructions
in
The Predicted Function
F
・
・
・
Correct Next Instruction
F
12
MTL
坂井・五島研究室
発表の流れ

背景
– 分岐予測
– アウト・オブ・オーダ実行


関連研究
提案手法
– レジスタ間接分岐ターゲット・フォワーディング


評価
まとめ
13
関連研究
Virtual Function Elimination (Type Feedback)

MTL
坂井・五島研究室
*1
頻出クラスから呼び出す場合についてコンパイラで展開
if (p->class == CartesianPoint) {
// inline CartesianPoint case (most likely case)
x = p->x;
} else {
x = p->get_x(); // dynamically-dispatched call
}

IF文追加のコスト < 毎回仮想関数呼び出しを行うコスト
– 仮想関数呼び出しは,純粋に命令数が多い
– IF文の分岐予測は当たるがレジスタ間接分岐は当たらない
*1) H. D. Pande and B. G. Ryder. Static Type Determination and Aliasing for C++. Technical Report LCSR-TR-250, Department of Computer Science,
Rutgers University, 1995.
14
関連研究
MTL
坂井・五島研究室
Devirtualization

*2
Java用のJITにおける最適化手法
– 派生クラスが唯一ならば通常の関数呼び出しに書き換える

クラスローダ・実行時プロファイルの情報を動的に適用
*2) K. Ishizaki, M. Kawahito, T. Yasue, H. Komatsu, and T. Nakatani. A Study of Devirtualization Techniques for Java Just-In-Time compiler. In
OOPSLA'00 Object-Oriented Programming Systems, Languages and Applications, pages 294~310, 2000.
15
関連研究
MTL
坂井・五島研究室
間接分岐予測器

*3
Pentium M
– 1つの分岐命令に対して複数の分岐ターゲットを保持できるよう,分
岐命令のPCに加えて,グローバル履歴を加味した値で分岐ターゲッ
トバッファにアクセス


確かに複数の分岐ターゲットは保持できる
履歴に依らない大多数の仮想関数呼び出しに対しては無力
*3) S. Gochman, R. Ronen, I. Anati, A. Berkovits, T. Kurts, A. Naveh, A. Saeed, Z. Sperber, and R. C. Valentine. The Intel Pentium M Processor:
Microarchitecture and Performance. Intel Technology Journal, 7(2):21–36, 2003.
16
関連研究
MTL
坂井・五島研究室
*4
Dependence-Based Pre-Computation

間接分岐へ依存がある命令を選択的に先行計算
– 大量の追加資源(レジスタファイルのポート数,追加の演算器など)
– 先行計算が分岐予測に間に合わない事が多い

複雑なプリフェッチャの利用
– 配列・構造体を見抜き,次に呼ばれる仮想関数を予測
– 非常に複雑であり,現実的ではない
*4) A. Roth, A. Moshovos, and G. S. Sohi. Improving Virtual Function Call Target Prediction via Dependence-Based Pre-Computation. In
International Conference on Supercomputing, pages 356–364, 1999.
17
関連研究
MTL
坂井・五島研究室
既存手法の限界

コンパイラでは
– 仮想関数呼び出しの頻度を削減するための研究が中心
– 本質的に除去不可能な仮想関数呼び出しに対して無力

アーキテクチャでは
– 仮想関数呼び出に対して有効かつ現実的な手法は提案されていな
い
18
MTL
坂井・五島研究室
発表の流れ

背景
– 分岐予測
– アウト・オブ・オーダ実行


関連研究
提案手法
– レジスタ間接分岐ターゲット・フォワーディング


評価
まとめ
19
提案手法
MTL
坂井・五島研究室
コンパイラとアーキテクチャの協調

コンパイラによる静的スケジューリング
– レジスタ間接分岐が即座に発行できるよう,連鎖するLoad命令を優
先的にスケジューリングする


アウト・オブ・オーダで隠蔽できなかった分岐命令の遅延を最小限にす
る
レジスタ間接分岐ターゲット・フォワーディング
– コンパイラによりLoad命令を優先的にスケジューリングする事で,分
岐ターゲットを予測ではなくフォワーディングで得る事ができる

分岐予測精度の問題も解決できる
20
提案手法
MTL
坂井・五島研究室
パイプライン図
1st load
F
N
D
S
I
R
A
1
W
F
・
・
・
N
D
S
I
R
A
F
2nd load
F
F:Fetch
N:Rename
D:Dispatch
S:Sched.
I:Issue
R:Reg.Read
X:Exec.
A:Addr.Calc.
1:L1 Cache
W:Write Back
1
W
Forwarding
・
・
・
Branch
F
Correct Next Instruction
N
D
F
レジスタ間接分岐ターゲット
フォワーディング
21
提案手法:レジスタ間接分岐ターゲット・フォワーディング
MTL
坂井・五島研究室
フォワーディング用バッファの利用

Indirect Jump Target Buffer (IJT-B)
– 分岐予測時に利用できるプログラムカウンタの値を用いてバッファを検索
– 必要な値をどのような手順でIJT-Bにフォワードするか
…0050 ・
…0058 ・
…0060 ・
…0068 call
…0070 ・
…0078 ・
…0080 ・
Indirect Jump Target Buffer
($3)
…0068
forwarded
$3 value
22
提案手法:レジスタ間接分岐ターゲット・フォワーディング
MTL
坂井・五島研究室
全体構成
PC
Instruction
Register Producer Table
…0018
load
$2 = 0($1)
2
3
…0030
load
…0018
…0030
Registerfile
$3 = 0($2)
3
…
Indirect Jump Target Producer Table
…0030
…0068
…0068
call
Hit
($3)
Indirect Jump Target Buffer
…0068
…
…0068
Jump Target
23
MTL
坂井・五島研究室
発表の流れ

背景
– 分岐予測
– アウト・オブ・オーダ実行


関連研究
提案手法
– レジスタ間接分岐ターゲット・フォワーディング


評価
まとめ
24
評価
MTL
坂井・五島研究室
評価環境

シミュレータ
– SimpleScalar 3.0d Alpha



提案手法に含まれる3ユニットを実装
Sim-outorderによるアウト・オブ・オーラー実行の詳細なシミュレーション
コンパイラ
– GNU Conpiler Collection 4.0.2



現時点におけるg++の最新リリース
仮想関数呼び出しにおけるLoadを優先的にスケジューリングする修正
ベンチマーク
– C++言語で記述されている必要があり,SPECでは意味が無い
– OOCSB: A C++ Benchmark Suite + α
25
評価
MTL
坂井・五島研究室
コンパイラによる最適化
1.
クラス内の仮想関数

2.
引数オブジェクトの仮想関数

3.
関数の入り口
関数の入り口
返値オブジェクトの仮想関数

値が返される場所
つまり…
仮想関数呼び出し手順1・2に該当する
2つのLoad命令は
最大でこれらの地点まで移動する事が可能
class A {
public:
virtual void Foo(void);
A *Next();
void Bar(A *a) {
…
Foo();
a->Foo();
A *next = Next();
…
next->Foo();
};
};
1. Load $2 = [$1 + 0]
2. Load $3 = [$2 + 0]
3. Call $3
26
評価
MTL
坂井・五島研究室
レジスタ間接分岐における予測成功率の変化
100
90
80
70
60
50
40
30
20
10
0
N
O
OF
FP
richards
N : 最適化・フォワーディングなし
OF: 最適化・フォワーディングあり
deltablue
ray
O : 最適化あり・フォワーディングなし
FP: フォワーディング全成功(理想)
27
評価
MTL
坂井・五島研究室
全分岐における予測成功率の変化
100
90
80
70
60
50
40
30
20
10
0
+4.1%
+4.7%
N
O
OF
FP
richards
N : 最適化・フォワーディングなし
OF: 最適化・フォワーディングあり
deltablue
ray
O : 最適化あり・フォワーディングなし
FP: フォワーディング全成功(理想)
28
評価
MTL
坂井・五島研究室
パフォーマンスの変化
1.2
+13.2%
+6.4%
1
0.8
N
O
OF
FP
0.6
0.4
0.2
0
richards
N : 最適化・フォワーディングなし
OF: 最適化・フォワーディングあり
deltablue
ray
O : 最適化あり・フォワーディングなし
FP: フォワーディング全成功(理想)
29
MTL
坂井・五島研究室
発表の流れ

背景
– 分岐予測
– アウト・オブ・オーダ実行


関連研究
提案手法
– レジスタ間接分岐ターゲット・フォワーディング


評価
まとめ
30
MTL
坂井・五島研究室
まとめ

レジスタ間接分岐
– 分岐履歴に基づいた既存の分岐予測では,仮想関数呼び出しにお
ける分岐ターゲットの予測は困難である
– (予測のはずれる)分岐命令の遅延はアウト・オブ・オーダ実行では
隠蔽できない

提案手法
– レジスタ間接分岐ターゲット・フォワーディング

分岐予測精度の問題を解決
– コンパイラによる最適化


動的スケジューリングでは対応できない分岐命令の遅延について解決
し,分岐ターゲットのフォワーディングも可能にした
結果
– 最大で13.2%の性能向上を達成した
31
MTL
坂井・五島研究室
質疑・応答
32
MTL
坂井・五島研究室
発表文献

主著論文
– Cache Organization for Memory Speculation


Takashi Toyoshima
卒業論文, 東京大学工学部 (Feb. 2004)
– メモリ投機を支援するCMP キャッシュコヒーレンスプロトコルの検討


豊島隆志, 田代大輔, バルリニコデムス, 坂井修一
情報処理学会研究会報告ARC 2005-ARC-160 (Dec. 2004)
– レジスタ間接分岐ターゲット・フォワーディング


豊島隆志, 入江英嗣, 五島正裕, 坂井修一
先進的計算基盤シンポジウムSACSIS 2006 (投稿中)
33
MTL
坂井・五島研究室
34
予備資料
MTL
坂井・五島研究室
多態性

例
– 非仮想関数の場合

Drawable::Draw();
– 仮想関数の場合


Circle::Draw();
応用
– アルゴリズムと操作対象を分離


Drawableに対して操作する形で
アルゴリズムを実装
操作対象はDrawableを継承して
実装すれば後から任意の操作対
象を追加する事ができる
class Drawable {
public:
void Draw(void);
virtual
void Draw(void);
…
};
class Circle : public Drawable {
public:
void Draw(void);
…
};
Circle circle;
circle.Draw();
Drawable *drawable = &circle;
drawable->Draw();
35
予備資料
MTL
坂井・五島研究室
分岐方向予測

条件分岐が成立するか否かを予測する
– その分岐命令について以前は分岐が成立したか否か(ローカル履
歴)
– この命令に至るまでに通過した分岐郡について,どの分岐が成立し
たか(グローバル履歴)

仮想関数呼び出しにおいて特に問題にはならない
36
予備資料
MTL
坂井・五島研究室
最適化アルゴリズム
1.
オブジェクトの検出

2.
確定地点の特定

3.
load
load
$N = 0($1)
$N = 0($N)
前述の3つのケースに照らし合わせて,
仮想関数が確定する地点を特定する
・
・
・
・
・
・
仮想関数呼び出し手順1・2を複製する
この地点で利用可能,かつ分岐までに
破壊されないレジスタに変更する
呼び出しコードの変更

6.
$1 = $4
使用レジスタの変更

5.
move
分岐ターゲット生成コード複製

4.
レジスタ間接分岐命令を探し出し,仮想
関数呼び出しならオブジェクトを指すレ
ジスタを特定する
レジスタの変更に合わせて分岐命令を
修正する
重複するコードの除去

後続命令に対して依存が無ければ、元
の手順1・2に当たるコードを除去する
load
load
call
call
$2 = 0($1)
$3 = 0($2)
($3)
($N)
37