--
積極的な高速化
消極的な高速化
--
計算原理の高速化
物理原理の高速化
: Si, GaAs, HEMT, JJ ...
素子の高速化(クロックの高速化)
--
素子をどれだけ小さくできるか?
1nsくらい?
--
多量の素子の利用
メモリアクセスの高速性
並列性の利用
top500の図
exa flopsのたっせい・
--
パイプラインアーキテクチャ
:パイプリアンの基礎、動的スケジューリング、分岐予測、ソフトウェアパイプライン
キャッシュメモリ
:基本方式、キャッシュメモリの高速化
メインメモリ
:基本素子とメモリバス方式
:メインメモリの高速化
並列処理(メインは4年夏学期の分散並列論)
:スーパスカラ
:VLIW
:GPGPU
--
パイプラインアーキテクチャ
・作業資源の有効活用
:並列処理
すべての人が道具を持っていなければならない
(すべての人が足し算機を持たなければならない)
--
・ステージ内の論理回路
組み合わせ論理管理(8-15段)
メモリアクセス
ALU演算
・CPUのパイプライン: 各フェーズが1段が基本
・FFのセットアップ時間 + FFの出力遅延 + 2:1セレクタ時間
・素子から見た限界性能
:パイプライン時間の遅延時間の不均等
:パイプラインレジスタの遅延時間とクロックのスキュー
クロックが同時に入らない
クロックのずれ(スキュー)
:とるのは難しい
--
・パイプラインの可変性
マルチサイクル命令
キャッシュメモリアクセス
・パイプライン段間の依存性、逆依存性
パイプラインハザードによる遅延
・ハードウェア量の増加、配線量の増加
回路遅延時間の増加
(パイプラインレジスタが多い)
・制御回路の複雑化
命令の前後の組み合わせ
:addのあとにcallを呼んだらどうなる?etc
パイプライン段の分岐、合流、バイパス
--
5段以上使うときは、
ゲートの半分くらいはパイプラインレジスタになる。
--
基本方式
(In Order Issue, In Order Completion)
Issue : 命令発行
命令を事項パイプラインに投入する
Completion : 命令完了
命令結果を書き込み、命令パイプラインから除去する。
実行時間が可変の場合、投入に待ち合わせがある時
IssueとCompletionの順番は変えない
--
In order Issue, Out of Order Completion
実行時間にあわせ、実行完了順が入れ替わる。
割り込みを含め、逐次実行と同じ結果を得ることが望ましい
--
Out of Order Issue, Out of Order Completion
実行時間にあわせ実行開始、実行完了順が入れ替わる
割り込みを含め、逐次実行と同じ結果を得ることが望ましい
(すごい難しい)
当然、順に計算速度が向上するが、問題点も増加する
かなり早くなる
OoOとかく
--
Out of Order Issue, In order Completionは通常用いられない
--
パイプライン段間の依存性、逆依存性
命令間の様々な依存関係、競合関係でパイプライン実行が遅延
:正しくない実行結果を得る
命令間のオペランド依存関係
add r1, r2 -> r3
sub r3, r4 -> r5 (ここで前のr3の値がよまれる)
命令間のオペランドの逆依存関係
add r1, r2 -> r3
sub r3, r4 -> r1
(subが先に実行されてしまうかもしれないので、addのr1でまちがう)
制御依存関係
cmp
jmp (条件が決まるまでわからない)
--
CPUリソースの競合
・演算機 (alu, falu)
・メモリポート
・バスなど、CPU内部のデータ転送路
達成すべき状態
逐次実行と同じ計算結果を与える
できるだけ計算時間を短縮する
少ないハードウェア、高速クロックを実現する
ハザードを咲けるためには
・バブルを入れる
・投機実行を行う
--
構造ハザード
・CPU内の資源の競合により、実行が阻害される
・CPU内資源の確保方法が悪いと、デッドロックを発生する
命令発行前にすべてのCPU内資源を確保する
資源の確保に、命令投入順の優先順位をつける
解決
・競合する資源の多重化、多ポート化
命令メモリとデータメモリの分離
マルチポートレジスタファイル
マルチポートメモリ
演算ユニットの複数設置
CPU内データ転送バスの増加
・パイプライン実行にパイプラインバブルを入れる(ストール)
--
データハザード
・前後の命令間でのデータ依存関係、逆依存関係の不正
:3つのサブクラスに分けられる
・RAW (read after write) データ依存関係
先行する命令書き込み完了前に、同一レジスタ、メモリからデータを読み出す。
add r0, r3 -> r1
sub r1, r3 -> r2
mul r0, r2 -> r3
オペランドデータのバイパス
実行フェーズの出力をレジスタ、メモリを介さず直接後続命令の出力オペランドとして使用
パイプライン上命令の出力レジスタアドレスと、後続命令の入力レジスタアドレスを比較
一致する場合に、マルチプレクサを介して直接データを渡す
・WAR (write after read) 逆依存関係
後続命令の書き込みが、先行命令の読み出し以前に行われる
- Out of Order Completionが行われる場合
- パイプラインの早いフェーズで書き込みが行われる場合
・WAW (write after write)
先行命令の書き込みが、後続命令の書き込みより後
オペランドに残る値が不正
(後に実行した命令の書き込みが有効にならないといけないが、
OoO等などによって、別のものがかきこまれる)
解決
・パイプラインのストール
・ソフトウェアによる命令スケジューリング
コンパイラで、そのような命令を発行しない
・遅延スロットの利用(メモリのロード、ストア)
・動的命令スケジューリング
データ依存関係、逆依存関係に基づく命令実行制御
必要ならば、レジスタ・リネーミングを行う
実行時に、レジスタをかきかえちゃう(r1, r101)
--
ストール
原因の比率
ロード遅延 3%
分岐遅延 2%
FP構造ハザード 2%
FPデータハザード 27%
(昔のデータ)
--
制御ハザード
・PCに対するデータハザード
・命令フェッチはパイプラインの先頭のため、影響大
条件分岐命令 F D R EX W
EXを行うまで、わからない
・分岐命令の出現頻度
4, 5命令にひとつ
頻繁に現れる。
・分岐、条件分岐ペナルティの軽減
- 分岐の成立、不成立のパイプラインの早期に判定
- 分岐先アドレスをパイプラインの早期に生成
- 無条件分岐命令のフェッチまたはデコードの先取り
・遅延分岐 (delayed branch)
bc l1
add
sub
...
l1:
...
分岐の成立不成立に関わらず、後続のN命令を実行する
うめるほうほう
(a) 分岐命令の先行命令を移動
add r1, r2, r3
if r2 = 0 then
delay slot -> add r1, r2, r3
(b) 分岐先命令を移動
ループに対しては有効
確率的
(c) 分岐命令の後続命令を移動
遅延スロットの充足率
50%くらいのパフォーマンス向上
遅延分岐は有効?
・遅延スロットは割り込み問題を発生する
-
-
BC
[delayed slot]
[delayed slot]
slot数が1のとき
一つ前の分岐命令からやりなおすと、うまくいく
スーパスカラでは?
bc bc bc bc
遅延スロットがたくさんある。
こえはほどんど意味がない。
今は分岐予測があるので、
歴史的経緯としてある。
--
分岐予測
99%当たる。