複雑命令セットコンピュータ(CISC / ˈ s ɪ s k /)は、単一の命令で複数の低レベル操作(メモリからのロード、算術演算、メモリストアなど)を実行したり、単一の命令内でマルチステップ操作やアドレッシングモードを実行できるコンピュータアーキテクチャです。[ 1 ]この用語は、縮小命令セットコンピュータ(RISC)[ 2 ]と対比して後付けで作られたもので、 RISC ではないすべてのものを包括する用語のような存在になっています。[ 3 ] RISCアーキテクチャの最も一般的な差別化要因のいくつかは、均一な命令長と厳密に分離されたメモリアクセス命令です。
CISC アーキテクチャの例としては、複雑なメインフレーム コンピュータから、メモリのロードおよびストア操作が算術命令から分離されていない単純なマイクロコントローラまでが挙げられます。[ 4 ]後付けで CISC とラベル付けされた特定の命令セット アーキテクチャには、 System/360からz/Architecture、PDP-11およびVAXアーキテクチャ、その他多数があります。多くの学術出版物で CISC とラベル付けされている有名なマイクロプロセッサおよびマイクロコントローラには、 Motorola 6800、6809 、および68000ファミリ、Intel 8080、iAPX 432、x86、および8051ファミリ、Zilog Z80、Z8、およびZ8000ファミリ、National Semiconductor NS320xxファミリ、MOS Technology 6502ファミリなどがあります。[5]
一部の設計は、一部の論者によって境界事例とみなされてきた。例えば、マイクロチップ・テクノロジー社のPICは、ある界隈ではRISCに分類され、別の界隈ではCISCに分類されている。
RISC の理念が広く知られるようになる以前、多くのコンピュータ設計者は、いわゆるセマンティックギャップを埋めようと試みました。つまり、プロシージャ呼び出し、ループ制御、複雑なアドレッシングモードなどの高レベルプログラミング構造を直接サポートする命令セットを設計し、データ構造や配列へのアクセスを単一の命令にまとめようとしたのです。命令は通常、コード密度をさらに高めるために高度にエンコードされています。このような命令セットのコンパクトさにより、プログラムサイズが小さくなり、メインメモリへのアクセス回数(多くの場合、低速でした)が減り、当時(1960 年代初頭以降)はコンピュータのメモリとディスクストレージのコストを大幅に削減し、実行速度も向上しました。また、FortranやAlgolなどの高レベル言語が常に利用可能であったり適切であったりするとは限らなかったため、アセンブリ言語でも優れたプログラミング生産性を実現できました。実際、このカテゴリのマイクロプロセッサは、特定の種類の重要なアプリケーションでは今でもアセンブリ言語でプログラミングされることがあります。[ 6 ]
1970年代、高級言語の分析により、コンパイラが複雑な機械語を生成していることが明らかになった。新しい命令によってパフォーマンスを向上させることができると判断された。アセンブリ言語では使用を想定していなかったものの、コンパイルされた高級言語には適した命令がいくつか追加された。コンパイラはこれらの命令を活用するように更新された。意味的に豊富な命令とコンパクトなエンコーディングの利点は、現代のプロセッサ、特にキャッシュが中心的な役割を果たす高性能分野(ほとんどの組み込みシステムとは対照的)でも見られる。これは、高速ではあるものの複雑で高価なこれらのメモリは本質的にサイズが限られているため、コンパクトなコードが有利になるためである。
多くの設計では、より高いスループットを低コストで実現し、より少ない命令で高水準言語の構造を表現できるという目標を達成しましたが、必ずしもそうとは限りませんでした。例えば、複雑なアーキテクチャのローエンド版(つまり、使用するハードウェアが少ないバージョン)では、複雑な命令(プロシージャ呼び出しやエンター命令など)を使用せず、より単純な命令のシーケンスを使用することでパフォーマンスを向上させることが可能になる場合がありました。
その理由の一つは、アーキテクト(マイクロコード作成者)がアセンブリ言語命令を「過剰設計」し、利用可能な基本ハードウェアでは効率的に実装できない機能を含めてしまうことがあったためです。例えば、あまり使用されないレジスタやメモリ位置を設定するなど、「副作用」(従来のフラグによる処理とは別のもの)が発生する可能性がありました。これを通常の(重複のない)内部バス、あるいは外部バス経由で行うと、毎回余分なサイクルが必要となり、非常に非効率になります。
バランスの取れた高性能設計であっても、高度に符号化された(比較的)高レベルの命令は、限られたトランジスタ数の中で効率的にデコードおよび実行することが困難になる場合があった。そのため、このようなアーキテクチャでは、デコードテーブルやマイクロコードシーケンスに基づく、より単純だが(一般的に)低速なソリューションが適さない場合、プロセッサ設計者は多大な労力を費やす必要があった。トランジスタをはじめとする部品が限られた資源であった時代においては、これは部品点数の減少と、他の種類の性能最適化の機会の減少にもつながった。
多くの(ただし全てではない)CISCプロセッサにおいて、マイクロコードによって定義された動作を実行する回路は、それ自体がプロセッサであり、その構造は多くの点で初期のCPU設計を彷彿とさせる。1970年代初頭、このことが、シーケンス処理やデコード処理のために(当時としては比較的大きく高価だった)ROMテーブルやPLA構造を用いずに済むように、よりシンプルなプロセッサ設計に戻るというアイデアを生み出した。
初期の(後付けでRISCとラベル付けされた)プロセッサ(IBM 801 – IBMワトソン研究所、1970年代半ば)は、もともとCISC設計の内部マイクロコードカーネルまたはエンジンとして使用することを意図した、密にパイプライン化された単純なマシンでしたが、RISCの概念をより多くの人々に紹介したプロセッサにもなりました。目に見える命令セットの単純さと規則性により、マシンコードレベル(つまりコンパイラが見るレベル)でのプロセッサステージの重複(パイプライン処理)の実装が容易になります。しかし、そのレベルでのパイプライン処理は、当時実現可能な限られたコンポーネント数と配線の複雑さの中で実装する複雑さにもかかわらず、命令サイクル時間を短縮するために、すでに一部の高性能CISC「スーパーコンピュータ」で使用されていました。一方、CISCプロセッサの内部マイクロコード実行は、特定の設計に応じてパイプライン化の度合いが異なり、したがってRISCプロセッサの基本構造と多かれ少なかれ類似していました。
1965年に初めて納入されたスーパーコンピュータCDC 6600は、後世になってRISCと呼ばれるようになった。[ 7 ] [ 8 ] ロードストアアーキテクチャを採用しており、プログラマの制御下で最大5つのロードと2つのストアを同時に実行できた。また、複数の機能ユニットが同時に動作できた。
より現代的な文脈では、典型的な CISC アーキテクチャの一部で使用される複雑な可変長エンコーディングにより、CISC プログラミング モデルのスーパースカラ実装を直接構築することは複雑ではあるものの、依然として実現可能です。順序通りのスーパースカラである初代Pentiumと、順序外のスーパースカラであるCyrix 6x86 は、この例としてよく知られています。典型的な CISC マシンのオペランドに対する頻繁なメモリ アクセスは、コードから抽出できる命令レベルの並列性を制限する可能性がありますが、これは現代の設計で使用される高速キャッシュ構造やその他の対策によって大きく緩和されます。本質的にコンパクトで意味的に豊富な命令のため、マシン コード ユニット (つまりバイトまたはビットごと) あたりに実行される平均作業量は RISC プロセッサよりも CISC プロセッサの方が高く、これが現代のキャッシュ ベースの実装において大きな利点となる可能性があります。
ロジック、PLA、マイクロコード用のトランジスタはもはや希少なリソースではありません。現在、トランジスタの最大数によって制限されているのは、大容量の高速キャッシュメモリだけです。CISCデコーダのトランジスタ数は複雑ですが、プロセッサあたりのトランジスタ総数(大部分はキャッシュに使用)のように指数関数的に増加するわけではありません。より優れたツールと強化されたテクノロジーと相まって、これにより、ロードストア制限のない(つまり非RISCの)高度にエンコードされた可変長設計の新しい実装が実現しました。これは、ユビキタスなx86(下記参照)などの古いアーキテクチャの再実装や、組み込みシステム用マイクロコントローラの新しい設計、および同様の用途を規定しています。最新のx86の場合のスーパースカラの複雑さは、命令を1つ以上のマイクロオペレーションに変換し、それらのマイクロオペレーションを動的に発行することによって解決されました。つまり、間接的かつ動的なスーパースカラ実行です。Pentium ProとAMD K5は、この初期の例です。これにより、比較的シンプルなスーパースカラ設計を(かなり複雑な)デコーダ(およびバッファ)の後段に配置することが可能になり、いわば両方の利点を多くの点で享受できる。この手法は、IBM z196以降のz/Architectureマイクロプロセッサでも採用されている。
1980年代半ばまでに、コンピュータ業界ではRISCの方がCISCよりも効率的であるというコンセンサスが確立された。Digital Equipment Corporationは、RISCの価格性能比はせいぜいCISCの半分程度だと推定した。CISCベンダーからの考えられる2つの反応は以下のとおりである。[ 9 ]
Intel は x86 を RISC のパフォーマンスに匹敵するように改良することに成功しました。[ 10 ] CISC と RISC の設計と実装が継続的に進化するにつれて、CISC と RISC という用語はあまり意味を持たなくなってきました。Intel、AMD、Cyrix、IBM の最初の高度に (または密に) パイプライン化された x86 実装である 486 設計は、前身のすべての命令をサポートしていましたが、典型的な RISC 命令セットよりわずかに多い (つまり、典型的な RISC のロード ストア制限がない)かなり単純な x86 サブセットでのみ最大の効率を達成しました。 [ 5 ] Intel P5 Pentium世代は、これらの原則のスーパースカラ バージョンでした。しかし、最新の x86 プロセッサは、(通常) 命令をデコードして内部でバッファリングされたマイクロ操作の動的なシーケンスに分割し、パイプライン (オーバーラップ) 方式でより大きなサブセットの命令を実行するのに役立ち、コード ストリームからより高度な並列性を抽出することを容易にして、さらに高いパフォーマンスを実現します。
一般的な単純化(一部の学術テキストにも見られる)とは異なり、すべての CISC がマイクロコード化されている、あるいは「複雑な」命令を持っているわけではありません。[ 11 ] CISC はロードストア (RISC) アーキテクチャ以外のすべてを意味する包括的な用語になったため、CISC を定義するのは命令の数でも、実装や命令の複雑さでもなく、算術命令がメモリへのアクセスも実行することです。[ 12 ]小さな 8 ビット CISC プロセッサと比較すると、RISC 浮動小数点命令は複雑です。CISC は複雑なアドレッシング モードを持つ必要さえありません。32 ビットまたは 64 ビットの RISC プロセッサは、小さな 8 ビット CISC プロセッサよりも複雑なアドレッシング モードを持つ可能性があります。
PDP -10、PDP-8、x86プロセッサ、Intel 4004、Motorola 68000シリーズプロセッサ、IBM Zメインフレーム、Burroughs B5000、VAX、Zilog Z80000、およびMOS Technology 6502は、命令の数、サイズ、形式、レジスタの数、タイプ、サイズ、および使用可能なデータ型において大きく異なります。一部は部分文字列のスキャン、任意精度BCD演算、超越関数などの操作をハードウェアでサポートしていますが、他のものは8ビットの加算と減算しかサポートしていません。しかし、これらはすべてCISCカテゴリ[ 13 ]に属します。これは、実際の計算を実行する同じ命令内でメモリの内容をロードおよび/またはストアする「ロード操作」命令を持っているためです。例えば、固定長命令が 8 つしかなく、マイクロコードがまったくない PDP-8 は、命令の動作方法から CISC であり、230 を超える命令 (一部の VAX よりも多い) を持ち、レジスタのリネーミングやリオーダー バッファなどの複雑な内部構造を持つ実装がいくつかある PowerPCは RISC であり、Minimal CISCは 8 つの命令しか持たないが、メモリ アクセスと計算を同じ命令に組み合わせているため明らかに CISC である。[ 14 ]