CPU、高速化技術、パイプライン処理、アウトオブオーダー実行、分岐予測、投機実行、遅延分岐、レジスタりネーミング。スーパースカラ、RISC/CISC、キャッシュメモリ、メモリインタリーブ
高速化の手段
- 演算機構の高速化
- 素子の高速化:演算装置の回路、レジスタの素子を高速な素子にする。
→参照:「半導体素子」(hs-rom-ram)
- パイプライン方式:命令実行のプロセスを細分して複数の命令を並列実行する。
さらに高速化した方式に、スーパスカラ方式、スーパパイプライン方式がある。→後述
- ベクトルレジスタ:多数の同一命令を並列実行する。→後述
- 命令セットの改善:命令を多機能な命令にすることにより命令数を減らすCISC、その逆に演算回路を簡素化することにより高速化を図るRISCの組合せを図る。→後述
- メモリアクセスの高速化
- メモリの大容量化:データをメモリ上に展開することにより、ファイルアクセスを減らすことができる。仮想記憶方式でのスラッシング(ページング)を減らすことができる。
→参照:「仮想記憶方式」(hs-kasou-kioku)
- キャッシュメモリ:メモリを大きくするには安価である必要がありDRAMが用いられるが低速である。メモリ参照のとき、その周辺を高価だが高速なSRAMのキャッシュメモリにバッファすることにより高速化を実現する。
→参照:「記憶階層とキャッシュメモリ」(hs-kioku-kaisou)
- メモリインタリーブ:メモリをバンクに分散しておき、メモリアクセスを並列化する。→後述
- 並列プロセッサ:複数のCPUを並列的に実行する。
→参照:「システム構成」(hs-dual)
- アルゴリズムの改善:ソースプログラム作成時点での工夫
→参照:「計算量(オーダー)」(na-order)
コンパイラで翻訳する時点での最適化など
→参照:「言語プロセッサによる翻訳」(hs-os-honyaku)
メモリインタリーブ
メモリをアクセスするときの高速化方式です。メモリを複数のバンクという領域に分割しておき、例えば、1番地、4番地のデータはバンク1、2番地、5番地のデータはバンク2、3番地、6番地のデータはバンク3に格納するようにしておきます。それにより、1番地から3番地までのデータをアクセスするとき、並行して行うことができます。
パイプライン方式
パイプライン方式とは、演算装置での命令実行プロセスを並列化する技術です。それを発展した方式にスーパスカラ方式とスーパパイプライン方式があります。また、これらの方式を効率よく行うためには、分岐予測が必要になります。
- パイプライン方式の概念
- 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│
└─┴─┴─┴─┴─┴─┘
1 2 3 4 5 6 7 8 9
└実行プロセス数
- パイプライン方式の処理時間
-
I:実行する命令数(上図では4)
D:パイプラインの深さ。命令の分割数(上図では6)
P:パイプラインピッチ。1プロセスの実行時間
とすれば、全命令が完了するまでの実行時間は
(I+D-1)×P
になります。
- パイプラインハザード
- 命令間の依存関係などによりパイプライン処理を止めたりやり直さなければならなくなることです。
- データハザード
ある命令が直前の命令の処理結果を利用するような場合に、実行結果を待たなければパイプラインが進められない状態になります
- 構造ハザード
同じタイミングで同じハードウェア資源にアクセスしようとするなど競合が発生します。
- 分岐ハザード
条件分岐で実行の流れが二つに分かれる場合、誤った方向に分岐した場合、パイプラインの内容を破棄して正しい分岐の命令群を入れなおすことになります。
- スーパスカラ方式
- スーパスカラ方式は、複数のパイプラインを処理する演算装置を置いて、並列に動作させます。例えば、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│
└─┴─┴─┴─┴─┴─┘
実行命令の順序(パイプライン方式と並列処理)
- アウト・オブ・オーダー実行
- アウト・オブ・オーダー実行とは、命令の順番に関係なく、処理に必要なデータが揃うなど、実行が可能になった命令から実行する仕組みです。
- 分岐ハザード
- 通常は、機械語プログラム中の命令の並び順に実行されます(イン・オーダー実行)。しかし、パイプライン方式では、命令を実行する間に、後続する命令を知っています。並列処理ができるならば、あるタスクが今の命令を行っている間に、他のタスクで以降の命令を行うことができます。これを分岐ハザードといいます。
- 分岐予測
- 次のような命令(実際には機械語ですが)になったとします。
if (条件 == true) 命令A; 分岐命令
命令B;
本来ならば、ここまでの値から条件の真偽を判定して、命令Aを行うか、直接命令Bの実行を開始します。しかしそれでは判定のための時間を待つことになります。
条件分岐で分岐するかどうかを予測することを分岐予測といいます。これに時間がかかるのでは無意味なので、単純な計算で予測、あるいは無条件で分岐を決定します。
- 投機実行
- このようにして、分岐命令の判定をせずに一方の実行を行うことを投機実行といいます。
命令Aのタスクと命令Bのタスクが並行処理をします。その間に分岐命令の結果が判明するので、不要になったタスクを削除します。
- 遅延分岐
- 分岐するか(命令Aを行うか)どうかに無関係に実行できる命令を分岐以前に実行することにより、分岐命令が必要になる時間を遅らせ、その間に並行処理で分岐の条件判定をします。
レジスタの効果的利用
- レジスタ・リネーミング
- 命令の多くはレジスタの値の処理で、その値はレジスタ名で参照します。一つの処理の間に同じレジスタ名に多様な値が入ったり出たりするので、不必要な順序依存性が生じます。同時に実行する命令の数を増やすために,命令が参照するレジスタの名前を実行時に付け変える機能をレジスタ・リネーミングといいます。
- ベクトルレジスタ
- いくつかの同じ命令が連続しているとき、その情報をベクトルレジスタというレジスタに入れておき、並列実行することにより処理を高速化します。これを発展させれば、プログラムの繰返し部分を対象にすることもできます。部分的にこのような処理をすることは、パソコンにも取り込まれています。
処理すべきベクトルの長さがベクトルレジスタより長い場合,ベクトルレジスタ長の組に分割して処理を繰り返す方式をベクトル処理方式といい、これを重視したコンピュータをベクトルコンピュータといいます。大規模な科学技術計算に用いられています。
CISC/RISC
CPUは、命令の構成からCISC(Complex Instruction Set Computer)とRISC(Reduced Instruction Set Computer)に分類できます(実際のCPUは、両者の長所を部分的に取り込んでいます)。
| CISC | RISC |
命令セット |
複雑な機能を持つ多数の命令 |
単純な機能を持つ少数の命令 |
プログラムから 生成される命令数 |
複合した機能が1命令になるので 命令数は少ない |
単純な命令の組合せになるので、 命令数は多くなる |
命令の長さ |
可変長(長い) |
固定長(オペランド個数も少ない) |
演算装置での 計算回路 |
マイクロプログラム (ファームウェア) |
ワイヤードロジック (結線論理) |
パイプライン方式 の適用性 |
命令に要するクロック数が多様なので 採用しにくい |
クロック数が同じの命令が多いので 採用しやすい |
CISCは命令数が少ないことから高速化できますし、RISCは演算回路が単純なので高速化できます。そのため、どちらが高速であるかは、一概にはいえません。
歴史的には、CISCからRISCへと変化してきました。プログラムをアセンブラで作成した頃には、プログラム作成を容易にするため、コンピュータメーカーが演算回路(ファームウェア)による高速化を図っていたために、CISCが発展したのですが、あまりにも複雑になりました。コンパイラが広く用いられるようになり、プログラマは機械語を意識する必要がなくなったこと、演算回路を比較的単純な回路を適切に組み合わせるほうがむしろ高速になる場合があること、パイプラインなどの高速化技術を適用することなどのため、RISCの有効性がいわれるようになりました。
しかし、どちらも極端なのは不適切です。現在のコンピュータは、双方のよいどことりをしたような構成になっています。
VLIW(Very Long Instruction Word)
機械語命令に翻訳するときの最適化方式の一つです。パイプライン方式などの並行処理をしやすくするために、複数の機械語命令を語長の長い固定長の命令に生成する技術です。VLIWを発展させたものにEPIC(Explicitly Parallel Instruction Computing)があります。