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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU NOP命令の拡張

<<   作成日時 : 2011/05/29 03:27   >>

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

 NOP命令の存在意義はなにか?昔はタイミング調整とパッチを当てるための場所を確保するためだったのだが、OutOfOrder実行などによりタイミング調整の役割はほとんどなくなった。

 シングルパイプラインではNOPの役割はあった。MIPSでは隣接する命令に依存関係がある場合、それを解消するために必要だったくらいだ。(初期MIPSはハードで依存関係の解決をやらない) RISCでゼロレジスタを持っていればor %g0,%g0,%g0でNOP相当の役割を果たすが、ALUには投入される。SPARCの場合、別にNOP命令が存在した。
 複数同時命令実行可能、OutOfOrder実行になるとNOPの存在意義がますます薄れてしまう。
複数命令を同時に実行するのはスケジューリングをハードウェアに任せたVLIWだ。ただしスケジューリングを行うハードウェアは複雑になってしまう。
ここでALU命令2、ロードストア命令1、分岐命令1を同時実行できるプロセッサを想定してみる。命令列がこの4個をぴったり投入できるように並んでいれば4命令を同時発行できる。
しかし以下のような命令列では命令発行が分割される。(SPARC風アセンブラで書いた場合)
--------
subcc %g1,%g2,%g0 ; condition codeに比較結果を反映
beq L0
nop ; ディレイドスロット
--------
bne L1
nop ; ディレイドスロット

これは分岐命令が2個同時に投入できないため、最初の3命令が同時に発行され、残りが続いて発行される。
なお、わざと書いたのだが遅延分岐を行うプロセッサでは、分岐命令の後に何もさせないためのNOPが必要となる場合がある。
また、プロセッサの状態を変える命令は通常の命令と同時発行しない。その命令の前後で動作が変わってしまうので、実行ステージで判断するよりも現在実行中の命令完了を待ってから発行し、プロセッサの状態を変えたほうが簡単になる。プロセッサの状態が変わるまで後続命令の発行は一時停止する。

 さて、NOP命令だが実装ではALUに投入されるも次々とバイパスされ結局なにもしない。投入する必要はないのではないかと思われるが、では何のために?
1つは命令の同時実行を最適化するための調整用としてコンパイラが埋め込む。ただし実装依存であり将来6命令同時実行などとなったら、性能を上げるためにはコンパイラを修正しなければならない。
もうひとつはパイプラインを空にする役割がある。これは性能測定の時に有効。NOP命令を充分に並べておけばパイプラインは空になり、被測定命令列の前後に入れておけば良い。
次に被測定命令列をすべてNOPで潰した同じ性能測定プログラムを実行し、実行サイクルなどの差分を調べれば依存関係や実行資源不足によるストールなど比較による測定ができる。当然だが両方とも同じアドレスで実行、命令/データキャッシュの状態も揃えたプログラムにしなければならない。

 さて、NOP命令の拡張について考えてみる。
ALUに投入しなにもしない命令はNOPでよい。ロードストア命令でなにもしないのはゼロレジスタへのロードだが、プリフェッチ的な使い方も考えられるのでゼロレジスタ(または値を使わないレジスタ)に対するLEA命令でどうだろうか。分岐命令はBranch Never命令がある。これは常に飛ばない分岐命令である。

NOP命令にサイクル数を指定できるオペランドを追加してみよう。

NOP 0 これは実行しないNOP命令である。パイプラインに投入されない。ただ命令の場所を確保するだけ。
NOP 1 1個の空命令を投入する。
NOP 2 2個の空命令を投入する。
...
NOP 63 63個の空命令を投入する。

NOP とだけ書いた場合はNOP 1と解釈する。

以下はどっちがメリットがあるだろうか?
(1)同時実行できるプロセッサでは1個のALUにしか投入されない。2個のALUに同時発行できるプロセッサに対してはNOP ; NOPの様に続けて書く。
(2)同時実行できるプロセッサでは複数のALUに対し投入される。2個のALUを持っているとしたらNOP 2でNOP ; NOP相当となる。

NOP 0 と NOP 1(従来のNOP)の区別くらいは欲しいが、それ以上となるとどうも有効な利用方法が思いつかない。性能測定は滅多にするものじゃないし。
NOP 2以降は特殊な命令に割り当てるのがいいかもしれない。いっそ単純なマイコンだったら使い道はあったろうが。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 3
面白い 面白い
驚いた

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU NOP命令の拡張 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる