用語

CPU高速化技術の基本の一つ「スーパースカラー」

コンピュータの性能を上げるための技術にはいくつかの手法がありますが、基本的な思想は2つ、または3つぐらいにまとめられます。

1つは単純に動作クロックを上げること。命令を処理する回路の動作自体を高速化することです。

2つめは命令を処理する際の並列度を上げること。複数の命令を同時並行で処理してトータルの処理性能を稼ぐ方法です。

この2つはどんなケースでも大体有効で、一部制限もありますがコンピュータの性能を上げるためにはとても有効に使える技術です。現存するCPUでこれらの発想を使っていない製品はありません。

3つめはちょっと使える条件が限定されますが、ハマれば最上級の効果を発揮する手法です。多数のデータを1回の命令実行でまとめて処理してしまう、というもので膨大な数値演算を行なうスーパーコンピュータには欠かせない技術です。

今回説明する「スーパースカラー」はこのうち2つめに属するタイプの技術で、最新のコンピュータには必須の技術になっています。

複数の命令を同時に実行する

スーパースカラーの概念をごく単純にザックリとまとめると見出しの通り、「1つのCPUコアで複数の命令を同時に処理する」、ということになります。

ごくごく簡単に図にするとこんな感じのイメージになります。

1度に複数の命令を読み込んで解釈、同時に実行して結果を出力します。

もう少しだけ詳しく中身を模式的に表現してみましょう。

スーパースカラーなしのシンプルなCPUではこんなイメージの機能を持っています。1命令ずつプログラムを読み込んで解釈、処理内容に従って実行していきます。

デコード処理の後ろにこの例だと4つ矢印が並んでいますが全部がいっぺんに動くわけではなく、4つのうちいずれか1つが実行されるという意味になります。

2重化されたスーパースカラーだとこれを2セット持つ形になりそうですが、それだといろいろと無駄が多いので実際にはフェッチやデコードのユニットは1つにまとめられていて、同時に2命令を処理出来る作りになっています。

実行ユニットもどちらかの系統専用ではなく、かなりフレキシブルに使える作りです。

実際のプログラムの中ではよく使われる命令と比較的出現率が低い命令があります。これに合わせて命令の実行ユニットは整理されていて、2重化されたスーパースカラーCPUでもまるまる2倍の実行ユニットを備えているわけではありません。

そのあたりの実装はCPUの設計によって少しずつ異なりますが、こんな風によく使われる命令と使われにくい命令を処理する実行ユニットの数の調整が行なわれています。

パイプラインとも組み合わせ可能

スーパースカラーとパイプラインの仕組みはどちらかだけしか使えないようなものではなく、今のCPUでは両方の方式を一緒に採用するのが普通になっています。

そういった場合には2重のスーパースカラーの場合、命令の処理が進むイメージはこんな感じになるでしょうか。

パイプラインそれぞれが「複線化」されると考えるとわかりやすいかもしれません。

スーパースカラーの限界

スーパースカラーの仕組みを使って同時に最大2つの命令を処理出来るようなCPUの作りにしても、実際には平均すると同時に実行出来る命令の数は1.6程度に留まるとされています。

これは実際のプログラムの構造的に完全にすべての命令を並行して実行することは出来ない制限が出てくるからです。

その制約のひとつは直前の処理の結果をその後の命令で使う、というものです。

上の式では「=」記号を「代入」の意味で使っています。

この処理では2番目の計算を行なうには、1つめの計算が終わっていないとけません。2つの処理をいっぺんに実行出来る仕組みがあっても、この2つの計算は順番に1つ1つ処理を行なわないといけません。

また、条件によって処理の内容を変えなければいけない場合には、条件の判定を行なうまで次に行なう処理の内容が分りません。この場合にも次の命令を並列処理出来ません。

つまりこういったケースでは、スーパースカラーの仕組みがあっても処理が速くなりません。

これらはパイプラインなどでも同様に並列処理が行えないパターンで、いろいろな仕組みで並列処理を行なおうとするときの共通の限界点になります。

ですが、こういった限界点を少しでも解消するための技術もいろいろと工夫され続けています。

依存関係のある命令を後回しにして、先に処理出来る分を順番を入れ替えて実行する仕組みの「アウトオブオーダー実行」とか、条件分岐で分岐する先をプログラムの傾向から予想する「分岐予測」、分岐先全部を予備的に実行しておく「投機実行」といったいくつもの技術が開発されています。

それぞれ、より詳しい説明はまた機会があれば別記事にまとめましょう。

今の最新CPUの実際

インテルのCoreプロセッサやAMDのRyzenプロセッサといった最新のCPUでは、パイプラン、スーパースカラーといった高速化のための仕組みをフル活用することで、1コアで1クロックあたり平均3命令以上を同時に処理出来る能力を持つようになっています。

クロックの高速化などとも合わせ、CPUが生まれた時とは比べものにならない性能を持つようになっています。今どきのハイエンドCPUはx86 CPUの始祖様i8086と比べると、数万倍以上の性能があるはずです。