データハザード
先行命令の結果を使った処理をする倍に発生するハザード
WBを待たずに古いレジスタの値を読み出してしまう
→読み出すものをストールすることで解決する
命令の並べ替えで最適化を図ったりもする
フォワーディングによる対応
EXステージの結果をWBせずに次の命令のEXにバイパス/フォワーディングして後でWBする
- パイプラインレジスタからの入力が分岐していて、EX-MAの他にEX-EXの接続もできる
- MAからEXもできる
フォワーディングの可否はクロックのステージに依存していて、次のクロックステージであれば間に命令が挟まってもフォワーディング可能
テストに出るらしい
キャッシュと仮想記憶
RAM
- SRAM(static~)
- 1bitをフリップフロップで構成(トランジスタ6個くらい)
- 早いが小容量
- だいたい0.5~2.5ns
- DRAM(dynamic~)
- 1bitをコンデンサとスイッチング用のトランジスタで構成
- 電荷の放電で情報を失わないように定期的にリフレッシュする必要
- だいたい50~70ns
- メインメモリなどで利用
フラッシュメモリは5~50マイクロ秒、ハードディスクは5ミリ秒とか
メモリ参照の局所性
- 時間的局所性
- 最近アクセスされた命令やデータは近いうちに再アクセスされる可能性が高い
- たとえばループとか
- 空間的局所性
- あるデータがアクセスされるとそのアドレス周辺のデータや命令もアクセスされる可能性が高い
- 配列とかスタックフレームとか
フォンノイマンボトルネック
メモリアクセスはかなり遅いのでCPU動作の足を引っ張ってしまう
→キャッシュメモリによってボトルネックを解消したり低減したりすることを狙う
記憶階層を用意して、高速低容量~低速大容量を組み合わせて高速かつ大容量なメモリを仮想的に用意する(実際の階層構造は隠蔽する)
キャッシュは小さくていいの?
→参照の局所性により、プログラムが必要とするメモリとアドレスの範囲は短期間に限ってみれば少量で十分狭い
メモリを大量に消費するプログラムであったとしても裁断瞬間必要メモリ量はそれほど多くない(なお科学技術計算やLLM)