ベクトル計算機
ベクトル計算機 (ベクトルけいさんき) は、ベクトル演算(SIMDを参照)を行うことができるコンピュータのこと。特に(狭義では)ベクトル演算のための高性能でパイプライン化された実行ユニットを持ち、その演算能力を可能な限り発揮できるように全てが設計されたアーキテクチャを持つスーパーコンピュータを指す。広義にはSIMDによる、ベクトルを対象とした並列演算も指す。メインフレームにもベクトル演算機能を持っているものがある(NECのACOS-6の一部など)。以下、主に狭義の、すなわちパイプラインによるベクトル計算機について述べる。
ベクトル計算機のプロセッサを ベクトルプロセッサ(Vector Processor)または アレイプロセッサ(Array Processor)と呼ぶ。ベクトルプロセッサは数値演算を複数のデータに対してパイプラインにより次々と実行することができる。ベクトルプロセッサは科学技術計算分野でよく使われ、特に1980年代から1990年代にかけてのスーパーコンピュータでは一般的であった。現在、ベクトルプロセッサを名乗るプロセッサは少ないが、SIMDと呼ばれるベクトル演算を行う機能を備えたマイクロプロセッサは多い。ただし、それらが対象とするのはグラフィックスやマルチメディアのための計算である。200x年代後半頃から、GPGPUによる汎目的計算が行われるようになってきている。
歴史
より全体的な歴史はスーパーコンピュータ技術史を参照のこと。 パイプラインによる性能向上が試みられた最初の汎用コンピュータはIBMのストレッチことIBM 7030だとされている。IBM 7030は1960年前後に設計・建造された。商業的にはうまくいかなかったが、UNIVAC LARCに代わって世界で最も速いコンピュータとなることができ、パイプラインをはじめとする多くの技術を残した。
世界で初めて成功したスーパーコンピュータとされているのはCDC 6600(1964年から製造)である。シーモア・クレイが設計したCDC 6600は10個の入出力プロセッサと1個の演算処理に特化したCPUという構成をしていた。CPUは入出力プロセッサより10倍速く、うまくプログラミングすればこれらのプロセッサを休ませることなく働かせ続けることができた。続くCDC 7600(1969年リリース)ではパイプライン処理が取り入れられた。
初めて予定通りに実装されたベクトル計算機は CDC STAR-100(1974年リリース、クレイはかかわっていない)と テキサス・インスツルメンツ社の Advanced Scientific Computer(ASC、1970年前後)である。これらが最初期のベクトル計算機とされる。
ASC の演算装置はひとつのパイプラインを持ち、スカラー演算もベクトル演算も共通のパイプラインで処理した。そのピーク性能は 20MFLOPS であり、非常に長いベクトルを実行したときに達成できた。拡張構成ではパイプラインの本数を2倍、4倍にして、ピーク性能も 2倍、4倍となった。メモリバンド幅は拡張モードをサポートするのに十分であった。
STAR は CDC 7600 と比較すると遅いと言わざるを得ないが、データ量が多いタスクを扱った場合の価格性能比は良かった。STAR はベクトル命令をデコードして処理の設定をするのに極めて時間がかかっており、性能を出すには特殊なデータの設定を必要とした。
CDC 6600・7600を設計したクレイは、CDC社内での次の自分のプロジェクトの位置付けに不満を持ち、クレイ・リサーチを設立した。離脱は友好的に行われ、CDCの役員であるウィリアム・ノリスが立ち上げ資金を投資している。
離脱したシーモア・クレイが設計した、クレイ・リサーチのスーパーコンピュータCray-1(1976年初号機納入)で、ベクトル計算機の技術は完成を見た。STARやASCでは、演算対象のデータを直接メモリから取ってきていたため、その遅さが性能を妨げていた。Cray-1は8本のベクトルレジスタを持ち、各レジスタは64×64ビットワードで構成されていた。ベクトル命令はそれらレジスタ間の演算を実行した。これはメモリからデータを取ってきながら計算するよりもずっと高速に動作した。また、この方式を取ることにより、ベクトル命令をパイプラインで実行することができた(この技術を vector chaining と呼ぶ)。Cray-1 は平均的に 80MFLOPS の性能だったが、ベクトル命令を3個チェインさせることで最高 240MFLOPS を記録した。ベクトルレジスタとメモリの間のやりとりは別に動作する命令で行う。
クレイが離脱した後のCDCは、w:CDC Cyber・ETAとスーパーコンピュータに挑戦を続けたが、1980年代末に撤退した。
日本のコンピュータメーカ(富士通、日立製作所、日本電気)もまた、ベクトル計算機に乗り出した。まず富士通が1977年にFACOM 230-75 APUという同社のメインフレームに付加するアレイプロセッシングユニットを完成させている。次いで日立も1978年にHITAC M-180IAPを完成させた。
クレイ機に対抗する機種としては、1982年7月発表のFACOM VP-200、同8月のHITAC S-820、1983年発表の日本電気SX-2となる。これらは、各社がメインフレーマという特性を生かし、周辺プロセッサに既存メインフレームのモジュールを流用したことなどでバランスが良く、性能対価格比が高かった。これらの機種は、Cray-2の開発の遅れ(1985年)をつく形で市場に登場したが、このころは色々不可解な貿易障壁が設定されアメリカではほとんど商売ができなかった[1]。(日米スパコン貿易摩擦も参照)
他にFloating Point Systems(FPS)はミニコンピュータ向けのアドオン・アレイプロセッサを開発した。後に FPS 自身も ミニスーパーコンピュータ を製造している。
クレイ社は、その後も性能のトップを走り続け、Cray-2(1985年)、Cray X-MP、Cray Y-MP とマシンをリリースしていった。
Cray-1で1クロック1演算が達成されたため、それ以上のベクトル計算機の性能向上は並列ベクトル化ということになった。さらに、スーパーコンピュータのトレンドがベクトルから超並列プロセッシングに焦点が移っていった。シーモア・クレイは超並列スカラ機に否定的で「私が生きている間に彼らが普遍的成功を収めるのは難しいと思う」と述べていたが、突然の自動車事故(1996年10月)によってそれが真実になってしまった。また日本で、FACOM 230-75 APUから関与し、NSシステム・地球シミュレータと、世界一のベクトル計算機の計画を牽引した三好甫が2001年に亡くなっている。
日本メーカでは、並列ベクトル機は日立がHITAC S-3800(1992年)を最後に、富士通がVPPシリーズのVPP5000(1999年)を最後に、それぞれSRシリーズ(SR2001 1994年~、w:Hitachi SR2201 1996年)、APシリーズ(1992年~)の超並列スカラ型に移行し、日本電気のSXシリーズのみが、スーパーコンピュータ市場に残るベクトル計算機となっている(日本電気は80年代後半から90年代後半にかけて、Cenjuという並列計算機も作っているが、その後はベクトルに絞っている)。
一方で、コモディティ化したパーソナルコンピュータにおいて、例えば動画データの再生を行う時など、1970年代のスーパーコンピュータよりも多量のデータが処理されている。ベクトル処理は、並列演算としてSIMDという名前でほとんどのプロセッサのデザインに採り入れられており、それらの実装では、ベクトル計算を行うプロセッサはメインのスカラー計算機の横で動作している。インテルのAVX、IBMとモトローラのAltiVec(およびVMX)、ARMのVFPなどのように、Vectorの名が付けられる例も増えてきている。
概要
一般にプロセッサは同時に1~2個のデータしか取り扱うことが出来ない。例えば多くのプロセッサは「AとBを加算しCに代入せよ」といった指示を出す。MOS 6502のようなプロセッサはこういった処理を行うのに2~3個の命令(マシン語のコマンド)を要する。
A,B,Cといったデータは直接命令に組み込まれることになるが、実際のところ、データをそのままの状態で受け渡しすることは滅多になく、データを保持するメモリアドレスを「Point to」(指し示す)ことでデータの授受を行っている。アドレスをデコード(解釈)し、メモリからデータを取り出すには一定の時間が必要となる。プロセッサの高速化に伴い、この待ち時間は高速化の大きな障害となった。
現在のプロセッサではこの待ち時間を減らすため、サブユニットが順番に命令を受け取る形式の「命令パイプライン」を採用している。最初のサブユニットがアドレスを読み込み、デコード、次のユニットがアドレスからデータを取り出し、その次が演算を行う仕組みである。パイプラインの仕掛けは、まるで組立ラインのように一つ目の命令が終わる前に次の命令をデコードし始めることで、アドレス・デコーダは絶えず使用され続ける。
ベクトル計算機は、これをさらにもう一歩進め、命令をパイプラインで送るのではなく、データそのものをパイプラインで処理するという方式を採る。「AとBを加算せよ」という命令ではなく、配列すべてに対して一斉に命令を下す。絶えず命令をデコードし、データを取り出すかわりに、メモリから1つだけ命令を取り出し、次のアドレスは最後に取り出したアドレスに1を足せばよい。
これはデコード時間の節約に大いに役立つ。2組にそれぞれ10個ある数字を加算していく単純なタスクを例に取ると、普通のプログラミングではループ処理で、1組ずつ数字を取り出し、10回加算を繰り返すコードを書く。プロセッサから見ると、以下のような命令となる。
execute this loop 10 times(ここから10回ループ) read the next instruction and decode it(次の命令を読み出し、解読) fetch this number(こちらの数字を取り出す) fetch that number(あちらの数字を取り出す) add them(加算) put the result here(ここに結果を) end loop(ループ終わり)
ベクトル計算機だと以下のように、かなり異なったものとなる。
read instruction and decode it(命令を読み出し、解読) fetch these 10 numbers(こちらの数字を10個丸ごと取り出す) fetch those 10 numbers(あちらの数字を10個丸ごと取り出す) add them(一気に加算) put the results here(まとめて結果を保存)
この方法ならばアドレスの解読は2箇所だけで済む。ただし短縮できる時間はアーキテクチャによる。もう1つの利点は命令読み出しが10回から1回に減ることである。コード自体も短くなるので、よりメモリの効率化が図られる。プログラムをこのように変形することをベクトル化と言う。
最も重要なのはベクトル計算機が典型的なスーパースカラーを実装しており、10個の数字を加算するのに1つの演算器ではなく、2個あるいは4個と言った演算器で並列に行えることである。ベクトル命令の出力は他の入力には依存しないので、例えば演算器が2個だった場合は、それぞれ5つの数字を加算処理し、半分の時間で処理を終えることが出来る。
前述のクレイ社はさらに進んだ実装を行い、異なるタイプの演算処理を同時に行えるようにした。2個の数字を加算してさらに3個目の数字を掛ける処理を考えると、クレイでは一度にデータを取り出し、一度の処理で加算と乗算を済ませることが出来る。
read instruction and decode it(命令を読み出し、解読) fetch these 10 numbers(こちらの数字を10個丸ごと取り出す) fetch those 10 numbers(あちらの数字を10個丸ごと取り出す) fetch another 10 numbers(そちらの数字を10個丸ごと取り出す) add and multiply them(一度に加算と乗算) put the results here(まとめて結果を保存)
クレイでは上記のようなコードで実行される。
このような算術演算ではメモリからデータを取り出す時間ははるかに限定的となり全体的なパフォーマンス向上につながる。
しかし、すべての問題がこの種の手法で潰せるわけではなく、プロセッサにベクトル命令を加えることは煩雑さにつながり、数字が予め一列に並んでいない場合は逆に処理全体が遅くなってしまう。煩雑な命令体系はデコーダそのものの単純化も妨げ、通常の加算のようなごく簡単な命令でさえデコードに時間を要する場合もある。
実際のところ、ベクトル計算機は大量のデータに同様の処理を繰り返すときに最良の働きをする。他にも大規模並列機には通信が大量に発生するといった理由などから向かない、といったものもあり、ベクトル計算機はスーパーコンピュータが利用される施設の中でも、数値予報や数値流体力学のような膨大な演算を行うサイトで採用されている。