竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ロード命令とストア命令のペナルティ

<<   作成日時 : 2012/05/02 04:08   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 プロセッサ内にある少量のレジスタと外部にある大量のメモリ間でデータをやりとりするのがロード命令とストア命令である。

 4段のパイプライン(FE,DE,EX,WB)で考える。

ストア命令は次のような動作になる。

ST Rs,[R1+R2]
FE: 命令をフェッチする。この段階では何の命令かはわからない。
DE: 命令をデコードする。Rsレジスタの内容をR1+R2で示す番地に転送することがわかる。
EX: R1+R2=addrを計算。
WB: RsをR1+R2番地に書き込む。

ロード命令は次のような動作になる。

LD Rd,[R1+R2]
FE: 命令をフェッチする。この段階では何の命令かはわからない。
DE: 命令をデコードする。R1+R2で示す番地の内容をRdレジスタに転送することがわかる。
EX: R1+R2=addrを計算。
WB: R1+R2番地の内容をRdに書き込む。

 ここで問題となるのがメモリへのアクセス時間である。昔のプロセッサはメモリアクセスにかかる時間とプロセッサの速度がそこまで離れてはいなかった。80486の資料を見るとキャッシュミスで1サイクルのペナルティとある。
現在のプロセッサは、レジスタへのアクセスを1サイクルとすると、一次キャッシュへのアクセスに数サイクル、二次キャッシュへのアクセスに数十サイクル、メモリへのアクセスは数百サイクルの時間がかかる。

 メモリから読み込むロード命令はこれが問題となる。一次キャッシュを参照するのに数サイクルはかかることになる。命令列のように連続したアクセスが期待できるのであればプリフェッチも有効だが、ハードウェアでの予測は難しい。もしキャッシュをミスすると数百サイクルのペナルティとなる。

例:
命令01: LD R3,[R1+R2] # R3←R1+R2のアドレスの値
命令02: ADD R3,R4,R5 # R5← R3+R4

01■■■□□□□□□□□□□■
02□■■□□□□□□□□□□□■■

命令02は命令01でレジスタR3の値が確定しないと実行できない。命令01で10サイクルのペナルティがあるとそれだけ命令02は待たされる。

 この影響をソフト側で少なくするためには、依存関係のある命令01と命令02の間に、コンパイラが順序を入れ替えるなどして依存関係のない命令を埋め込む。また、プリフェッチ指示のあるマイクロプロセッサでは事前に該当番地へのプリフェッチ要求を出して一次キャッシュにデータを載せておく。
ハード側の対処としてはプリフェッチ動作の実装、一次キャッシュよりも近傍にあるロードバッファの採用、キャッシュミス時に切り替えるマルチスレッド、順序を入れ替えて実行できる命令から処理するアウトオブオーダ機構がある。
 ストアの場合は一次キャッシュに書き込む前にライトバッファにいったん貯めこむため、1clkで動作が完了する。キャッシュの該当箇所の掃き出しと書き込みは突き放すことができる。
 ストアする番地とロードする番地が被った場合はどうするか?メモリオーダリングにより順序はハードウェアで保証しない、ロード命令はストア命令を追い越せない、ロードストアの順序は発行順に守る、といった約束がプロセッサごと/プロセッサの持つモードにある。これは別途調査。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ロード命令とストア命令のペナルティ 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる