このように1サイクルに2命令を並列にデコードし、実行可能なハードウェア構成としても、データ依存性や構造ハザードにより1命令しか実行できない場合があり、常に1サイクルに2命令を実行できるわけではない。プログラムの中でどのような命令が連続して並んでいるかに依存するのであるが、一般的に言って、2つの整数演算ユニットを持ち、2命令を並列にデコードするスーパスカラ方式のマシンでは、単純なスカラ実行の場合と比べて1.5倍くらいの性能向上が得られる。

しかし、このように複数の命令を並行してデコードする場合、命令長が固定のRISCアーキテクチャの場合は、2番目以降の命令の開始位置は固定であり、図6.2に示すように2番目の命令の位置は決まっているので、その次のサイクルでは、8バイト先からデコードすれば良い。

図6.2 固定長のRISC命令の2命令並列デコード

一方、命令長が可変のCISC命令の場合は、最初の命令をデコードしてその長さを知らないと次の命令の開始番地が分かず、次の命令のデコードができない。Intelのx86アーキテクチャでは最短の命令は8ビット(1バイト)であるが、メモリアドレスの指定がレジスタの内容+オフセットとなったり、さらに、各種のプレフィックスがついたりすると数十バイトまで命令の長さが変わってしまうので、次の命令の開始アドレスを見つけるのは容易ではない。

図6.3に示すように、CISCの場合は、2番目の命令のデコードは最初の命令をデコードして長さを知り、シフトを行ってデコーダに入力する必要がある。そして3番目の命令は前の2命令をデコードしてそれら命令の長さが分からないと開始番地が分からずシフトができない。

このようにCISCアーキテクチャのプロセサでは、前の命令から順に命令の長さを知ってシフトを行う必要があり、1サイクルに並列にデコードする命令の数が増えると、命令数に比例してデコード時間が長くなり、クロックサイクルタイムが延びてしまうという問題がある。

この問題をある程度回避するため、スーパスカラ方式を採用したPentium以降のIntelプロセサは、出現頻度が高く、かつ、デコードが容易な命令は並列にデコードを行うが、それ以外の複雑な命令に出会うと、並列デコード数の制限内であってもそこでデコードを打ち切り、複雑な命令は次のサイクルに廻すというような処理を行っている。

図6.3 可変長のCISC命令の2命令並列デコード

また、RISC、CISCに拘わらず、同一サイクルに発行する命令間のデータ依存性のチェックや使用資源の競合のチェックなどは、本質的にシリアルに処理する必要があるので、複数命令の並列デコードは、クロックサイクルタイムに対するプレッシャーになる。

並列度を2から3、4と増やすとそれなりに性能は向上するのであるが、演算器を追加する必要が出るのと、データ依存性により並列に実行できないケースが増える。さらに依存性チェックが複雑になりクロックサイクルタイム的にも厳しくなるので、性能の向上度合いは飽和する傾向にある。このため、次回で述べるアウトオブオーダ実行を行わない単純なスーパスカラマシンでは、2命令並列というものが一般的である。