DEC Alpha
DEC Alpha Generation logo.svg
DEC Alphaは、Alpha AXPとしても知られ、ディジタル・イクイップメント・コーポレーション (DEC) の64ビットRISC命令セットアーキテクチャ (ISA) であり、32ビットVAX CISC ISA とその実装を置換すべく設計された。AlphaはDECがマイクロプロセッサとして実装し生産した。Alphaマイクロプロセッサは特にDECのワークステーションやサーバに使用され、ミッドレンジ以上のあらゆるコンピュータで採用された。サードパーティもAlphaを使ったシステムを製造しており、PCのフォームファクタのマザーボードなども作られた。
オペレーティングシステム (OS) としてはDEC版UNIX (Tru64 UNIX) やVMSをサポートした。後に、Linux (Debian GNU/Linux, Gentoo Linux, Red Hat Linux) や一部のBSD (NetBSD, OpenBSD, FreeBSD) のようなオープンソースのOSもAlpha上で動作するようになった。マイクロソフトもWindows NT 4.0 SP6までAlphaをサポートしたが、Windows 2000 RC2を最後にサポートは打ち切られた。
1998年、DECがコンパックに買収されると、Alphaアーキテクチャもコンパックのものとなった。コンパックはインテルの顧客でもあり、予定されていたHP/インテルのItaniumアーキテクチャを採用するためAlphaを徐々にフェーズアウトさせることにし、Alpha関連の知的財産権を2001年にインテルに売却し、実質的に製品として見切りをつけた。2002年HPがコンパックを買収し、2004年まで既存製品の開発を継続し、既存顧客向けに2006年10月までAlphaベースのシステムの販売継続を約束した(その後2007年4月に延長)。
Alphaは、それ自体以前の複数のプロジェクトの最終生成物である、DEC PRISMという初期のRISCプロジェクトから生まれた。パロアルトの設計チームが MIPS R2000 を使ったUnix専用ワークステーション (DECstation 2100) を提案し、そちらの方が早く市場に出せることから PRISM はキャンセルされた。PRISMと他のRISCプロセッサの違いの中でも、Epicode と呼ばれるユーザープログラム可能なマイクロコードのサポートがPRISMの特徴である。PRISMは Mica と呼ばれる新オペレーティングシステムが動作するよう設計されていた。Micaは「ネイティブ」なプログラムはフルスピードで実行でき、同時にVAX向けの既存のVMSプログラムを若干変換して実行することができる。DEC経営陣は既存の稼ぎ頭を新しいマシンで置き換える必要性を理解せず、結局1988年にプロジェクトは中止された。
しかし、中止の時点でより新しいSPARCやMIPSといった第2世代のRISCチップはすでにVAXシリーズよりずっと良い価格性能比を誇っていた。第3世代のチップは価格だけでなく、全ての面においてVAXを完全に上回るであろうことは明らかだった。そのため、VMSを直接サポートする新しいRISCアーキテクチャが可能かどうかを調べる別の研究が始まった。新しいデザインはほとんどのPRISMの基本コンセプトを踏襲したが、VMSとVMSのプログラムを適度なスピードで全く変換せずに実行できるように、方針が転換された。主なRISCベンダと同様に、PRISMの32ビットから完全な64ビットの実装に設計を変更する決定もなされた。結果として、新しいアーキテクチャがAlphaとなった。Alphaの命令セットのアーキテクトはリチャード・L・サイツとリチャード・T・ウィテクである。PRISMのEpicodeは、AlphaのPALcodeとなった。PALcodeはプラットフォーム固有およびプロセッサ実装固有の機能への抽象化されたインタフェースを提供する。PALcodeは、表面的にはマイクロコードそのものであるが、実体は「割り込み不可能なサブルーチン」であり、特権モードの生成などに使われた。VMSはCPUの動作モードとしてカーネル、エグゼクティブ、スーパバイザ、ユーザーの4種類を必要とするが、UNIXはカーネルとユーザーの2つでよい。モード切り替えの機能をPALcodeとして分離することで、RISCの単純さを保ちつつ、アーキテクチャの異なるOSのサポートを可能にしたのである。
Alphaのマイクロプロセッサ業界への主な貢献と、その優秀な性能の主な理由は、アーキテクチャというよりはむしろ優れた実装によるものである。当時(現在も同じだが)、マイクロチップ産業は自動化された設計およびレイアウトツールが中心となっていた。DECのチップ設計陣は過度に複雑なVAXアーキテクチャを扱うために、人手による洗練された回路設計を追求し続けた。シンプルでクリーンなアーキテクチャに適用された人手による回路設計は、自動化された設計システムによるものよりもずっと高い動作周波数を可能にするということを、Alphaチップは示した。これらのチップは、マイクロプロセッサ設計コミュニティにカスタム回路設計というルネッサンスをもたらした。
Alphaのプロセッサは当初 DECchip 21x64 シリーズと呼ばれていたが、1990年代中ごろに "DECchip" から "Alpha" に変更した。番号の先頭2桁である "21" は21世紀を意味し、最後の2桁 "64" は64ビットであることを意味している。Alphaは当初から64ビットとして設計されており、32ビットのバージョンは存在しない。真ん中の数字はAlphaアーキテクチャの世代を表す。社内では EV 番号でも識別され、EVは公式には "Extended VAX" の略とされていた。
Alphaチップの最初の頃の世代のものは、当時もっとも革新的なものであった。最初のバージョンである 21064 (EV4) は、より高性能なECLミニコンピュータやメインフレームに匹敵する動作周波数を誇る最初のCMOSマイクロプロセッサである。2代目の21164 (EV5) は、大容量の2次キャッシュをチップの中に持つ最初のマイクロプロセッサであった。3代目の21264 (EV6) は、高い動作周波数とより複雑なアウト・オブ・オーダー実行を組み合わせた最初のマイクロプロセッサであった。21364 (EV7) はオンチップのメモリコントローラを持つ最初の高性能プロセッサだった。Alpha 21464 (EV8) は初の同時マルチスレッディングをサポートしていたが、コンパックによるDEC買収後にキャンセルされた。コード名 Tarantula はEV9と呼ばれるはずの研究プロジェクトで、ベクターユニットをAlphaに搭載する計画だった。
Alphaのコード名はEVAX (Extended VAX) であったが、実際の製品名の決定は難航した。最後に「ARA (Advance RISC Architecture)」が残ったが、一部の国で「不適切な言葉」とされたため白紙に戻った。最終的に「Alpha」という名前が決まってからも、商標上の問題からAlpha AXPとなった。実際には、この追加は必要なかったようで、最終的にAlphaに戻ったようである。AXPの意味には諸説あるが、真相は商標コンサルティング会社が考えたもので意味はないそうである。DEC社内に流れた文書によると「覚えやすい3文字」「Xを含むと先進的なイメージがある」「他社の商標権を侵害しない」ということで決まったということだ。DEC社内では "Acronym eXpert is Paid too much"(略語の専門家に多額の金が払われた)の略というジョークがささやかれていた。
余談だがAMD社のAthlonプロセッサで採用されたEV6バスは21264 (EV6)のバスと同じものであり、信号レベルでは互換性がある。実際にAthlonプロセッサ用チップセットをAlphaプロセッサ用マザーボードに使用した例もある。
Alphaアーキテクチャは性能を最重要として設計されている。DECは25年で1000倍の性能向上を達成することを意図していた。そのため、複数命令の発行、クロック周波数向上、マルチプロセッシングといった方向性を妨げるアーキテクチャ上の特質は徹底的に取り除かれた。結果としてAlphaでは、以下のような特質を持たない。
バイト単位のロード/ストア命令。ただし後にバイト/ワード拡張 (BWX) として追加した。
Alphaでは整数命令に条件コードが存在せず、ステータスレジスタの条件コードがボトルネックとなる可能性を排除している。例えば加算命令でオーバーフローとなるような場合、和の下位64ビット(あるいは32ビット加算なら下位32ビット)をレジスタに書き込み、あふれた部分を無視する。キャリーが発生したかどうかが必要なら、加算結果と加算前の2つの数値を符号なし数値として比較する。
アーキテクチャでは整数用レジスタが32本、浮動小数点用レジスタが32本定義されており、さらにプログラムカウンタ、2本のロックレジスタ、1本の浮動小数点コントロールレジスタ (FPCR) がある。他にも実装上必要な場合にのみ実装されるオプションのレジスタ群が定義されている。また、PALcode用のレジスタ群が定義されている。
整数レジスタは R0 から R31 と表記され、浮動小数点レジスタは F0 から F31 と表記される。R31とF31は常にゼロであり、それらに書き込もうとしても無視される。DECは統合レジスタファイルも検討したが、整数レジスタファイルと浮動小数点レジスタファイルを分離した方が実装の自由度が上がり、FPUを別チップにすることも可能になるということで、分離することにした。また、複数命令を同時発行する場合、分離した方がレジスタファイルのリード/ライトのポート数を減らせるという利点もある。レジスタファイル内のレジスタ本数も32本と64本を候補として検討した。DECは32本の方がチップ上の面積が小さくなり、クロック周波数を上げやすいということでそちらを選択した。32本のレジスタがあれば少なくとも8命令同時発行までサポートできるため、このレジスタ本数は性能や将来の発展の観点からも大きな問題とはならないと考えられた。
プログラムカウンタは64ビットでロングワード(32ビットのこと。データ型も参照のこと)境界の仮想バイトアドレスを保持する。従って、下位2ビットは常にゼロであり、逐次的に命令を実行する際は4ずつインクリメントされる。マルチプロセッシングをサポートするため、ロックフラグとロックされた物理アドレスを格納するレジスタを使い、load-locked/store-conditional命令を実装している。浮動小数点コントロールレジスタ (FPCR) は64ビットのレジスタで、IEEE 754 準拠の浮動小数点演算機能をハードウェアで実装するのに使われる。
Alphaでは1バイトが8ビットデータとして定義されており、16ビットデータを1ワード、32ビットデータをロングワード、64ビットデータをクワッドワード、128ビットデータをオクタワードと称する。
Alphaアーキテクチャには当初から以下の6種類のデータ型が定義されていた。
クワッドワード(64ビット)整数
ロングワード(32ビット)整数
IEEE 倍精度浮動小数点数(T-floating-point、64ビット)
IEEE 単精度浮動小数点数(S-floating-point、32ビット)
VAXとの互換性のため、次の2種類も含まれる。
VAX 倍精度浮動小数点数(G-floating point、64ビット)
VAX 単精度浮動小数点数(F-floating point、32ビット)
命令セットの将来の拡張で128ビットのデータ型をサポートすることが考慮されていた。
64ビットの平坦な仮想アドレス空間を持つ。実装においては仮想空間を小さく実装してもよいことになっていて、最小仮想アドレス幅は43ビットとされている。未使用ビットはTLBなどのハードウェアでは実装されないが、ソフトウェアの互換性を保証するため、未使用ビットがゼロであることをハードウェアでチェックすることを要求している。
Alpha ISA の命令長は32ビット固定である。命令フォーマットは6種類ある。
整数演算命令のフォーマットでは、オペコード6ビットの後に第1オペランドを指定するRaフィールドと第2オペランドを指定するRbフィールドがある。続く3ビットは未使用で予約されている。その次の1ビットは常に "0" で、リテラルを使用する整数演算命令のフォーマットとの区別に使われている。次に7ビットの機能フィールドがあり、オペコードとの組み合わせで具体的に何をするのかを指定する。最後のRcフィールドは演算結果を書き込むレジスタを指定する。レジスタを指定するフィールドはそれぞれ5ビットで、32種類の値が32本の整数レジスタに対応している。
リテラル整数演算フォーマットでは、オペランドの一方にリテラルを使用する。整数演算命令のフォーマットのうち、5ビットのRbフィールドと3ビットの未使用フィールドを合わせた8ビットをリテラルフィールドとして使用し、リテラルは符号拡張ではなくゼロ拡張で64ビットの値に変換して使用する。
浮動小数点演算フォーマットは整数演算フォーマットと似ているが、機能フィールドが11ビットに拡大している。
ロード/ストア用フォーマットでは、16ビットのディスプレースメント・フィールドで命令の後半が占められている。
分岐用フォーマットには21ビットのディスプレースメント・フィールドがある。Raフィールドは条件分岐の際に調べるレジスタを指定する。条件が成立している場合、プログラムカウンタにディスプレースメントを加算して更新する。ディスプレースメントは符号付き整数であり、正の場合は前方への分岐、負の場合は後方への分岐となる。分岐可能な範囲は 1,048,576 である。設計原則に従い、分岐可能範囲を広くとってある。
CALL_PALフォーマットはCALL_PAL命令で使うもので、PALcodeサブルーチン呼び出しに使われる。オペコード以外は26ビットの機能フィールドとなっており、PALcodeサブルーチンを指定する整数を示す。
制御命令とは、条件分岐/無条件分岐とジャンプ命令である。条件分岐命令と無条件分岐命令は分岐用フォーマットを使い、ジャンプ命令はロード/ストア用フォーマットを使っている。
条件分岐では、指定されたレジスタの最下位ビットが1か0か(奇数/偶数)の判定、あるいは指定されたレジスタとゼロとの大小比較の判定を行い、指定された条件が成立していれば分岐する。分岐する場合は、21ビットのディスプレースメントを符号拡張し、4倍してロングワード境界にし、プログラムカウンタに加算する。このときのプログラムカウンタは実行中命令の次の命令を指している(更新済み)。
無条件分岐では、条件分岐と同様に計算したアドレスでプログラムカウンタを更新する。また、このとき実行中の無条件分岐命令の次にある命令のアドレスをRaフィールドで指定したレジスタにセーブする。分岐予測ハードウェアに提供するヒントが異なる2種類の無条件分岐命令がある。
ジャンプ命令は4種類ある(正確にはオペコードは1種類で、ディスプレースメント・フィールドに4種類の値を設定する)。Raフィールドが指定するレジスタに次の命令のアドレスをセーブし、Rbフィールドが指定するレジスタの内容をプログラムカウンタに書き込む。ディスプレースメント・フィールドに書き込むのは分岐予測ハードウェアに提供するヒント情報である。
整数演算命令としては、ロングワードおよびクワッドワードの加算/乗算/減算、クワッドワードの比較がある。除算命令は存在せず、ハードウェアの単純さを優先している。加算/減算命令にはスケール版があり、第2オペランドを2ビットまたは3ビット左にシフトしてから加減算を行う。乗算命令は積の下位64ビット(または32ビット)を指定されたレジスタに書き込む。64ビット乗算で積の上位64ビットを得るための命令 Unsigned Multiply Quadword High (MULH) もあり、任意精度演算の実装や除算アルゴリズムで使用する。積の上位半分を得る命令という考え方は DEC PRISM で生まれた。
ロングワード(32ビット)の整数演算命令は、レジスタの上位32ビットを無視して演算を行い、計算結果を符号拡張してレジスタに書き込む。UMULH命令とスケール版加減算命令以外の加算/乗算/減算命令はデフォルトではオーバーフローを検出しない。オーバーフローを検出するバージョンの命令も用意されている。
比較命令はレジスタ同士を比較するか、レジスタとリテラルを比較し、指定された条件が成立する場合はRcフィールドで指定したレジスタに '1' を、条件が成立しない場合は '0' を書き込む。条件としては、等しい、小さいか等しい、小さい、の3種類がある。等しいか否かの判定以外には符号付き数値として比較するか符号なし数値として比較するかでさらに2種類に分かれる。
論理演算命令としては、ビット単位の論理演算と整数レジスタ間の条件付き転送命令がある。ビット単位の論理演算には、AND、NAND、NOR、OR、XNOR、XOR があり、レジスタ間またはレジスタとリテラル間で演算を行う。条件付き転送命令はRaレジスタの内容について条件が成立する場合、Rbレジスタの内容をRcで指定したレジスタに書き込む。条件としては、ゼロとの比較(等しい、大小)と最下位ビットの値(奇数/偶数)がある。シフト命令には、算術右シフトと論理左シフトがある。シフトするビット数はレジスタまたはリテラルで指定できる。論理演算命令とシフト命令は整数演算用フォーマットを使用する。
バイト/ワード拡張 (byte-word extensions, BWX) は8ビットおよび16ビットのデータ型を操作する命令セットである。21164A (EV56) マイクロプロセッサで初めて導入され、その後の実装では必ず存在している。BWXがない実装では複数の命令を必要としていた操作を1命令で実現可能となり、コード密度を高め、用途によっては性能も向上している。BWXによってx86の機械語コードのエミュレーションを可能にし、デバイスドライバも書きやすくなった。
Alpha ISA のマルチメディア拡張またはSIMD拡張を Motion Video Instructions (MVI) と呼ぶ。MVIを搭載した実装としては、時系列順に Alpha 21164PC (PCA56, PCA57)、Alpha 21264 (EV6)、Alpha 21364 (EV7) がある。同時期の他のISAのSIMD拡張としてMIPSのMDMXやサン・マイクロシステムズの Visual Instruction Set などとは異なり、MVIは整数データ型を既存の整数レジスタに格納して処理する単純な少数の命令セットである。
MVIの単純さには2つの理由がある。第一に、DECは 21164 で既にDVDのデコード処理をソフトウェアで実行可能だと判断していたため、そのためにSIMD命令を追加する必要はないと考えていたが、MPEG-2のエンコードにはSIMD命令が必要だと判断した。第二に、実装におけるサイクルタイムの高速性を保持しようとした。多数の命令を追加すると命令デコード論理回路が複雑化・巨大化するので、クロック周波数の低下にもつながる。
MVIには13の命令が含まれる。
浮動小数点拡張 (floating-point extensions, FIX) は Alpha ISA の拡張であり、平方根を計算する命令と整数レジスタと浮動小数点レジスタの間の転送命令を含む。21264 (EV6) で初めて実装した。
カウント拡張 (Count Extensions, CIX) とは、ビット数をカウントする3種類の命令からなる拡張である。それらの命令は整数演算命令に分類される。21264A (EV76) で初めて実装された。例えばCTLZ命令は、指定したレジスタの最上位ビットから"0"となっている連続ビットをカウントし、ビット数を別の指定したレジスタに書き込む。CTPOP命令は"1"になっているビットをカウントし、CTTZは最下位ビットから"0"となっている連続ビットをカウントする。
最初の発表時、Alphaは今後25年間続くアーキテクチャになるとされた。これは真実にはならなかったが、Alphaはそれなりに長寿命だったと言える。最初のバージョンであるAlpha 21064 (EV4) は1992年11月に導入され、192MHzで動作し、(0.75μmから0.675μmへ)ダイを若干縮小した EV4S は数カ月後に登場し、200MHzで動作した。64ビットプロセッサであるAlphaは、他のRISC設計と同様にスーパーパイプライン化されスーパースケーラであったが、にもかかわらずそれらの性能を凌駕し、DECは世界最速のプロセッサと喧伝した。Hudson設計チームのお家芸である回路設計へのこだわりにより、他のRISCチップとよく似たマイクロアーキテクチャであったにもかかわらず、Alphaはより高速で動作することができた。比較すると、次の春に発売されたインテルPentiumは66MHzで動作した。
Alpha 21164 (EV5) は333MHzで1995年に市販された。1996年7月には500MHzに引き上げられ、1998年3月には666MHzとなった。また、1998年に450MHzで登場した Alpha 21264 (EV6) は、2001年には1.25GHz版 (21264C/EV68CB) がリリースされた。2003年に登場した Alpha 21364 (EV7) は、EV68コアに1.6GB/sのインターコネクトを4本追加したもので、マルチプロセッシングのためのプロセッサ間通信機能を強化している。クロック周波数は1GHzまたは1.15GHzである。
1996年、Alphaチップの生産はサムスン電子にライセンスされた。コンパックによるDECの買収により、Alphaの資産の大部分はサムスンとコンパックが出資したAPI NetWorks, Inc. (以前はAlpha Processor Inc.) に移管された。
2001年6月25日、コンパックはインテルItaniumに移行するため2004年までにAlphaチップの開発を終了すると発表し、計画されていた Alpha 21464 はキャンセルし、Alphaの知的資産をインテルに売却するとした。コンパックを買収したヒューレット・パッカード (HP) は、Alphaシリーズのサポートは数年間継続し、1.3GHz版のEV7であるEV7zチップをリリースするが、これが最後のAlphaシリーズになることを発表した。0.13μmルールを予定していた EV79 もキャンセルとなった。HPは Tru64 UNIX のメンテナンスと販売を2006年まで継続し、サポートは2011年まで延長された。
皮肉にも、Alphaがフェイズアウトする間際の2003年中盤に、米国で1番と2番に速いコンピューターは共にAlphaプロセッサを使用していた。前者は4096個のAlphaプロセッサのクラスタである。
2004年8月16日に、HPは1.3GHzのEV7zのリリースを発表し、これが生産される最後のAlphaモデルとなった。
ISA 拡張:
R – 正負の無限大方向への丸めをハードウェアでサポート
B – BWX、バイト/ワード拡張。8ビットと16ビットの操作命令を追加
M – MVI、マルチメディア拡張
F – FIX、平方根を求める命令と整数レジスタと浮動小数点レジスタ間の転送命令
C – CIX、ビットをカウントしビット位置を求める命令
T – ロック獲得の試みにおける性能改善のためのプリフェッチサポート
Alphaベースのシステムでの性能を比較するため、以下にSPEC性能値 (SPECint95, SPECfp95) の一覧を示す。SPECはコンピュータシステム全体(CPU、バス、メモリ、コンパイラ)の性能を測定するものとされていて、CPUだけの性能を示すものではない。また、1992年から1995年にかけて、このベンチマークには変更が加えられている。それでも、Alphaアーキテクチャ(64ビット)と同時代のHP-PA(64ビット)やインテルベースのシステム(32ビット)との相対的な性能を大まかに比べることができる。最も明らかな傾向は、インテルとAlphaの整数演算性能は肩を並べているが、浮動小数点演算性能は大きな差があるという点である。一方、PA-RISCとAlphaはほぼ似たような性能だが、クロック周波数 (MHz) はHPの方がずっと低い。
DEC Alpha ベースのシステムの第一世代として、DEC 3000 AXP シリーズのワークステーションおよびサーバ、DEC 4000 AXP シリーズのミッドレンジ・サーバ、DEC 7000/10000 AXP シリーズのハイエンド・サーバがある。DEC 3000 AXP システムでは以前のMIPSベースのDECstationでも使っていたTURBOchannelを採用しているが、4000 ではFuturebusを採用し、7000/10000ではVAXと似たようなアーキテクチャを採用している。
PC風のAlphaワークステーション DECpc AXP 150 もあり、EISAバスを採用していた。Windows NT をサポートした最初のAlphaシステムである。また、インテルベースのワークステーションのCPUをAlphaに置き換えたもの(Digital Personal Workstation や Alpha XL/Alpha XLT)もある。
DECは組み込み用としてVMEバス向けのワンボードマイコンも用意した。第一世代は21068ベースの AXPvme 64 と AXPvme 64LC、21066ベースの AXPvme 160 で、1994年3月1日に登場した。その後21066Aベースの AXPvme 100、AXPvme 166、AXPvme 230、21064Aベースの Alpha VME 4/224 と Alpha VME 4/288 と続いた。最後のモデルは21164ベースの Alpha VME 5/352 と Alpha VME 5/480 である。
21066はコンパクト・ワークステーションと称した DEC Multia VX40/41/42 や、Tadpole Technology のラップトップ機 ALPHAbook 1 にも採用された。
1994年、DECは新たなファミリとして AlphaStation と AlphaServer を立ち上げた。21064または21164を使い、PCIバス、VGA互換フレームバッファ、PS/2接続のキーボードとマウスを採用している。AlphaServer 8000 シリーズは DEC 7000/10000 AXP の後継で、XMIとFutureBus+を採用している。
AlphaStation XP1000 でワークステーションとして初めて21264を採用。その後21264を採用した AlphaServer/Station は DS (departmental server)、ES (enterprise server)、GS (global server) の3つに分類された。
最後の21364は AlphaServer ES47/ES80/GS1280 という3モデルと AlphaStation ES47 で採用された。