DEC Alpha

歴史

Alphaは、それ自体以前の複数のプロジェクトの最終生成物である、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) はオンチップのメモリコントローラを持つ最初の高性能プロセッサだった。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では整数命令に条件コードが存在せず、ステータスレジスタの条件コードがボトルネックとなる可能性を排除している。例えば加算命令でオーバーフローとなるような場合、和の下位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 準拠の浮動小数点演算機能をハードウェアで実装するのに使われる。

メモリ

64ビットの平坦な仮想アドレス空間を持つ。実装においては仮想空間を小さく実装してもよいことになっていて、最小仮想アドレス幅は43ビットとされている。未使用ビットはTLBなどのハードウェアでは実装されないが、ソフトウェアの互換性を保証するため、未使用ビットがゼロであることをハードウェアでチェックすることを要求している。

制御命令

制御命令とは、条件分岐/無条件分岐とジャンプ命令である。条件分岐命令と無条件分岐命令は分岐用フォーマットを使い、ジャンプ命令はロード/ストア用フォーマットを使っている。
条件分岐では、指定されたレジスタの最下位ビットが1か0か（奇数/偶数）の判定、あるいは指定されたレジスタとゼロとの大小比較の判定を行い、指定された条件が成立していれば分岐する。分岐する場合は、21ビットのディスプレースメントを符号拡張し、4倍してロングワード境界にし、プログラムカウンタに加算する。このときのプログラムカウンタは実行中命令の次の命令を指している（更新済み）。
無条件分岐では、条件分岐と同様に計算したアドレスでプログラムカウンタを更新する。また、このとき実行中の無条件分岐命令の次にある命令のアドレスをRaフィールドで指定したレジスタにセーブする。分岐予測ハードウェアに提供するヒントが異なる2種類の無条件分岐命令がある。
ジャンプ命令は4種類ある（正確にはオペコードは1種類で、ディスプレースメント・フィールドに4種類の値を設定する）。Raフィールドが指定するレジスタに次の命令のアドレスをセーブし、Rbフィールドが指定するレジスタの内容をプログラムカウンタに書き込む。ディスプレースメント・フィールドに書き込むのは分岐予測ハードウェアに提供するヒント情報である。

整数演算

整数演算命令としては、ロングワードおよびクワッドワードの加算/乗算/減算、クワッドワードの比較がある。除算命令は存在せず、ハードウェアの単純さを優先している。加算/減算命令にはスケール版があり、第2オペランドを2ビットまたは3ビット左にシフトしてから加減算を行う。乗算命令は積の下位64ビット（または32ビット）を指定されたレジスタに書き込む。64ビット乗算で積の上位64ビットを得るための命令 Unsigned Multiply Quadword High (MULH) もあり、任意精度演算の実装や除算アルゴリズムで使用する。積の上位半分を得る命令という考え方は PRISM で生まれた。
ロングワード（32ビット）の整数演算命令は、レジスタの上位32ビットを無視して演算を行い、計算結果を符号拡張してレジスタに書き込む。UMULH命令とスケール版加減算命令以外の加算/乗算/減算命令はデフォルトではオーバーフローを検出しない。オーバーフローを検出するバージョンの命令も用意されている。
比較命令はレジスタ同士を比較するか、レジスタとリテラルを比較し、指定された条件が成立する場合はRcフィールドで指定したレジスタに '1' を、条件が成立しない場合は '0' を書き込む。条件としては、等しい、小さいか等しい、小さい、の3種類がある。等しいか否かの判定以外には符号付き数値として比較するか符号なし数値として比較するかでさらに2種類に分かれる。

論理演算とシフト

論理演算命令としては、ビット単位の論理演算と整数レジスタ間の条件付き転送命令がある。ビット単位の論理演算には、AND、NAND、NOR、OR、XNOR、XOR があり、レジスタ間またはレジスタとリテラル間で演算を行う。条件付き転送命令はRaレジスタの内容について条件が成立する場合、Rbレジスタの内容をRcで指定したレジスタに書き込む。条件としては、ゼロとの比較（等しい、大小）と最下位ビットの値（奇数/偶数）がある。シフト命令には、算術右シフトと論理左シフトがある。シフトするビット数はレジスタまたはリテラルで指定できる。論理演算命令とシフト命令は整数演算用フォーマットを使用する。

Alphaベースのシステム

DEC Alpha ベースのシステムの第一世代として、DEC 3000 AXP シリーズのワークステーションおよびサーバ、DEC 4000 AXP シリーズのミッドレンジ・サーバ、DEC 7000 AXP および 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 で採用された。
DECはOEM用マザーボードもいくつか製造した。21066および21068ベースの AXPpci 33 "NoName" がOEM市場向けに出荷され、21164ベースの AlphaPC 164 と AlphaPC 164LX、21164PCベースの AlphaPC 164SX と AlphaPC 164RX、21264ベースの AlphaPC 264DP が続いた。SamsungやAPIといったサードパーティも API UP1000/UP2000 といったOEM用マザーボードを生産した。
サードパーティでのハードウェアおよびソフトウェア開発を助けるため、DECは EB64+ や EB164 といった評価ボードをプロセッサのモデル毎に製造した。
ネットアップは21164と21264を様々なネットワークアタッチトストレージシステムで採用した。また、クレイは超並列型スーパーコンピュータ T3D と T3E でAlphaを採用している。

スーパーコンピュータ

Alphaプロセッサを採用した最も高性能なスーパーコンピュータは、ロスアラモス国立研究所の ASCI Q である。AlphaServer SC45/GS のクラスタ構成で、CPUは 21264 (EV68) 1.25GHz を4096個使用し、7.727TFLOPS (Rmax) という性能だった。