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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU 演算命令について

<<   作成日時 : 2012/06/01 04:07   >>

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

 演算命令は入力が1つ以上、出力が1つの内部に状態を持たない関数と考えれば、記憶を保持する機構なく組み合わせ回路のみで構成できる。極端な話、筆算の様に計算して求める除算でも、8bit÷8bit=8bitを求めるためには16bitのアドレス、8bitのデータが扱えるROMがあればよい。
 実際はメモリで組み合わせ回路を構成するよりも演算の規則性に従って論理回路で組み合わせ回路を構成したほうが効率がよく高速なのでロジックで組まれる。これも例外はあってSRT除算では一部テーブルを使う。また、命令デコーダも組み合わせ回路のみで構成されるので演算器の一種と考えることも出来る。

 演算命令を高速に流すためには、1サイクルで完了、例外なしを実現させる。
例外を発生させそうな命令は加算、減算、乗算でレジスタの範囲内から溢れてしまうオーバーフロー、加算と減算で発生するキャリー/ボロー、除算で発生する0除算と負の最大値を-1で割った時。
従来はこれらが発生するとトラップで処理、または条件フラグに演算後の状態を残して処理という方法だった。Alpha/MIPSでは条件フラグをなくす代わりにレジスタ同士の比較結果をレジスタに保存し、その内容によって条件分岐などを行った。オーバーフローのトラップは発生する。

 キャリー/ボローについては多倍長演算で意識する。加減算後、比較命令で同一ソースを指定することでキャリー/ボローの発生のみを判定することができる。
 0除算は除算命令を使う前にチェックするか、0除算を実行した結果を0と定義しておく。また、負の最大値÷-1の結果は負の最大値と定義しておく。これらもソースの値からチェック可能。

 オーバーフローはちょっと面倒で、演算直後にしかわからない。しかしオーバーフローを意識する命令ならば、Nullficationを組み合わせることによって場合分けができる。

例:
ADDN R1,R2,R3
JMP OVERFLOW # ADDN命令でオーバーフローが発生していれば実行、そうでなければスキップ

これは通常の分岐命令なので特権状態に遷移することもなく、トラップ先を決められるため使ったレジスタを判断することができる。また、分岐命令でなく他のレジスタに値を蓄積してもよい。

 除算も含めて例外発生なし、とすることでSIMDへの拡張が簡単になる。SIMDで並列に演算する結果の1つでもおかしかった場合は止めてチェックしなければならなくなるが、高速化のためにはそのような停止は避けたい。エラーがあれば別レジスタに蓄積して、後でまとめて整理するほうがよい。

 それで、SIMD命令にもまとめられるようにするためには、乗算、除算は1つで完結する命令でなければならないだろう。複数のステップで動作する乗除算命令では完了するサイクルが表に見えてしまい、その間コードの流れに影響する。これが1個の命令ならば、内部で決められたレイテンシで実行してくれれば、単純にはいちばん遅い演算に合わせて待ち合わせればよい。SPARC等で非推奨命令となったステップ乗算命令はその役割を10年以上前に終えた。その代わりといってはなんだが組み込みマイコンのi8051が乗算/除算命令を最初から持っていたのは命令セットアーキテクチャの変化に影響を与えなかった。CISCだけど。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




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