このページの本文へ

ロードマップでわかる!当世プロセッサー事情 第71回

x86を高速化する切り札技術「命令変換」の仕組み

2010年10月04日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/)

  • この記事をはてなブックマークに追加
  • 本文印刷

RISCの利点と欠点

 端的に言えば、RISCは「パイプラインを高速に動作させる」ことを主眼にした設計である。この目的を考えると、可変命令長ではデコードに手間が掛かるので、固定命令長の方が有利である。また演算対象がメモリーだったり、間接アドレスだったりと異なるのは、処理の際に余分な時間が掛かることになるので、演算対象はすべてレジスターのみに限った。もちろん、それではレジスターしか触れないので、メモリーとレジスター間でのロード/ストア命令は別に用意する。

 マイクロコードを廃するのも同じ理由だ。マイクロコード経由でのデコードでは時間が掛かるので、デコーダーはすべてハードワイヤードで構成されている。レジスター間演算のみに限ると、当然必要となるレジスターの数が増えるので、これにあわせて利用できるレジスターを大幅に増やす。

 また、ロード/ストア命令は当然メモリーアクセスが発生するので、処理が遅くなる。これを通常のパイプライン処理で行なうとパイプラインストールが発生してしまうので、これを避けるために遅延スロットを用意。処理に時間が掛かる命令は別に進行させて、パイプラインの動きを阻害しないようにした。

 すくなくとも1980年代の半導体製造技術では、この目論見は非常にうまくいった。RISCアーキテクチャーを採用したプロセッサーとしては、MIPSの「R2000/R3000」やSunの「SPARC」、AMDの「Am29000」やインテルの「インテル960」など多岐に渡っており、いずれもそれなりの性能を実現することに成功している。

 その理由はいろいろあるが、やはり複雑なx86命令を、そのままの形で高速にデコードしたり実行するのは無理があった、という結論になる。もちろんRISC系にも欠点があり、それは命令数が増える傾向にあることだ。x86の加算命令を例に見てみよう。

  • ADD r/m32, r32

 これは「レジスター(r)かメモリー(m)の値(左の引数1)」とレジスター(右の引数2)を加算し、結果をひとつめの引数の場所に戻すというものだ。この命令でメモリーアクセスした場合と同じことをRISC系でやろうとすると、以下のようになる。

  • load r001, Mem
  • add r003, r001, r002
  • store r003, Mem

 まずメモリーの値をr001にロードする。次に「r003=r001+r002」というレジスタ間の加算を行ない、最後にr003の結果を先ほどのメモリーの場所に書き戻すというものだ。つまり同じ処理をするのに、RISC系だと3倍の命令を実行しなければいけない場合すらあるわけだ。

 また初期のRISCプロセッサーの場合、1クロックで演算を実行できるように「複雑な演算は実装しない」ようにしており、整数の乗算すらなかったものもある(ソフトウェアとして実装することになる。そうした欠点を埋めても、なお余りあるほど(当時としては)高速に動作したのがRISCだった。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン