ベクトル計算機

ベクトル計算機は、計算機科学分野の並列計算に関する類型の一つであるベクトル演算を実行可能なコンピュータのこと。

狭義ではベクトル演算のために最適化された設計として、高性能でパイプライン化された実行ユニットを持ち、その演算能力を可能な限り発揮できるように構成されたアーキテクチャを持つスーパーコンピュータを指す。 広義にはSIMDによるベクトルを対象とした並列演算を指す。以下、主に狭義の、すなわちパイプラインによるベクトル計算機について述べる。

ベクトル計算機のプロセッサを ベクトルプロセッサ  または アレイプロセッサ  と呼ぶ。ベクトルプロセッサは数値演算を複数のデータに対してパイプラインにより次々と実行できる。ベクトルプロセッサは科学技術計算分野でよく使われ、特に1980年代から1990年代にかけてのスーパーコンピュータでは一般的であった。2020年現在、ベクトルプロセッサを名乗るプロセッサは少ないが、SIMDと呼ばれる並列ベクトル演算を行う機能を備えたマイクロプロセッサは多い。グラフィックスやマルチメディアのため、とメーカーはうたっており、実際そのように使われていることは多いが、研究発表などとしては科学技術計算への利用やコンパイラ最適化による利用なども見られる。200x年代後半頃から、GPUによる汎目的計算  が行われるようになってきている。但し、一般的なCPUのSIMD機能やGPGPUは、可変長ベクトル命令をサポートしていなかったり、ランダムメモリアクセスに弱いなどの欠点があるため、完全なベクトルプロセッサではない。

1. 概要
-----

ベクトルプロセッサに対し、いわゆるスカラプロセッサと呼ばれる、従来の、あるいは一般的なプロセッサの命令は、1個の命令に対する0個〜3個の引数として、1個かせいぜい2個のワードから成るスカラ値しか取り扱えない。例として「AとBを加算しCに代入せよ」といったようなプログラムを考えよう。だいたい、CISCであれば「Copy [A], R1」「Add [B], R1」「Copy R1, [C]」といった感じの機械語命令で、RISCであれば「Load [A], R1」「Load [B], R2」「Add R1, R2, R3」「Store R3, [C]」といった感じの機械語命令で、だいたいどちらも数個の命令により、数個の値を操作している。

ここで、AやBやCというデータはメモリに保持されるものであり、メモリアドレスにより識別/特定される。アドレスをデコードし、メモリからデータを取り出すには一定の時間が必要となる。プロセッサの高速化に合わせてバスやメモリを高速化することは不可能であったため、「周辺がプロセッサに追いつかない」ということが問題となる。

また、プロセッサにおける命令の処理は「命令パイプライン」で行われる。最初のサブユニットがアドレスを読み込み、デコード、次のユニットがアドレスからデータを取り出し、その次が演算を行う仕組みである。パイプラインの仕掛けは、まるで組立ラインのように一つ目の命令が終わる前に次の命令をデコードし始めることで、アドレス・デコーダは絶えず使用され続ける。

一方で科学技術計算において必要な大量の計算では、ベクトルの加算のことを考えてみればわかるように、配列のそれぞれのデータに対して、一斉に同じ演算をするようなものが多い。画像処理などはその最たる例であり、さらに行列の乗算などでは行列が大きくなると計算量は飛躍的に大きくなる。これを効率的に処理するには、命令を「アドレスAから始まる配列と、アドレスBから始まる配列の各要素を足し、アドレスCから始まる配列として戻せ」といったようなものにし、パイプラインにはそれぞれの配列のデータを次々と送り込むようにすれば、演算器が常に働き続けることになり、効率よく大量の計算を処理できる。

2組の、それぞれ10個ある数字を加算していく単純なタスクを例に取ると、普通のプログラミングではループ処理で、1組ずつ数字を取り出し、10回加算を繰り返すコードを書く。プロセッサから見ると、以下のような命令となる。

execute this loop 10 times 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 fetch those 10 numbers add them put the results here

