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