高速化の手段
- 演算機構の高速化
- 素子の高速化:演算装置の回路、レジスタの素子を高速な素子にする。
→参照:「半導体素子」(hs-rom-ram)
- パイプライン方式:命令実行のプロセスを細分して複数の命令を並列実行する。
さらに高速化した方式に、スーパスカラ方式、スーパパイプライン方式がある。→後述
- ベクトルレジスタ:多数の同一命令を並列実行する。→後述
- 命令セットの改善:命令を多機能な命令にすることにより命令数を減らすCISC、その逆に演算回路を簡素化することにより高速化を図るRISCの組合せを図る。→後述
- メモリアクセスの高速化
- メモリの大容量化:データをメモリ上に展開することにより、ファイルアクセスを減らすことができる。仮想記憶方式でのスラッシング(ページング)を減らすことができる。
→参照:「仮想記憶方式」(hs-kasou-kioku)
- キャッシュメモリ:メモリを大きくするには安価である必要がありDRAMが用いられるが低速である。メモリ参照のとき、その周辺を高価だが高速なSRAMのキャッシュメモリにバッファすることにより高速化を実現する。
→参照:「記憶階層とキャッシュメモリ」(hs-kioku-kaisou)
- メモリインタリーブ:メモリをバンクに分散しておき、メモリアクセスを並列化する。→後述
- 並列プロセッサ:複数のCPUを並列的に実行する。
→参照:「システム構成」(hs-dual)
- アルゴリズムの改善:ソースプログラム作成時点での工夫
→参照:「計算量(オーダー)」(na-order)
コンパイラで翻訳する時点での最適化など
→参照:「言語プロセッサによる翻訳」(hs-os-honyaku)
パイプライン方式
パイプライン方式とは、演算装置での命令実行プロセスを並列化する技術です。それを発展した方式にスーパスカラ方式とスーパパイプライン方式があります。また、これらの方式を効率よく行うためには、分岐予測が必要になります。
- パイプライン方式の概念
- CPUが命令を実行するプロセスは、
命令フェッチ→命令解読→有効アドレス計算→オペランドフェッチ→命令実行→結果の格納
のプロセスに分解できます(ここでは、これらをF→D→A→O→E→Sと表記することにします)。
同時に複数のプロセスを行うことができない場合は、次のように時間がかかります。
┌─┬─┬─┬─┬─┬─┐
命令1│F│D│A│O│E│S│
└─┴─┴─┴─┴─┴─┼─┬─┬─┬─┬─┬─┐
命令2 │F│D│A│O│E│S│
└─┴─┴─┴─┴─┴─┼─┬─┬─┬─
命令3 │F│D│A│O
└─┴─┴─┴─
それに対して、同時に複数のプロセスを行う(それぞれ別の装置で実行する)ことができ、各プロセスの実行時間(クロック数)が同じだとすれば、次のように並行させることができるので、処理が高速化します。このような方式をパイプライン方式といいます。
┌─┬─┬─┬─┬─┬─┐
命令1│F│D│A│O│E│S│
└─┼─┼─┼─┼─┼─┼─┐
命令2 │F│D│A│O│E│S│
└─┼─┼─┼─┼─┼─┼─┐
命令3 │F│D│A│O│E│S│
└─┼─┼─┼─┼─┼─┼─┐
命令4 │F│D│A│O│E│S│
└─┴─┴─┴─┴─┴─┘
- スーパスカラ方式
- スーパスカラ方式は、複数のパイプラインを処理する演算装置を置いて、並列に動作させます。例えば、2つのパイプラインがあれば、次のような動作になります。
┌─┬─┬─┬─┬─┬─┐
命令1│F│D│A│O│E│S│
├─┼─┼─┼─┼─┼─┤
命令2│F│D│A│O│E│S│
└─┼─┼─┼─┼─┼─┼─┐
命令3 │F│D│A│O│E│S│
├─┼─┼─┼─┼─┼─┤
命令4 │F│D│A│O│E│S│
└─┴─┴─┴─┴─┴─┘
- スーパパイプライン方式
- スーパパイプライン方式は、パイプライン方式の各処理プロセスを細分化して、先の命令のプロセスが終了しない間に、次の命令の同じプロセスを並列して行う方式です。
┌─┬─┬─┬─┬─┬─┐
命令1│F│D│A│O│E│S│
└┬┴┬┴┬┴┬┴┬┴┬┴┐
命令2 │F│D│A│O│E│S│
└┬┴┬┴┬┴┬┴┬┴┬┴┐
命令3 │F│D│A│O│E│S│
└┬┴┬┴┬┴┬┴┬┴┬┴┐
命令4 │F│D│A│O│E│S│
└─┴─┴─┴─┴─┴─┘
- 分岐予測
- これらの方式は、複数の命令が順次実行されることを前提としています。ところが、例えば命令2が分岐命令だとすると、それに続く命令は、分岐先の命令になります。命令3や命令4の実行を元に戻して、新しい命令を実行しなければなりません。
条件分岐で分岐するかどうかを予測することを分岐予測、分岐アドレスが実際に決定される前にそれを推察することを分岐先予測といいますが、その精度を高めるために、多様な工夫が行われています。
ベクトルレジスタ
いくつかの同じ命令が連続しているとき、その情報をベクトルレジスタというレジスタに入れておき、並列実行することにより処理を高速化します。これを発展させれば、プログラムの繰返し部分を対象にすることもできます。
これを重視したコンピュータをベクトル計算機といいます。大規模な科学技術計算に用いられることが多いのですが、部分的にこのような処理をすることは、パソコンにも取り込まれています。
CISC/RISC
CPUは、命令の構成からCISC(Complex Instruction Set Computer)とRISC(Reduced Instruction Set Computer)に分類できます(実際のCPUは、両者の長所を部分的に取り込んでいます)。
| | CISC | RISC |
| 命令セット |
複雑な機能を持つ多数の命令 |
単純な機能を持つ少数の命令 |
プログラムから 生成される命令数 |
複合した機能が1命令になるので 命令数は少ない |
単純な命令の組合せになるので、 命令数は多くなる |
| 命令の長さ |
可変長(長い) |
固定長(オペランド個数も少ない) |
演算装置での 計算回路 |
マイクロプログラム (ファームウェア) |
ワイヤードロジック (結線論理) |
パイプライン方式 の適用性 |
命令に要するクロック数が多様なので 採用しにくい |
クロック数が同じの命令が多いので 採用しやすい |
CISCは命令数が少ないことから高速化できますし、RISCは演算回路が単純なので高速化できます。そのため、どちらが高速であるかは、一概にはいえません。
歴史的には、CISCからRISCへと変化してきました。プログラムをアセンブラで作成した頃には、プログラム作成を容易にするため、コンピュータメーカーが演算回路(ファームウェア)による高速化を図っていたために、CISCが発展したのですが、あまりにも複雑になりました。コンパイラが広く用いられるようになり、プログラマは機械語を意識する必要がなくなったこと、演算回路を比較的単純な回路を適切に組み合わせるほうがむしろ高速になる場合があること、パイプラインなどの高速化技術を適用することなどのため、RISCの有効性がいわれるようになりました。
しかし、どちらも極端なのは不適切です。現在のコンピュータは、双方のよいどことりをしたような構成になっています。
メモリインタリーブ
メモリをアクセスするときの高速化方式です。メモリを複数のバンクという領域に分割しておき、例えば、1番地、4番地のデータはバンク1、2番地、5番地のデータはバンク2、3番地、6番地のデータはバンク3に格納するようにしておきます。それにより、1番地から3番地までのデータをアクセスするとき、並行して行うことができます。