ベクトル計算機

ベクトル計算機（ベクトルけいさんき）は、計算機科学分野の並列計算に関する類型の一つであるベクトル演算（SIMDを参照）を実行可能なコンピュータのこと。 狭義ではベクトル演算のために最適化された設計として、高性能でパイプライン化された実行ユニットを持ち、その演算能力を可能な限り発揮できるように構成されたアーキテクチャを持つスーパーコンピュータを指す。 広義にはSIMDによるベクトルを対象とした並列演算を指す。以下、主に狭義の、すなわちパイプラインによるベクトル計算機について述べる。 ベクトル計算機のプロセッサを ベクトルプロセッサ (Vector Processor) または アレイプロセッサ (Array Processor) と呼ぶ。ベクトルプロセッサは数値演算を複数のデータに対してパイプラインにより次々と実行できる。ベクトルプロセッサは科学技術計算分野でよく使われ、特に1980年代から1990年代にかけてのスーパーコンピュータでは一般的であった。2020年現在、ベクトルプロセッサを名乗るプロセッサは少ないが（特にスーパコンピュータでは、パイプライン形のベクトルプロセッサはSXシリーズを残すのみである）、SIMDと呼ばれる並列ベクトル演算を行う機能を備えたマイクロプロセッサは多い。グラフィックスやマルチメディアのため、とメーカーはうたっており、実際そのように使われていることは多いが、研究発表などとしては科学技術計算への利用やコンパイラ最適化による利用なども見られる。200x年代後半頃から、GPUによる汎目的計算 (GPGPU) が行われるようになってきている。但し、一般的なCPUのSIMD機能やGPGPUは、可変長ベクトル命令をサポートしていなかったり、ランダムメモリアクセスに弱いなどの欠点があるため、完全なベクトルプロセッサではない。 ベクトルプロセッサに対し、いわゆる（レトロニムで）スカラプロセッサと呼ばれる、従来の、あるいは一般的なプロセッサの命令は、1個の命令（オペコード）に対する0個〜3個の引数（オペランド）として、1個かせいぜい2個のワードから成るスカラ値しか取り扱えない。例として「AとBを加算しCに代入せよ」といったようなプログラムを考えよう（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（ここから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回に減ることである。コード自体も短くなるので、よりメモリの効率化が図られる。プログラムをこのように変形することをベクトル化と言う。 クレイはさらに高度な命令セットとマイクロアーキテクチャを考案し、異なるタイプの演算処理を同時に行えるようにした。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（まとめて結果を保存） クレイでは上記のようなコードで実行される。 ただし、ベクトル計算機の初期の発展における一応の完成形と考えられているCray-1では、以上のような命令を、直接メモリ-メモリで実行しているわけではない（Cray-1より古いマシンであるCDCのSTARではメモリ-メモリだった）。演算に使用するのはベクトルレジスタと呼ぶ専用のレジスタで、演算はレジスタ-レジスタで実行される。レジスタ-メモリ間のデータの移動は別の命令によることになるが、演算とは並列に実行できるため、Cray-1はその構成要素が全て同時に最高の性能を発揮し続けるようにプログラミングが可能である。 以上により、ベクトル計算機は大量のデータに同様の処理を繰り返すときに最良の働きをする。他にも大規模並列機には通信が大量に発生するといった理由などから向かない、といったものもあり、ベクトル計算機はスーパーコンピュータが利用される施設の中でも、数値予報や数値流体力学のような膨大な演算を行うサイトで採用されている。 より全体的な歴史はスーパーコンピュータ技術史を参照のこと。 パイプラインによる性能向上が試みられた最初の汎用コンピュータは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年にACOS-1000 IAPを完成させた。 クレイ機に対抗する機種としては、1982年7月発表のFACOM VP-200、同8月のHITAC S-820、1983年発表の日本電気SX-2となる。これらは、各社がメインフレーマという特性を生かし、周辺プロセッサに既存メインフレームのモジュールを流用したことなどでバランスが良く、性能対価格比が高かった。これらの機種は、Cray-2の開発の遅れ（1985年）をつく形で市場に登場したが、このころは色々不可解な貿易障壁が設定されアメリカではほとんど商売ができなかった。（日米スパコン貿易摩擦も参照） 他に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年、ただしSRシリーズはCP-PACSで開発された擬似ベクトル機能により、従来のベクトル機のプログラムを高速実行する機能を持っている）、APシリーズ（AP1000 1992年〜）およびPRIMEPOWER HPCシリーズ（PRIMEPOWER HPC2500 2002年〜、自動並列化コンパイラなど、VPP5000を代替する旗艦シリーズとしてのスカラ機はこのシリーズから）の超並列スカラ型に移行し、日本電気のSXシリーズのみが、スーパーコンピュータ市場に残るベクトル計算機となった（日本電気は80年代後半から90年代後半にかけて、Cenjuという並列計算機も作っているが、その後はベクトルに絞っている）。またCray社では、2003年のCray X1（en:Cray X1）ないしその更新であるCray X1E（2005年）が最後のベクトル機となった。 一方で、コモディティ化したパーソナルコンピュータにおいて、例えば動画データの再生を行う時など、1970年代のスーパーコンピュータよりも多量のデータが処理されている。SIMDによる並列演算（広義のベクトル処理の一種とされることがある）は、ほとんどのプロセッサのデザインに採り入れられており、それらの実装では、並列演算を行うプロセッサはメインのスカラー計算機の横で動作している。インテルのAVX、IBMとモトローラのAltiVec（およびVMX）、ARMのVFPなどのように、Vectorの名が付けられる例も増えてきている。GPUはもともとリアルタイム3次元コンピュータグラフィックスの生成に特化した並列計算機だったが、プログラマブルシェーダーの発展と統合型シェーダーアーキテクチャによる汎用計算能力を獲得して以降、科学技術目的の汎用計算などの高速化に使われることも増えている（→GPGPU）。 以上のように、狭義のベクトル計算機はSXシリーズを除いて終息しつつあったが、2010年代後半から、回帰の動きも見られる。富岳のA64FXのSIMD拡張であるSVEは、「Scalable Vector 拡張」という名前が示すようにベクトル長に依存しない命令セットであることを特徴にしていて、MMXのようなベクタ長が命令で固定されているSIMD命令セットとは異なっており、ベクトル計算機の命令セットの特徴を持っている。また、RISC-Vも、同様なベクトル命令セットを拡張として定義している。RISC-Vの設計者らは既存プロセッサのSIMD拡張の積み重ね、特にIntelのそれを優美でないとみている。 スーパースカラー ^ “プロセッサ開発のセンス ～第4回 ベクトル・プロセッサ～ | 株式会社エヌエスアイテクス （NSITEXE,Inc.）” (2023年2月22日). 2023年6月18日閲覧。 ^ いわゆる、「0オペランド」（スタックマシン等）・「1オペランド」（初期のコンピュータ。アキュームレータマシン）・「2オペランド」（CISCに多い）・「3オペランド」（RISCに多い）のこと。 ^ 複素数のハードウェアサポートは、ポピュラーではないが特に珍しいものでもない。 ^ 牧野淳一郎『スーパーコンピューティングの将来』25.4. 日本の時代 1990年代前半まで2023年9月9日閲覧。 ^ ASCII.jp：スーパーコンピューターの系譜　最後のベクトルマシンとなったCray X12023年9月9日閲覧。 ^ Arm SVE命令セットって美味しいの? - Qiita2023年9月9日閲覧。 ^ https://www.fujitsu.com/jp/about/businesspolicy/tech/fugaku/pickup/interview01/#anc-08 に「ベクトルプロセッサとスカラープロセッサ両方の性質を兼ね備えている」とある。2023年9月9日閲覧。 ^ 『RISC-V 原典』第8章 (pp.74-88) p.75に「ベクトルの長さとクロックサイクル当たりの最大の処理を命令のエンコーディングから分離することがベクトル・アーキテクチャの最も重要な点である」と強調がある。 ^ 『RISC-V 原典』p.85に「vfmadd213pd とは何であり、いつ使うべきかを、どうしたら覚えられようか」とある。