この方法ならばアドレスの解読は2箇所だけで済む。ただし短縮できる時間はアーキテクチャによる。もう1つの利点は命令読み出しが10回から1回に減ることである。コード自体も短くなるので、よりメモリの効率化が図られる。プログラムをこのように変形することをベクトル化と言う。

クレイはさらに高度な命令セットとマイクロアーキテクチャを考案し、異なるタイプの演算処理を同時に行えるようにした。2個の数字を加算してさらに3個目の数字を掛ける処理を考えると、クレイでは一度にデータを取り出し、一度の処理で加算と乗算を済ませることが出来る。

read instruction and decode it fetch these 10 numbers fetch those 10 numbers fetch another 10 numbers add and multiply them put the results here

クレイでは上記のようなコードで実行される。

ただし、ベクトル計算機の初期の発展における一応の完成形と考えられているCray-1では、以上のような命令を、直接メモリ-メモリで実行しているわけではない。演算に使用するのはベクトルレジスタと呼ぶ専用のレジスタで、演算はレジスタ-レジスタで実行される。レジスタ-メモリ間のデータの移動は別の命令によることになるが、演算とは並列に実行できるため、Cray-1はその構成要素が全て同時に最高の性能を発揮し続けるようにプログラミングが可能である。

以上により、ベクトル計算機は大量のデータに同様の処理を繰り返すときに最良の働きをする。他にも大規模並列機には通信が大量に発生するといった理由などから向かない、といったものもあり、ベクトル計算機はスーパーコンピュータが利用される施設の中でも、数値予報や数値流体力学のような膨大な演算を行うサイトで採用されている。

2. 歴史
-----

より全体的な歴史はスーパーコンピュータ技術史を参照のこと。

パイプラインによる性能向上が試みられた最初の汎用コンピュータはIBMのストレッチことIBM 7030だとされている。IBM 7030は1960年前後に設計・建造された。商業的にはうまくいかなかったが、UNIVAC LARCに代わって世界で最も速いコンピュータとなることができ、パイプラインをはじめとする多くの技術を残した。

世界で初めて成功したスーパーコンピュータとされているのはCDC 6600である。シーモア・クレイが設計したCDC 6600は10個の入出力プロセッサと1個の演算処理に特化したCPUという構成をしていた。CPUは入出力プロセッサより10倍速く、うまくプログラミングすればこれらのプロセッサを休ませることなく働かせ続けることができた。続くCDC 7600ではパイプライン処理が取り入れられた。

初めて予定通りに実装されたベクトル計算機は CDC STAR-100と テキサス・インスツルメンツ社の Advanced Scientific Computerである。これらが最初期のベクトル計算機とされる。

ASC の演算装置はひとつのパイプラインを持ち、スカラー演算もベクトル演算も共通のパイプラインで処理した。そのピーク性能は 20MFLOPS であり、非常に長いベクトルを実行したときに達成できた。拡張構成ではパイプラインの本数を2倍、4倍にして、ピーク性能も2倍、4倍となった。メモリバンド幅は拡張モードをサポートするのに十分であった。

STAR は CDC 7600 と比較すると遅いと言わざるを得ないが、データ量が多いタスクを扱った場合の価格性能比は良かった。STAR はベクトル命令をデコードして処理の設定をするのに極めて時間がかかっており、性能を出すには特殊なデータの設定を必要とした。

CDC 6600・7600を設計したクレイは、CDC社内での次の自分のプロジェクトの位置付けに不満を持ち、クレイ・リサーチを設立した。離脱は友好的に行われ、CDCの役員であるウィリアム・ノリスが立ち上げ資金を投資している。

離脱したシーモア・クレイが設計した、クレイ・リサーチのスーパーコンピュータCray-1で、ベクトル計算機の技術は完成を見た。STARやASCでは、演算対象のデータを直接メモリから取ってきていたため、その遅さが性能を妨げていた。Cray-1は8本のベクトルレジスタを持ち、各レジスタは64×64ビットワードで構成されていた。ベクトル命令はそれらレジスタ間の演算を実行した。これはメモリからデータを取ってきながら計算するよりもずっと高速に動作した。また、この方式を取ることにより、ベクトル命令をパイプラインで実行することができた。Cray-1 は平均的に 80MFLOPS の性能だったが、ベクトル命令を3個チェインさせることで最高 240MFLOPS を記録した。ベクトルレジスタとメモリの間のやりとりは別に動作する命令で行う。

