08. メモリ非曖昧化
DESCRIPTION
08. メモリ非曖昧化. 五島 正裕. 内容. データ依存 メモリ非曖昧化 ストア・セット・メモリ依存予測器. データ依存. データ依存. 制御駆動型 (control-driven) (⇔ データ駆動, data-driven ) 命令間のデータの授受は, プログラム・オーダ上で,先行 / 後続の関係にある 2 命令が, 同一のロケーションを参照する ことで表現 ロケーション:レジスタ と メモリ. Write. add. r4 =. r1 + r2. add. r5 =. r4 + r3. Read. データ依存. I p. - PowerPoint PPT PresentationTRANSCRIPT
08. メモリ非曖昧化
五島 正裕
内容
1. データ依存
2. メモリ非曖昧化
3. ストア・セット・メモリ依存予測器
データ依存
r4 + r3
データ依存
制御駆動型 (control-driven) (⇔ データ駆動, data-driven ) 命令間のデータの授受は,
プログラム オーダ上で,先行・ / 後続の関係にある 2 命令が, 同一のロケーションを参照する
ことで表現 ロケーション:レジスタ と メモリ
add r4 =
add r5 =
r1 + r2
Write
Read
データ依存
後 続 命 令 Is
Read Write
先行命令
Ip
Read
入力依存 (input) 逆依存 (anti)
Write
フロー依存 (flow) 出力依存 (output)
Ip
Is
Ip
Is
Ip
Is
Ip
Is
time
time
time
time
ロード / ストア命令
ロード命令 r[Rt] = *(r[Rs] + immediate);
ストア命令 *(r[Rs] + immediate) = r[Rt];
opop RsRs RtRt immediateimmediate031 152025
レジスタとメモリの違い
レジスタ番号 静的
(実行の度に)変わらない フロントエンド(デコード・ステージ)で分かる
メモリのアドレス 動的
実行の度に変わり得る バックエンド(アドレス計算(実行)ステージ)で初めて分か
る:「曖昧」
メモリの曖昧性による偽の依存
偽の依存: 先行するストアのアドレスが計算されるまで,
後続のロード / ストアは 原則 実行できない 「計算したら違ってた」
コード例
f (int* a, int* b,
int* x, int* y)
{
*x = *a * *a;
*y = *b * *b;
}
x == b ?
ld r1 = *(sp + 0) // a
ld r1 = *r1
ld r2 = *(sp + 16) // x
mul r1 = r1 * r1
st *r2 = r1
ld r3 = *(sp + 8) // b
ld r3 = *r3
ld r4 = *(sp + 24) // y
mul r3 = r3 * r3
st *r4 = r3
ret
解決法
防止(予防, prevention ): ロード / ストアは in-order で
発見 & 回復 (detection & recovery) : 依存なしと予測して out-of-order で メモリ・オーダ違反 (memory-order violation) を発見 0 ~ 7% のロードがメモリ・オーダ違反 ⇒ ペナルティ
理想 (ideal, oracle) : IPC 最大 2 倍
IPC 2 倍の理由
「計算のかたまりがオーバラップする」 「計算のかたまりは,ロードではじまり,ストアで終わる」 「真のメモリ・データ依存がクリティカルになるようなコード
は,
最適化されてない?」
目標: ロードを,特に早期に実行したい (ストアは,そんなでもない)
コンパイラより上手にできる
オーバラップ実行
ld
st
ld
st
ILP (Inst Level Parallelism)
ld
st
ILP
st
ld
メモリ非曖昧化 (memory disambiguation)
メモリ・ディスアンビギュエーション
ディスアンビギュエーション (disambiguation) : 「非曖昧化」,「曖昧性除去(解消)」
分離 (split) ロード / ストア アドレス予測 アドレス一致 / 不一致予測
ロード / ストア命令
通常のロード / ストア命令: アドレス計算部 メモリ・アクセス部
ロード命令 : r[Rt] = *(r[Rs] + immediate);
ストア命令: *(r[Rs] + immediate) = r[Rt];
opop RsRs RtRt immediateimmediate031 152025
分離ロード / ストア (split load/store)
通常のロード / ストア命令: アドレス計算部 メモリ・アクセス部
分離ロード / ストア: ディスパッチ時に分離,以降 2 つの命令としてスケジューリング
効果: ストア・バリューがなくても,アドレス計算が開始できる
バリューより,アドレスが早く決まることが多い ロードは変わらない
バリューに相当するソース・オペランドがないから
ロード / ストア命令
普通の ISA のロード / ストア命令: 非分離 (non-split) を想定
理由: パイプライン・マシンで, ALU でアドレス計算をすることを想
定 コード効率の改善(命令の圧縮)
非 RISC 的?
18
DRMDR
100100
PC
Main Memory
1000
MA MD
200
0
IF
ID
EX
MEM
WB
100
208
IR
RegFile
8ld 12
Rs
Rt 1add23104
アドレス予測
ロード / ストアのアドレスを予測 単純にロードを早期実行する効果 非曖昧化の効果
値予測の一種 だが,値予測より歴史が古い
メモリ・アクセスがストライドであることは容易に想像できる
ハードウェア
今までの方法: 分離ロード / ストア アドレス予測
実際にアドレスの一致検出を行う スケジューリングのために,比較器のマトリクス(行列)が必
要! 比較器数 ≒ ½ × (ウィンドウ・サイズ)2
もう 1 つの方法: アドレス一致 / 不一致予測
比較器のマトリクス
old
new
0
1
2
3
0 1 2effectiveaddress 先行命令
=? rdyL/S Valid
Load ― ― 1
Store
0 ― 0
1= 0
≠ 1
L/S V
ストア・セット・メモリ依存予測器
ストア・セット
あるロードのストア・セットとは: そのロードが依存したことがあるストアの集合
計算の方法: recovery-based 最初「依存していない」としておいて, オーダ違反 (memory-order violation) を検出して,追加
利用の方法: ロードは,そのストア・セット内のストアに依存すると予測
予測器の実装
原理的には: ストア・セット内のすべてのストアが実行された後でロードを実
行
実装上の制限: ストア・セット内のストアは in-order で実行
In-order チェイン: ストア → ストア → … → ストア → ロード
PC of Fetched Instructions
構造と動作
SSID X
SSID X
SSID X
SSID Table
LastFetched
StoreTable
X
S
S
L
SSID : Store Set ID
S1
S2
L
S1S2
Recovery-Based
ストア・セットの計算の方法: recovery-based 最初「依存していない」としておいて, オーダ違反 (memory-order violation) を検出して,追加
Violation の検出: 比較器数 ≒(ウィンドウ・サイズ) ×(発行幅)
「教訓」: 厳密にやるより,いい加減にやったほうがうまくいく(こともあ
る)
比較器のアレイ
old
new
0
1
2
3
effectiveaddress 先行命令
=? rdyL/S Valid
Load ― ― 1
Store
0 ― 0
1= 0
≠ 1
L/S V
今日のまとめ
メモリ・データ依存
データ依存: レジスタ メモリ
メモリのデータ依存: 動的 アドレス計算しないと分からない:「曖昧」
メモリ参照の曖昧性による偽の依存 ストアのアドレスが決まるまで,後続のロード / ストアは実行できな
い
保守的 (conservative) な方法: ロード / ストアは in-order で
ロードは,特に早期に実行したい 「計算のかたまりは,ロードではじまり,ストアで終わる」
ストアは,そんなでもない 真のメモリ・データ依存がクリティカルであるようなプログラム
は,
最適化されてない?
ディスアンビギュエーション
ディスアンビギュエーション(非曖昧化,曖昧性除去,解消) 分離ロード / ストア アドレス予測 アドレス一致 / 不一致予測
ストア・セット依存予測器