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

アクセスカウンタ

zoom RSS プログラムカウンタはなくせるか?

<<   作成日時 : 2012/06/20 06:11   >>

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

 条件コードレジスタ(CCR)は重要だがMIPS/Alphaでは汎用レジスタで、スタックポインタも汎用レジスタで扱うことができる。では命令の実行位置を示すプログラムカウンタ(PC)はどうか?


 PCは現在実行中の命令がある番地を示すレジスタであり、実行が完了したら次の命令の先頭を指す。プロセッサによっては現在実行中の命令の次の命令の先頭を示しているものもある。

 命令をひとつづつ実行し、完了しては次の命令に取り掛かっていた、パイプラインを持たない計算機ではPCの示す値はそのまま信用して扱うことができた。パイプライン実行になると、命令がパイプラインステージに分割されて仕掛り状態のまま流れる。ここでは最後のステージで実行が完了した命令がPCを示すことになる。

 では2命令同時実行のスーパースカラプロセッサではどうか。同じステージを並走する命令1と命令2、PCはどちらの命令の位置を示したらよいだろうか。また、外部割込みが発生したら命令1と命令2の前後どの位置から再開するのか。

 アウトオブオーダ実行になるとさらにPCの値は曖昧になる。In-Flight中の命令は完了するまでは実行順序も不明である。外部割込みが発生した場合は、どこに割り込んだらいいのだろうか?
 アウトオブオーダ実行の場合はいくつかの実装方法があるが、割り込みが発生したらIn-Flight中の命令をすべてキャンセルし割り込み動作を行う。復帰する時はキャンセルされた命令を再度頭から投入する。かなりもったいないが確実な方法。または、割り込み発生時にIn-Flight中のデータを保存し、割り込み処理が完了したら戻すという手もある。スナップショットを撮る感じですね。

 特にアウトオブオーダ実行ではPCの値が曖昧である。割り込みの処理によっては、完了したところの1つ前が復帰PCになるし、スナップショットを撮る様な場合は戻るべきPCがはっきりしない。

 もうひとつ、プログラム中で明示的にPCを参照する場合。PCの現在位置を知る操作、相対分岐命令である。相対分岐命令は自分の位置をPCとして、そこに±のオフセットを付けてジャンプする。また、サブルーチンコールでは復帰元のアドレスをリンクレジスタに保存し、サブルーチンに分岐する。サブルーチンは処理の最後でリンクレジスタの値を取り出して復帰元アドレスにジャンプする。


 従来のプロセッサをBASIC言語で書くとこのような感じだ。

10 A=1
20 B=0
30 B=B+A
40 PRINT B
50 GOTO 30

すべてに行番号が付いており、GOTO 行番号でどこへでも飛べる。

 ぼくのかんがえたさいきょうCPU 分岐エントリポイントの指定では、飛び先として扱える命令にエントリポイントのbitを付加し、このbitが立っていないと飛び先としては指定できない。

 これをラベルが使える構造化BASIC言語で書くとこうなる。

A=1
B=0
L1: B=B+A
PRINT B
GOTO L1

 サブルーチンを呼び出すJump&Link命令は、直後の命令がエントリポイントでなければならない。また、ジャンプ先をエントリポイントでなければならない。分岐して飛び込める場所をエントリポイントに限定すると、従来のPC+相対命令ではなく直接エントリポイントを差して分岐できる。つまり、PC相対というPCの参照をなくすことが出来る。
 外部からの割り込みは、現在実行中のコードの直前にあったエントリポイントが基準となる。割り込みから復旧したら、そのエントリポイントからやり直すことになる。これを現在実行中の命令の先の方にあるエントリポイントで割り込むことにしたら、この区間は割り込みがあっても処理を続けるクリティカル・セクションとして扱える。

 従来の実装だと、アウトオブオーダで実行する命令にはIn-Flight番号とPCを付加したものをセットで飛ばしてデータを集め、演算し、結果を書き込んで完了、という動作を行う。割と多くのデータが動きまわっているイメージだ。エントリポイントを使う方法だと、割り込める箇所があらかじめ決まっているので仕掛り中の命令を単純に破棄・または完了待ちにすればよい。これらにはPCはなくエントリポイントのみ必要となる。見方を変えれば、PCの値は離散的になる。

 ということでPCは実行プログラムの先頭から現在実行中の位置を示す概念であり、参照するものではなくなった。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(2件)

タイトル (本文) ブログ名/日時
エントリポイントを考慮した命令フォーマット、プリフィックス廃止
 命令長は16bit単位の可変長で、分岐命令から参照されることを明示するエントリポイントを追加するにはどうしたらよいか。プリフィックスによる修飾だと定数のbit幅などが減り、プリフィックスなしの命令にもエントリポイントの1bitが必要となり効率が悪い。そこで本命令+ポストフィックス命令の形式に変更し、本命令のみエントリポイントを示すビットを追加することにした。  変わってくるのは命令の後ろに修飾が付くので次の命令がデコードされるまで前命令が発行できないということ。だがパイプライン実行前提... ...続きを見る
竹下世界塔の計算機よもやま話
2013/12/31 06:27
ぼくのかんがえたさいきょうCPU 分岐先の抽象化
 従来のマイクロプロセッサはどれも任意の番地にジャンプして命令の流れを変えることができる。これはBASIC言語の行番号と同じである。 ...続きを見る
竹下世界塔の計算機よもやま話
2015/10/31 02:19

トラックバック用URL help


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

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
プロセッサのなかには、割り込み可能ポイントが(実は)離散的になっている実装は既にあるはずです。(そう作るとトレースキャッシュと相性がいい、とか、実行部をVLIW的実装にできるとか、いくつかメリットがある)

一方で、離散度に関しては、例外処理ケースを考えておく必要があります。
例えば、ロード/ストア命令がエントリポイントになっていないと、ページテーブル例外の解決がブロック内でスラッシングを起こして、最悪はハングアップになります。
エミュレートが必要な命令なんかがあると、エントリポイントから離れていると面倒臭いでしょうね。
m.ukai
2012/07/25 18:53
ありがとうございます。割り込みが発生する可能性のある命令はすべて飛び込めるようエントリポイント指定にしないといけないでしょうね。元々はOOOの割り込みの制御にパイプライン全フラッシュではなく一定の間隔で巻き戻せる実装を知った時で、チェックポイントを取る代わりに明示的に命令に埋め込めたらなあと思ったのがきっかけでした。
命令エミュレーションについては考えていませんでした。
houmei
2012/07/25 23:08
DEC PDP-11では汎用レジスタのR7がプログラムカウンタだったらしいです。
kk
2013/12/10 14:14

コメントする help

ニックネーム
本 文




プログラムカウンタはなくせるか? 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる