CDC 6600

CDC 6600は、1964年から製造された、コントロール・データ・コーポレーション (CDC) の汎用コンピュータ。一般に世界で初めて成功したスーパーコンピュータと言われており、当時の最速のマシンの三倍程度の性能を誇った。1964年にIBM 7030から世界最高速の地位を奪い、1969年に後継機 CDC 7600 にその地位を譲った(さらに1972年には CDC_Cyber（英語版） シリーズが登場する)。 CDCの最初の製品はエンジニアリング・リサーチ・アソシエイツで設計されたマシンに基づいており、シーモア・クレイはCDCに移った後にそれをアップデートするよう依頼された。Little Character と名づけられた実験的なマシンの後で、彼らは最初の商用のトランジスタベースのコンピュータの1つである CDC 1604（英語版） を発売した。それは当時、最も速いマシンのひとつでもあった。経営陣は気をよくして、ビジネス用途にもっと適合した新しいマシンのシリーズを開発する計画を立てた。例えば新しいマシンでは、文字操作命令と記録保持命令を含むことが想定された。クレイはそのようなプロジェクトに興味を持たず、1604 の50倍の性能を持つマシンを開発することを自分の目標とした。今後五年の詳細な計画案の提出を求められたとき、彼は五年間の目標を「世界で最大のコンピュータを開発する」とし、一年毎の目標を「そのための五分の一の作業」と書いて提出した。 最初のCDC本社近くの新しいオフィスにチームを集めると、彼らはクレイが 1604 で使った「安い」トランジスタの高品質版の実験から作業を開始した。多くの実験の後に、ゲルマニウムトランジスタでは 1604 より高速化することは望めないと判明した。実際、経営陣が望んでいたビジネスマシンは CDC 3600 として形を成し始めており、クレイらは追い詰められていた。クレイは、解決策としてフェアチャイルドが新たに開発したシリコンベースのトランジスタを使うことにした。それはまさに市場に出たばかりで、劇的に改善されたスイッチング性能を見せていた。 この頃、CDCは創業期を脱して大企業となっていた。クレイは、彼がこっけいな管理上の雑事と考えたもののためにますますイライラさせられていた。1962年になると、3600 がリリース間近となって経営陣の希望通りに事が運ぶと、クレイと経営陣の間の緊張感は最高潮に達した。クレイはついにCDCのCEO ウィリアム・ノリスに、事態が変わらなければ会社を辞めるつもりであると告げた。ノリスは、クレイを失うには重要すぎると思い、クレイの望み通りに新しい研究所を設立する許可を与えた。 クレイは結局、彼の故郷チペワ・フォールズに戻ると決め、土地を購入し、新しい研究所を開設した。このために彼の新しいマシンの設計はかなり大きく遅れてしまったが、新しい研究所での作業が開始されると進捗は目覚しかった。そのころには新トランジスタは完璧に信頼でき、それを使って組み立てられたモジュールは最初の試験で問題なく動作することが多かった。システムアーキテクトであり「隠れた天才」と言われたジム・ソーントンとともに作業して、マシンはすぐに形を成してきた。 CDC 6600 は、全部で50台を売り上げた。そのほとんどは1号機を納入したローレンス・リバモア国立研究所をはじめ核爆弾関連の研究所が購入したが、いくつかは大学のコンピューティング関係の研究室が購入した。クレイは直ちに後継機の開発に注力し、CDC 7600 として後にリリースされるマシンの性能目標を6600の10倍と定めた。後のCDC_CYBER（英語版） 70 と 170 コンピュータは CDC 6600 によく似ている。 日本では1970年に伊藤忠電子計算サービスが6600を約22億円で購入し、1966年に導入済みの3600との2台構成で1971年3月に営業運転を開始した。 当時の典型的なマシンは、単一の複雑な中央処理装置を使ってシステム全体を動かす。典型的なプログラムは、まずメモリ中にデータをロードし（ライブラリを使うことが多い）、それを処理し、結果を書き出す。この一連の処理は、様々な命令を必要とし、CPUにかなりの複雑さを要する。複雑なCPUはCPUの大型化を意味し、それを構成する個々のモジュール間で情報をやりとりする際に信号の遅延を導入する必要があった。これらの遅延は性能を抑える要因となり、マシンは信号が次のモジュールに到達する時間を考慮したサイクル時間でしか動作できなかった。 クレイは別のアプローチを採用した。当時、CPUは一般に主記憶装置よりも遅かった。例えば、プロセッサが二数の乗算をするのに15サイクルかかったとすると、メモリアクセスには1サイクルか2サイクルで済んだ。これは、主記憶が何もしていない時間が非常に多いことを意味している。6600が抽出したのはこの時間である。 6600ではCPUが演算もI/Oも行うのではなく、CPUは演算だけを行うものとした。これによってCPUは小さくなり、結果としてクロックを高速化することができる。シリコントランジスタの高速スイッチング性能と相まって、この新しいCPUは容易に当時の最高速を達成したのである。6600 はクロック速度 100ns (10MHz) で動作した（市場の他のマシンの10倍）。さらに、単純なプロセッサでは各命令の処理も高速化が容易であった。例えば、CPUはほんの3サイクルで乗算を実行することができた。 もちろん、単純であるが故に、何でもできるわけではない。様々なタスクを処理するために、典型的なCPUはメモリや入出力を操作する。クレイはこれらの命令をCPUから削除し、代わりに周辺プロセッサ群 (Peripheral and Control Processors, PPs) でそれらを実施した。これにより演算とI/Oが並列して動作可能になった。 もちろん、これを考えなしに実装したらマシンは劇的に高価になる。6600の設計の鍵はPPを可能な限り単純にすることであった。PPは単純な12ビットの CDC 160A に基づいており、CPUに比較するとずっと遅く、データを集めて専用のハードウェア経由で主記憶にそれを一気に書き込む。それらの低速性を補うために、6600のPPは10台相当の働きをする。 高価にしないために、次のような設計がなされた。6600のPPは「barrel and slot」と呼ばれる（今日ではバレルプロセッサと呼ばれる構造である）。barrelは10台ぶんのレジスタ群を意味する。実際にはPPに処理を実行する部分は1個しかなく、slotはそれを意味する。各スライス時間ごとに、slotはbarrelのうちの1台ぶんに接続され処理を行う。次のスライスには次の1台の処理を行う。主記憶はCPU+PPの 1/10 の速度なので、バレルのうちのある1台に次の順番が回ってきた時に待つ必要はない。 プログラムを書くのは若干難しく、CPUが何もしていない時間がないようにタイミングを考慮することで効率化する必要がある。以下ではバレルのうちのひとつをひとつのPPとして説明する。例えば、ひとつのPPにテープドライブからデータをロードしてメモリ上の配列に格納させ、別のPPにその配列の要素をCPUのレジスタにコピーさせ、さらに別のPPにそのレジスタと定数の乗算をさせ、別の二つのPPが結果をメモリに書き戻してテープに書き戻すといった流れとなる。CPUは非常に高速動作していて、メモリアクセス1回の間に10サイクル動作する。そのため、10個のPPを使い、各PPはサイクル毎に一回のメモリアクセスが可能であった。 6600 のCPUの基本は、今日我々が RISC と呼んでいるものである。RISC では、プロセッサは比較的単純な命令の実行に特化していて、メモリアクセスは決まった制限された形でだけ行う。多くの他のマシンの考え方は、複雑な命令を使うものだった。例えば、ひとつの命令でメモリからオペランドを取り出し、それをレジスタの中の値に加算する。6600 において、メモリから値をロードするだけで1つの命令を必要とし、それを加算するには次の命令を必要とする。メモリアクセスは遅いが、PPがそれを肩代わりする。この単純化によって、プログラマはメモリアクセスに注意しなければならず、彼らは意識的にメモリアクセスをなるべく減らすようなコードを書いた。 セントラルプロセッサ (CP) は X0 から X7 まで8個の汎用60ビットレジスタ、A0 から A7 まで8個の18ビットのアドレスレジスタ、B0 から B7 までの8個の18ビットの補助レジスタ（配列のインデックスに使用。B0の内容は常にゼロ）を持つ。補助的なレジスタ（スコアボードレジスタなど）はプログラマからはアクセスできない。RA および FL といったレジスタはオペレーティングシステムだけが値を設定する。CPは入出力に関する命令を持たず、周辺プロセッサ群（後述）を使って入出力を行う。RISC のロード/ストアの考え方を保持するため、メモリのロード/ストアを行う命令も存在しない。全てのメモリアクセスは A レジスタにアドレスをセットすることで行われる。A1 から A5 レジスタにアドレスを格納すると、対応する X レジスタ（X1からX5）にそのアドレスの位置のメモリの内容がロードされる。一方、A6、A7 レジスタにアドレスをセットすると X6 と X7 レジスタの内容が指定されたアドレス位置のメモリに書き込まれる（X0 と A0 レジスタはこの形式でのロード/ストアには関与しない）。ロード/ストアを行う装置は独立しており、命令列の実行とは切り離され、メモリアクセス中も他の命令を実行することができた。メモリアクセスには、最善の場合でも8サイクルを要した。最近の設計では、ロード/ストア命令があって、アドレスもその命令で指定される。浮動小数点演算はこのコンピュータアーキテクチャでは最も優先されていて、CDC 6600 は 60ビットの浮動小数点乗算命令を分岐命令よりも高速に実行できたのである。 6600 CP は 10 個の並列動作可能な機能ユニットを持ち、同時に複数の命令を実行することができた。今日ではスーパースカラもしくはハイパースレッディング・テクノロジーとして知られている一般的な手法であるが当時としては先進的な機能である。さらにScoreboardingという手法によりアウト・オブ・オーダー実行（OoO実行）を行った。これはIBM System/360モデル91のTomasuloのアルゴリズムによるOoO実行と並び最初期のものである。もっとも今日のモダンなCPU設計とは異なり、機能ユニットはパイプライン化されておらず、機能ユニットは一旦に命令が "発行" されると実行が完了するまでビジー状態を維持し次の命令は待たされた(対照的に CDC 7600 では機能ユニットにパイプラインが導入された)。 ユニットとしては、 浮動小数点乗算器(2組) 浮動小数点除算器 浮動小数点加算器 倍長整数加算 インクリメンタ(2組、メモリへのロード/ストアに使用) バレルシフタ 論理演算器 分岐先アドレス演算器 がある。 命令は、8ワードの「スタック」と呼ばれるCP内部のレジスタの保持される。15ビット命令ならば1ワードに4命令が入るので、最高32個の命令を保持し、実行ユニットの空き状況に応じてその中の1つが逐次実行に移された。このスタックは無条件分岐命令があると内容が消される。無条件分岐は条件分岐よりは速い場合がある（少なくとも、遅くなることはない）。システムのクロックは 10MHz だが、4相クロックが使用されていたので、実質的には 40MHz で動作していたと言える。浮動小数点乗算は3サイクルかかり、除算は約10サイクルである。メモリによる遅延なども考慮した性能は約 1MFLOPS である。ずっと後に出てきた最も性能のよいコンパイラを使うと、FORTRAN のプログラムで約 0.5MFLOPS の性能を平均的に達成できたという。 ユーザプログラムは、コア・メモリの連続領域をひとつだけ使うことができる。そのプログラムがアクセスするメモリ領域は RA (Relative Address) レジスタと FL (Field Length) レジスタで管理され、プログラムがメモリにアクセスしようとしたとき、プロセッサはそのアドレスが0から FL-1 の間にあるかどうかをチェックする。これにパスすると、実際にはそのアドレスに RA の値を加算したアドレスのメモリにアクセスを行う。この方式は「論理アドレス変換 (Logical Address Translation)」と呼ばれる。各ユーザープログラムからは、メモリ空間が 0 番地から FLワードの範囲で存在しているように見えるが、物理的には、ユーザープログラムの使用するメモリは適当なアドレスに割り当てられている。この手法を使うことで、オペレーティングシステムはRAレジスタを適切に設定することで各ユーザープログラムを任意のアドレスに配置・移動することができる。許容された範囲外にアクセスしようとしたユーザープログラムはエラーを発生し、オペレーティングシステムがそれを停止させる。これが発生すると、コアダンプがファイルに書き出され、開発者はそれを調べて原因を探ることができる。仮想記憶システムと異なり、実行中のプロセスは必ず主記憶上に全体が存在している。仮想記憶のサポートは後の CDC_CYBER（英語版） 180 で行われた。 通常はCPUが実行する雑多なタスクを処理するために、クレイは以前に設計した古いコンピュータ CDC 160A の一部を使って10個のプロセッサを搭載させた。これは周辺プロセッサ群 (PPs) と呼ばれ、入出力タスクとオペレーティングシステムの実行を担当した。ひとつのPPがメインCPU上で実行されるプログラムを含めたマシン全体を制御し、他のPPは入出力タスクを受け持った。プログラムが何らかのI/Oをする必要がある場合、いずれかのPPに小さなプログラムをロードして仕事を分担させる。そのPPはタスクが完了したときにCPUに割り込みをかけて通知する。 個々のPPは自身のメモリ（最大4096×12ビット）を持ち、I/Oのバッファリングやプログラムの格納に使用する。実行ユニットは10個のPPが共有している。10個分の資源を「barrel」、共有される1個の実行ユニットを「slot」とし、この構成を「Barrel and slot」と呼んだ（バレルプロセッサと呼ばれる構造である）。実行ユニット (slot) はラウンドロビン方式でサイクル毎にbarrelのうちの1台に接続され命令を実行する。あるサイクルであるPPがメモリにアクセス要求を出したとすると、そのPPの次のサイクルにはアクセス処理は完了している（読み出しならデータが用意できているし、書き込みなら次の書き込み要求が可能である）。 セントラルプロセッサのワード長は 60ビットで、周辺プロセッサのワード長は12ビットである。CDCは「バイト」という用語を周辺プロセッサの12ビット長を意味する言葉として使っていた。文字は6ビットで表され、セントラルプロセッサの命令は15ビットか30ビット（うち18ビットはアドレス）である。直接指定可能なアドレス空間は 128Kワード（8ビットをバイトと呼ぶ現在の方式で言うと 0.94Mバイト）である。アドレスレジスタは符号を持っているため、個々のプログラムは 128K に制限される。実際のCPUは最大で 256Kワードのメモリを使用可能であった。分岐命令やサブルーチンからの戻りでアドレスを指定する際にはワード境界である必要があり、何もしない命令 (NOP) で隙間を埋める必要があった。 文字が 6ビットなので、1ワードには最大10文字を格納できる。文字種はアルファベットの大文字と数字と記号で64種である。FORTRAN のプログラムや財務リポート、科学リポートを書くには十分である。実際の文字セットは64文字と63文字の二種類があった。64文字セットの欠点として、':' （コロン）が二個連続してワードの最後に書かれると、それが行末として解釈されてしまうという問題があった。 バイト単位のアドレス指定をする命令がないため、文字をパックしたりシフトしてワードに変換する必要があった。ワード長が大きくメモリが小さいため、プログラマはビットレベルでデータをワードに詰め込んでメモリを節約することが多かったのである。 マシンは +（プラス）型の筐体で、4つの腕の最外縁部にポンプと熱交換器が配置されている。マシン内でフレオンを循環させ、外部の冷却された流水と熱交換することで冷却される。各腕部にはそれぞれ 8インチの厚さの4個のシャーシを内蔵でき、中央部と蝶番で繋がっていて、本のように開くことができた。中央部は各シャーシをつなぐケーブルが通っている。シャーシには1番（10個のPP全部といくつかの入出力チャネルを含む）から16番まで番号が振られている。CPUの主記憶装置は各シャーシに分散して配置されている。 論理回路は 2.5インチ四方（厚さ 1インチ）のモジュールにパッケージングされている。各モジュールは一端にコネクタがあり（20本程度のピンが二列に並んでいる）、反対側に6個のテストポイントがある。モジュールはアルミニウム板に挟まれるように配置され、それによって冷却していた。モジュール内にはプリント基板が二枚あり、部品はどちらか一方に実装されるか、二枚を繋ぐ様に実装されていた。これは非常に稠密な実装であり、修理が困難とも言える。このパッケージを cordwood（コードウッド、丸太を4フィート単位に切ったもの）パッケージと呼んだ。