ぼくのかんがえたさいきょうCPU 演算結果のバイパス

 以下をもうちょっと考えてみたもの。

ぼくのかんがえたさいきょうCPU:連鎖性言語の特徴を取り入れてみる


乗算を使わずに%r1の値を3倍するコードを考えてみる。

SLL %r1,1,%r2 ; ADD %r2,%r1,%r3

SLL命令で%r2には%r1の2倍がはいり、ADDでもとの%r1と加算されて%r3には%r1の三倍の値がはいる。

ここで%r2は作業用のレジスタでありこれ以外ではもう使用されない。そういった用途でレジスタファイルにわざわざ書き込んでまた読み出すというのはムダのような気がする。実際にはパイプラインのフォワーディングで前命令の演算結果は次命令の演算に使いレジスタファイルから読み出されることはないのだが、ムダな動作だ。

データハザードを減らすバイパス[コンピュータアーキテクチャの話]

では、演算結果をレジスタに書き込まずに毎回テンポラリのラッチ%tempに書き出すとする。すると:

SLL %r1,1,%temp ; ADD %temp,%r1,%r3

これで%r2は使わなくてもよくなった。

命令セットのうち、デスティネーションレジスタ番号を指定しないものはこの%tempにのみ結果を書き出す。ディスティネーションレジスタ番号を指定したものはそちらにも書き出しつつ%tempにも結果を書き出す。

 ロード命令に適用した場合はロードした値をすぐ次の命令で利用できる。実質アドレッシングモードとレジスタを混在させたCISC系のMOV命令相当になる。

 この結果をバイパスして汎用レジスタに書き込まない一連の命令列は、それをひとつの命令として解釈し実行してもよい。先程の例はPA-RISCだと1命令でシフトして加算するのがあるが、内部でそのように実行してもよい。

 浮動小数点の場合はどうか。レジスタに結果を書き込む時は、指定した丸めモードで丸められた値が格納される。演算自体はもっと多くのbitを使って行われるが、この丸めをしない生の結果をそのままバイパスして渡すことにより、FMA命令が実現できる。この仕様にすると、オペランドを拡張することなく命令の連接だけでよいので命令デコードが簡単になる。

FMUL %r1,%r2,%temp ; FADD %temp,%r3,%r4

これと以下のコードは途中での丸めの有無が異なるので厳密な結果は異なる。

FMUL %r1,%r2,%r5 ; FADD %r5,%r3,%r4

バイパスは丸めなどの加工なしで検討しよう。



バイパス付心臓2分解モデル 80×80×140 /8-8316-01バイパス付心臓2分解モデル 80×80×140 /8-8316-01

アズワン
売り上げランキング : 178988

Amazonで詳しく見る
by G-Tools


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

なるほど(納得、参考になった、ヘー)

この記事へのコメント

この記事へのトラックバック