クレイが離脱した後のCDCは、w:CDC Cyber・ETAとスーパーコンピュータに挑戦を続けたが、1980年代末に撤退した。

日本のコンピュータメーカもまた、ベクトル計算機に乗り出した。まず富士通が1977年にFACOM 230-75 APUという同社のメインフレームに付加するアレイプロセッシングユニットを完成させている。次いで日立も1978年にHITAC M-180IAPを完成させた。日本電気は1982年にACOS-1000 IAPを完成させた。

クレイ機に対抗する機種としては、1982年7月発表のFACOM VP-200、同8月のHITAC S-820、1983年発表の日本電気SX-2となる。これらは、各社がメインフレーマという特性を生かし、周辺プロセッサに既存メインフレームのモジュールを流用したことなどでバランスが良く、性能対価格比が高かった。これらの機種は、Cray-2の開発の遅れをつく形で市場に登場したが、このころは色々不可解な貿易障壁が設定されアメリカではほとんど商売ができなかった。

他にFloating Point Systemsはミニコンピュータ向けのアドオン・アレイプロセッサを開発した。後に FPS 自身も ミニスーパーコンピュータ を製造している。

クレイ社は、その後も性能のトップを走り続け、Cray-2、Cray X-MP、Cray Y-MP とマシンをリリースしていった。

Cray-1で1クロック1演算が達成されたため、それ以上のベクトル計算機の性能向上は並列ベクトル化ということになった。さらに、スーパーコンピュータのトレンドがベクトルから超並列プロセッシングに焦点が移っていった。シーモア・クレイは超並列スカラ機に否定的で「私が生きている間に彼らが普遍的成功を収めるのは難しいと思う」と述べていたが、突然の自動車事故によってそれが真実になってしまった。また日本で、FACOM 230-75 APUから関与し、NSシステム・地球シミュレータと、世界一のベクトル計算機の計画を牽引した三好甫が2001年に亡くなっている。

日本メーカでは、並列ベクトル機は日立がHITAC S-3800を最後に、富士通がVPPシリーズのVPP5000を最後に、それぞれSRシリーズ、APシリーズおよびPRIMEPOWER HPCシリーズの超並列スカラ型に移行し、日本電気のSXシリーズのみが、スーパーコンピュータ市場に残るベクトル計算機となった。またCray社では、2003年のCray X1ないしその更新であるCray X1Eが最後のベクトル機となった。

一方で、コモディティ化したパーソナルコンピュータにおいて、例えば動画データの再生を行う時など、1970年代のスーパーコンピュータよりも多量のデータが処理されている。SIMDによる並列演算は、ほとんどのプロセッサのデザインに採り入れられており、それらの実装では、並列演算を行うプロセッサはメインのスカラー計算機の横で動作している。インテルのAVX、IBMとモトローラのAltiVec、ARMのVFPなどのように、Vectorの名が付けられる例も増えてきている。GPUはもともとリアルタイム3次元コンピュータグラフィックスの生成に特化した並列計算機だったが、プログラマブルシェーダーの発展と統合型シェーダーアーキテクチャによる汎用計算能力を獲得して以降、科学技術目的の汎用計算などの高速化に使われることも増えている。

以上のように、狭義のベクトル計算機はSXシリーズを除いて終息しつつあったが、2010年代後半から、回帰の動きも見られる。富岳のA64FXのSIMD拡張であるSVEは、「Scalable Vector 拡張」という名前が示すようにベクトル長に依存しない命令セットであることを特徴にしていて、MMXのようなベクタ長が命令で固定されているSIMD命令セットとは異なっており、ベクトル計算機の命令セットの特徴を持っている。また、RISC-Vも、同様なベクトル命令セットを拡張として定義している。RISC-Vの設計者らは既存プロセッサのSIMD拡張の積み重ね、特にIntelのそれを優美でないとみている。

3. 関連項目
-------

スーパースカラー

4. 脚注
-----