超長命令語(VLIW )は、どの命令を並列実行するかを事前に明示的に指定することで、命令レベル並列性(ILP) を活用するように設計された 命令セットアーキテクチャの一種です 。
VLIWアーキテクチャは、ILPを活用する主流のアプローチであるスーパースカラアーキテクチャとは対照的です。スーパースカラアーキテクチャでは、ハードウェアが実行時に並列実行を動的に検出してスケジューリングします。VLIWの主な目的は、スーパースカラ設計のようなハードウェアの複雑さを伴わずに、より高いパフォーマンスを実現することです。実行時に命令ストリームを繰り返し解析し、並列実行をスケジューリングするために必要な回路は、チップ面積、コスト、消費電力を増加させるだけでなく、クロック速度を低下させる可能性もあります。
VLIWという名称は、ほぼすべての実装で採用されている命令フォーマットに由来する。このフォーマットでは、コンパイラが同時に実行されることを想定した操作を、単一のワイド命令ワードにまとめて、実行ユニットに一括してディスパッチする。これらのワードは非常にワイドになる場合があり、1キロビット以上の命令ワードを使用する実装もある。しかし、これはVLIWを実装する自然な方法の副産物に過ぎない。VLIWの際立った特徴は、正確な実行順序と並列性が事前に検出され、指定される点にある。
VLIWは並列性の識別という負担をハードウェアからコンパイラに移します。これにより、コンパイラの複雑さは大幅に増大します。コンパイラは、命令の正当性を確保しながら、実行ユニット、レジスタ、メモリポートなどのリソース競合を解決し、よりシンプルなVLIWハードウェアによって実現される高い並列性を活用する必要があるからです。
VLIWアーキテクチャの概念とVLIWという用語は、 1980年代初頭にイェール大学の研究グループでジョシュ・フィッシャーによって考案されました。 [ 1 ] VLIWのコンパイル方法としてのトレーススケジューリングの彼の最初の開発は、彼がニューヨーク大学の大学院生だったときに行われました。VLIW以前は、ソフトウェアにおける実行ユニットの事前スケジューリングと命令レベルの並列性の概念は、水平マイクロコードの開発の実践において十分に確立されていました。
フィッシャーの革新的な取り組みは、通常のプログラミング言語で書かれたプログラムから水平方向のマイクロコードをターゲットにできるコンパイラの開発にありました。彼は、優れたパフォーマンスを実現し、幅広いマシンに対応するためには、基本ブロック内の並列性を超えた並列性を見つける必要があると認識していました。また、基本ブロックを超えた並列性を特定するための領域スケジューリング手法も開発しました。トレーススケジューリングはそのような手法の一つで、まず基本ブロックの最も可能性の高いパスをスケジューリングし、投機的な動作に対処するための補償コードを挿入し、次に可能性の高いトレースをスケジューリングするなど、スケジューリングが完了するまでこのプロセスを繰り返します。
フィッシャーの2つ目の革新は、ターゲットとなるCPUアーキテクチャはコンパイラにとって適切なターゲットとなるように設計されるべきであり、VLIWプロセッサのコンパイラとアーキテクチャは共同設計されなければならないという考え方でした。これは、イェール大学でフィッシャーが、Floating Point Systems社のFPS164のようなアーキテクチャのコンパイルに苦労した経験に一部触発されたものです。FPS164は、命令の開始と結果を保存する命令を分離する複雑な命令セット演算(CISC)アーキテクチャを採用しており、非常に複雑なスケジューリングアルゴリズムを必要としていました。フィッシャーは、自己ドレイン型パイプライン、ワイドマルチポートレジスタファイル、メモリアーキテクチャなど、適切なVLIW設計を特徴づける一連の原則を開発しました。これらの原則により、コンパイラは高速なコードを生成しやすくなりました。
最初のVLIWコンパイラは、ジョン・エリスがフィッシャーの指導の下で執筆した博士論文の中で記述された。コンパイラはイェール大学のマスコットにちなんでブルドッグと名付けられた。[ 2 ]
フィッシャーは1984年にイェール大学を離れ、共同創業者であるジョン・オドネルとジョン・ラッテンバーグと共に、スタートアップ企業であるマルチフロー社を設立した。マルチフロー社はVLIWミニスーパーコンピュータのTRACEシリーズを製造し、1987年に最初のマシンを出荷した。マルチフロー社のVLIWは、1命令あたり28個の演算を並列に実行できた。TRACEシステムは、中規模集積回路(MSI)、大規模集積回路(LSI)、超大規模集積回路(VLSI)を組み合わせた技術で実装され、キャビネットに収められていたが、プロセッサのすべてのコンポーネント(メモリを除く)を1つのチップに統合する方がコスト効率が良くなるにつれて、この技術は時代遅れになっていった。
マルチフローは、チップアーキテクチャがマルチイシューCPUを可能にするようになった次の波に乗るには時期尚早だった。しかし、大手半導体企業はこの状況におけるマルチフロー技術の価値を認識し、その後、コンパイラとアーキテクチャはこれらの企業のほとんどにライセンス供与された。
命令を一つずつ順番に実行するプロセッサ(つまり、パイプライン化されていないスカラーアーキテクチャ)は、プロセッサのリソースを非効率的に使用し、パフォーマンスが低下する可能性があります。パフォーマンスは、連続する命令の異なるサブステップを同時に実行すること(パイプライン処理と呼ばれる)や、スーパースカラーアーキテクチャのように複数の命令を完全に同時に実行することによって改善できます。さらに、プログラム内で命令が出現する順序とは異なる順序で命令を実行すること(アウトオブオーダー実行と呼ばれる)によって、パフォーマンスをさらに向上させることができます。[ 3 ]
これら3つの方法はすべてハードウェアの複雑さを増大させます。プロセッサは並列処理を実行する前に、命令間に依存関係がないことを検証する必要があります。例えば、最初の命令の結果が2番目の命令の入力として使用される場合、両方の命令を同時に実行することはできず、2番目の命令は最初の命令より先に実行することもできません。最新のアウトオブオーダープロセッサは、命令のスケジューリングと依存関係の判定を行うためのハードウェアリソースを増強しています。
対照的に、VLIW はプログラムのコンパイル時に決定される固定スケジュールに基づいて並列に演算を実行します。演算の実行順序 (どの演算を同時に実行できるかを含む) の決定はコンパイラによって処理されるため、プロセッサは、上述の 3 つの方法で必要とされるスケジューリング ハードウェアを必要としません。したがって、VLIW CPU は、ほとんどのスーパースカラ CPU よりもハードウェアの複雑さが少なく (ただしコンパイラの複雑さは大きい)、より多くの演算を提供します。[ 3 ]これは、可能な限り多くの計算をプログラムの実行前にコンパイル時に行うべきであるという考え方とも相補的です。
スーパースカラ設計では、実行ユニットの数は命令セットからは見えません。各命令は1つの操作のみを符号化します。ほとんどのスーパースカラ設計では、命令幅は32ビット以下です。
対照的に、VLIW命令は複数の操作をエンコードし、デバイスの各実行ユニットに対して少なくとも1つの操作をエンコードします。たとえば、VLIWデバイスに5つの実行ユニットがある場合、そのデバイス用のVLIW命令には5つの操作フィールドがあり、各フィールドは対応する実行ユニットで実行すべき操作を指定します。これらの操作フィールドに対応するため、VLIW命令は通常64ビット以上の幅を持ち、アーキテクチャによってはそれよりもはるかに広い幅を持つ場合があります。
例えば、以下はスーパーハーバードアーキテクチャシングルチップコンピュータ(SHARC)の命令です。1サイクルで、浮動小数点乗算、浮動小数点加算、および2回の自動インクリメントロードを実行します。これらすべてが1つの48ビット命令に収まります。
f12 = f0 * f4, f8 = f8 + f12, f0 = dm(i0, m3), f4 = pm(i8, m9);
Since the earliest days of computer architecture,[4] some CPUs have added several arithmetic logic units (ALUs) to run in parallel. Superscalar CPUs use hardware to decide which operations can run in parallel at runtime, while VLIW CPUs use software (the compiler) to decide which operations can run in parallel in advance. Because the complexity of instruction scheduling is moved into the compiler, complexity of hardware can be reduced substantially.
A similar problem occurs when the result of a parallelizable instruction is used as input for a branch. Most modern CPUs guess which branch will be taken even before the calculation is complete, so that they can load the instructions for the branch, or (in some architectures) even start to compute them speculatively. If the CPU guesses wrong, all of these instructions and their context need to be flushed and the correct ones loaded, which takes time.
This has led to increasingly complex instruction-dispatch logic that attempts to guess correctly, and the simplicity of the original reduced instruction set computing (RISC) designs has been eroded. VLIW lacks this logic, and thus lacks its energy use, possible design defects, and other negative aspects.
In a VLIW, the compiler uses heuristics or profile information to guess the direction of a branch. This allows it to move and preschedule operations speculatively before the branch is taken, favoring the most likely path it expects through the branch. If the branch takes an unexpected way, the compiler has already generated compensating code to discard speculative results to preserve program semantics.
Vector processor cores (designed for large one-dimensional arrays of data called vectors) can be combined with the VLIW architecture such as in the Fujitsu FR-V microprocessor, further increasing throughput and speed.
Cydrome was a company producing VLIW numeric processors using emitter-coupled logic (ECL) integrated circuits in the same timeframe (late 1980s). This company, like Multiflow, failed after a few years.
One of the licensees of the Multiflow technology is Hewlett-Packard, which Josh Fisher joined after Multiflow's demise. Bob Rau, founder of Cydrome, also joined HP after Cydrome failed. These two would lead computer architecture research at Hewlett-Packard during the 1990s.
上記のシステムに加えて、同時期(1989~1990年)に、インテルは初の64ビットマイクロプロセッサであり、1つのチップ上にVLIWを実装した最初のプロセッサであるIntel i860にVLIWを実装しました。[ 5 ]このプロセッサは、シンプルなRISCモードとVLIWモードの両方で動作できました。
1990年代初頭、インテルはi860 RISCマイクロプロセッサを発表しました。このシンプルなチップには、スカラーモードとVLIWモードの2つの動作モードがありました。VLIWモードでは、プロセッサは常に2つの命令をフェッチし、1つは整数命令、もう1つは浮動小数点命令であると想定していました。[ 5 ]
i860のVLIWモードは、組み込みデジタル信号プロセッサ(DSP)アプリケーションで広く使用されました。これは、アプリケーションの実行とデータセットがシンプルで、順序が明確かつ予測可能であったため、設計者がVLIWによって実現される並列実行の利点を最大限に活用できたからです。VLIWモードでは、i860は20~40倍精度MFLOPSの浮動小数点演算性能を維持することができました。これは、当時としては、また25~50MHzで動作するプロセッサとしては非常に高い値でした。
1990年代、ヒューレット・パッカードは、 PA-RISCプロセッサファミリーの開発作業の副産物として、この問題の研究に着手した。その結果、CPUから複雑なディスパッチロジックを取り除き、コンパイラに組み込むことで、CPUを大幅に簡素化できることが分かった。当時のコンパイラは1980年代のものよりもはるかに複雑だったため、コンパイラの複雑さが増すことは、わずかなコストとみなされた。
VLIW CPUは通常、独立して動作する複数のRISCライクな実行ユニットで構成されています。後期のVLIWは通常、4~8個のメイン実行ユニットを備えています。コンパイラは、従来のCPUとほぼ同じ方法でVLIW CPUの初期命令シーケンスを生成し、RISCライクな命令のシーケンスを生成します。コンパイラはこのコードを解析して依存関係とリソース要件を調べます。そして、これらの制約に従って命令をスケジュールします。このプロセスでは、独立した命令を並列にスケジュールできます。VLIWは通常、並列にスケジュールされた命令を、個々の命令を組み込んだより長い命令語で表現するため、特定のサイクルで実行される内容を指定するオペコードが非常に長くなります(非常に長いオペコードと呼ばれます)。
VLIW CPUの例としては、 NXP(旧フィリップスセミコンダクターズ)のTriMediaメディアプロセッサ、アナログデバイセズのスーパーハーバードアーキテクチャシングルチップコンピュータ(SHARC)DSP、 Lxアーキテクチャに基づくSTマイクロエレクトロニクスのST200ファミリー(ジョシュ・フィッシャーのHPラボでパオロ・ファラボスキが設計)、富士通のFR-V 、ピクセルワークスのBSP15/16 [ 6 ]、CEVAのCEVA-X DSP 、インプロブシステムズのJazz DSP、シリコンハイブのHiveFlex [ 7 ]シリーズ、カルレイのMPPA Manycoreファミリーなどがある。テキサスインスツルメンツのTMS320 DSPラインは、 C6000ファミリーで進化し、以前のC5000ファミリーとは対照的に、よりVLIWのように見えるようになった。1つ以上のクアルコムヘキサゴンが携帯電話の設計に使用された。これらのVLIW CPUは、主に民生用電子機器向けの組み込みメディアプロセッサとして使用されています。
VLIWの機能は、システムオンチップ(SoC)設計向けの構成可能なプロセッサコアにも追加されています。例えば、Tensilica社のXtensa LX2プロセッサは、多演算命令を可能にするFlexible Length Instruction eXtensions(FLIX)と呼ばれる技術を採用しています。Xtensa C/C++コンパイラは、32ビットまたは64ビットのFLIX命令と、Xtensaプロセッサの16ビットまたは24ビット幅の単演算RISC命令を自由に混在させることができます。FLIXは、複数の演算を幅の広い32ビットまたは64ビットの命令ワードに詰め込み、これらの多演算命令をより短いRISC命令と混在させることで、SoC設計者がVLIWの性能上の利点を実現しつつ、初期のVLIWアーキテクチャに見られたコードの肥大化を解消することを可能にします。
Infineon Carmel DSPは、SoC向けに設計された別のVLIWプロセッサコアです。これは、構成可能な長い命令語(CLIW)と呼ばれる同様のコード密度向上方法を使用しています。[ 8 ]
組み込み処理市場以外では、広く使用されているVLIW CPUアーキテクチャの例として、IntelのItanium IA-64明示的並列命令コンピューティング(EPIC)とElbrus 2000が挙げられます。ただし、EPICアーキテクチャは、完全な命令述語、回転レジスタファイル、および非並列命令グループをエンコードできる非常に長い命令語を提唱しているため、純粋なVLIWアーキテクチャとは区別されることがあります。VLIWはグラフィックス処理ユニット(GPU)市場でも消費者に広く普及しましたが、NvidiaとAMDはその後、グラフィックス以外のワークロードのパフォーマンスを向上させるためにRISCアーキテクチャに移行しました。
ATI Technologies(ATI)とAdvanced Micro Devices(AMD)のグラフィックス処理ユニット(GPU)向けTeraScaleマイクロアーキテクチャは、VLIWマイクロアーキテクチャです。
2015年12月、VLIW CPU Elbrus-4sを搭載したPCの最初の出荷がロシアで行われた。[ 9 ]
REX ComputingのNeoは、電力効率を目的としたVLIWコアの2Dメッシュで構成されたプロセッサである。[ 10 ]
Elbrus 2000(ロシア語:Эльбрус 2000 )とその後継機種は、モスクワSPARCテクノロジーセンター(MCST)が開発し、TSMCが製造したロシア製の512ビット幅のVLIWマイクロプロセッサです。
シリコン技術の進歩により、より広範な実装(より多くの実行ユニットを備えたもの)が可能になったとき、バイナリ命令のエンコーディングがマシンの実行ユニット数に依存していたため、以前の世代向けにコンパイルされたプログラムは、より広範な実装では実行できなくなった。
Transmeta社はこの問題に対処するため、 x86アーキテクチャのCrusoe実装にバイナリ間ソフトウェアコンパイラ層(コードモーフィングと呼ばれる)を組み込んだ。このメカニズムは、基本的にx86オペコードをランタイム時に再コンパイル、最適化し、CPUの内部マシンコードに変換すると謳われていた。そのため、Transmetaチップは内部的にはVLIWプロセッサであり、実行するx86 CISC命令セットから事実上切り離されている。
IntelのItaniumアーキテクチャ(その他多数)は、より汎用的なメカニズムで後方互換性の問題を解決しました。複数のオペコードを持つ各命令内に、プログラム命令ストリーム内の前のVLIW命令への依存関係を示すビットフィールドが割り当てられます。これらのビットはコンパイル時に設定されるため、ハードウェアはこの依存関係情報を計算する必要がなくなります。この依存関係情報が命令ストリームにエンコードされているため、より広い実装では、1サイクルあたり複数の非依存VLIW命令を並列に発行できますが、狭い実装では、1サイクルあたりに発行できるVLIW命令の数が少なくなります。
VLIW設計のもう一つの欠点として挙げられるのは、1つ以上の実行ユニットが有用な処理を実行できず、結果としてNOP命令を実行せざるを得ない場合に発生するコードの肥大化です。これは、コード内に依存関係があり、後続の処理を進める前に命令パイプラインの処理を完了させる必要がある場合に発生します。
チップ上のトランジスタ数が増加したことにより、VLIWの欠点とされていた点は重要性が低下した。VLIWアーキテクチャは、特に組み込みシステム市場において人気が高まっており、システムオンチップ内でアプリケーション向けにプロセッサをカスタマイズすることが可能です。
「Bulldog: VLIWアーキテクチャ用コンパイラ」
に対して
。