スーパースカラー

スーパースカラー(superscalar，スーパースケーラ)とは、プロセッサのマイクロアーキテクチャにおける用語で、複数の命令を同時にフェッチし、複数の同種のあるいは異種の実行ユニットを並列に動作させ、プログラムの持つ命令レベルの並列性を利用して性能の向上を図るアーキテクチャである。 スーパースカラプロセッサは、単一のプロセッサ内で命令レベルの並列性と呼ばれる、ある一種の並列処理の形式を実装するCPUである。クロックサイクル毎に最大で1つの命令しか実行できないスカラプロセッサとは対照的に、スーパースカラプロセッサは、プロセッサ上の複数の異なる実行ユニットに複数の命令を同時にディスパッチすることにより、1クロックサイクル中に複数の命令を実行できる。したがって、既定のクロックレートで(普通)可能なスループットよりも多くのスループット（単位時間のうちに実行できる命令の数）が可能になる。各実行ユニットは、個別のプロセッサ（あるいはマルチコアプロセッサの場合個別のコア）ではなく、単一CPU内の算術論理演算ユニットなどのような実行リソースである。 1965年のシーモア・クレイが設計したCDC 6600が、最初のスーパースカラー設計のマシンと言われている。 商用のシングルチップのスーパースカラーマイクロプロセッサは、Intel i960CA（1988年）と AMD 29000シリーズの 29050 (1990年）が最初である。RISC型CPUの設計ではコアが単純であったため、当時の設計ルールの細かさでもワンチップに複数の実行ユニット（ALUなど）を搭載でき、スーパースカラーを実現できたのである。このため、1980年代から1990年代にかけての時期に RISC が CISC に対して性能的に優位に立った。一部の低消費電力の組み込み向けプロセッサを除いて、1998年以降に開発された汎用プロセッサは基本的に全てスーパースカラーである。 現在パーソナルコンピュータでデファクトスタンダードとなっているx86アーキテクチャでは、1993年のPentiumで2実行ユニットのインオーダ実行型のスーパースカラーを実現し、その後の"P6"（Pentium Pro と Pentium II）以降で3実行ユニットのアウトオブオーダ実行型スーパースカラーに発展した。2008年現在のIA-32アーキテクチャは単一コア当り5実行ユニットのアウトオブオーダ実行型スーパースカラーで、平均IPCは3以上を達成している。 最も単純なプロセッサアーキテクチャをスカラープロセッサと呼ぶ。スカラープロセッサでは、各命令で1つか2つのデータを一度に扱う。一方、ベクタープロセッサでは同時に多数のデータを扱う。これは数学におけるスカラーとベクトルの違いに似ている。スーパースカラープロセッサはこれらの中間と言える。各命令は1つのデータを扱うが、CPU内に複数の実行ユニットがあるため、それぞれ別のデータを扱う複数の命令を同時並列的に実行可能となる。 スーパースカラーCPUの設計では、複数存在する実行ユニットを常に働かせておくために、命令の分配機構が重要である。実装される実行ユニット数が増えるにつれ、その重要性は増している。初期のスーパースカラー型CPUには、2つのALUと1つのFPUが搭載されていたが、最近の PowerPC 970 では4つのALUと2つのFPUと2つのSIMDユニットが搭載されている。分配機構が効率的でない場合、これらの実行ユニットに連続して命令を供給することができず、システムの性能は全体として低くなる。 スーパースカラープロセッサの実行効率はサイクル当たりの実行命令数で表される。ただし、サイクル当たりの実行命令数が大きいからといって、常にスーパースカラーだとは限らない。パイプライン型CPUやマルチコアCPUも同様の性能を示すが、方式は異なる。 スーパースカラー型CPUでは、分配機構がメモリから命令群を読み込み、そこから並列に実行できる命令を選択し、実行ユニット群にそれらを供給する。従って、スーパースカラープロセッサはパイプラインが複数あって、各パイプラインが1つの命令スレッドを実行していると見なすこともできる。 スーパースカラー技法による性能向上は、以下の2つによって制限される。 命令列の本質的な並列性の度合い。つまり、命令レベルの並列性の制約。 命令間の依存関係チェックロジックと分配機構が命令選択にかけられる時間の制約と機構自体の複雑さ。 既存のバイナリの実行プログラムの持つ並列性にはばらつきがある。ものによっては命令間の依存が全く無く、常に並列に実行可能なこともある。逆に依存関係が多く、並列性がほとんどない場合もある。例えば、a = b + c; d = e + f という命令列は依存関係がないため、並列に実行可能である。しかし、a = b + c; b = e + f という命令列は依存関係があるため、並列に実行することはできない。 同時に実行可能な命令数が増えると、依存関係をチェックするコストも急激に増大する。また、そのチェックをCPUのクロックに合わせて実行時に行わなければならないという事実が事態をさらに悪化させる。研究によれば、命令の種類を n、同時実行可能な命令数を k としたとき、依存関係チェックの回路規模は n k {\displaystyle n^{k}} 、時間は k 2 log ⁡ n {\displaystyle k^{2}\log n} かかるとされている。数学的には、この問題は順列における組合せ数学の問題である。 たとえ命令列に依存関係がないとしても、スーパースカラー型CPUは常に依存関係のチェックを行う。さもなくば、依存関係の検出に失敗し、不正な結果を得ることになる。 半導体プロセス技術がどれだけ進化して、スイッチ速度が高速化しても、以上のような問題によって同時に実行可能な実際の命令数には限界が生じる。プロセス技術の進化によって実行ユニット（ALUなど）の数が増えても、依存関係チェックのための論理回路の規模の増大が急激であるため、実現可能な規模は制限される。また、たとえ依存関係チェックを無限に素早く実行できたとしても、命令列の本質的な並列性によって性能向上に限界が生じる。 このような限界があることから、他の性能向上技法の探求が行われた。例えば、VLIW、EPICアーキテクチャ、同時マルチスレッディング (SMT)、マルチコアなどである。 VLIW では、依存関係チェックを実行時にハードウェアで行うのではなく、コンパイラで行う。スーパースカラー設計では数ナノ秒で行わなければならないが、コンパイラではその制限はない。また、マルチコアとマルチスレッド・コンパイラの組合せでも同様である。EPICアーキテクチャも VLIW に似ている。 同時マルチスレッディング (SMT) はスーパースカラー型CPUの全体効率を向上させる技法である。SMT では複数の独立したスレッドを同時に実行することで、実行ユニットの稼働効率を向上させる。 マルチコアCPUは、個々のコアが1つのスレッドを実行する独立したプロセッサとなっている（通常、キャッシュを共有している）。 これらの技法は排他的なものではない。従って、マルチコアCPUの各コアがスーパースカラーであっても構わない。 ^ "super-scalar organization in which multiple execution units operate essentially independently." AMD. (2020). Software Optimization Guide for AMD EPYC™ 7003 Processors. rev. 3.00. アウト・オブ・オーダー実行 投機的実行/積極的実行 EPICアーキテクチャ スーパーパイプライン 同時マルチスレッディング パイプライン処理 マイク・ジョンソン著、村上和彰監訳、『スーパスカラ・プロセッサ- マイクロプロセッサ設計における定量的アプローチ -』、日経BP社、ISBN 4-8227-1002-5 （原著 Mike Johnson, Superscalar Microprocessor Design, Prentice-Hall, 1991, ISBN 0-13-875634-1） Sorin Cotofana, Stamatis Vassiliadis, "On the Design Complexity of the Issue Logic of Superscalar Machines", EUROMICRO 1998: 10277-10284 Steven McGeady, "The 1960CA SuperScalar Implementation of the 80960 Architecture", IEEE 1990, pp. 232-240 Steven McGeady, et al., "Performance Enhancements in the Superscalar i960MM Embedded Microprocessor," ACM Proceedings of the 1991 Conference on Computer Architecture (Compcon), 1991, pp. 4-7 Eager Execution / Dual Path / Multiple Path by Mark Smotherman