ベクトル計算機

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ベクトル計算機 (ベクトルけいさんき) は、ベクトル演算を行うことができるコンピュータのこと。通常は、ベクトル演算のための専用のハードウェアを持つスーパーコンピュータが該当する。また、メインフレームにもベクトル演算機能を持っているものがある(NECACOS-6の一部など)。

ベクトル演算を行うプロセッサベクタープロセッサVector Processor)または アレイプロセッサArray Processor)と呼ぶ。ベクタープロセッサは数値演算を複数のデータに対して並行して実行することができる。ベクタープロセッサは科学技術計算分野でよく使われ、特に1980年代から1990年代にかけてのスーパーコンピュータでは一般的であった。現在、ベクタープロセッサを名乗るプロセッサは少ないが、SIMDと呼ばれるベクトル演算を行う機能を備えたマイクロプロセッサは多い。ただし、それらが対象とするのはグラフィックスやマルチメディアのための計算である。

歴史 [編集]

歴史上最初の実動したベクトル計算機は、1960年代のウェスティングハウス社が行ったSolomonプロジェクトである。Solomonの目標は数値演算の性能を劇的に向上させることであり、そのために多数の単純な数値演算用演算装置をひとつの制御装置に接続した。クロックサイクル毎に制御装置はひとつの命令を全演算装置に送り込むが、それぞれに演算対象として異なるデータを渡した。これにより Solomon のマシンではひとつのアルゴリズムを配列の形式で用意された多くのデータ群に適用することができた。1962年、ウェスティングハウス社はプロジェクトを中止したが、その成果はイリノイ大学でのILLIAC IVへとつながっていく。ILLIAC IV の設計は 1GFLOPSマシンと呼ばれ、256個のprocessing element(PE、演算装置)を装備するはずだったが、1972年に完成したときには 64個しかPEが装備されておらず、性能も 150MFLOPS しか出なかった。とは言うものの、基本コンセプトは有効であることを示し、特に多量のデータを扱う計算流体力学などのアプリケーションを実行した場合、(予定通りに実装できなかった)ILLIAC は世界最高速であった。

初めて予定通りに実装されたベクトル計算機は CDC STAR-100テキサス・インスツルメンツ社の Advanced Scientific Computer (ASC)である。ASC の演算装置はひとつのパイプラインを持ち、スカラー演算もベクトル演算も共通のパイプラインで処理した。そのピーク性能は 20MFLOPS であり、非常に長いベクトルを実行したときに達成できた。拡張構成ではパイプラインの本数を2倍、4倍にして、ピーク性能も 2倍、4倍となった。メモリバンド幅は拡張モードをサポートするのに十分であった。STAR は CDCの従来のスーパーコンピュータ CDC 7600 と比較すると遅いと言わざるを得ないが、データ量が多いタスクを扱った場合の価格性能比は良かった。STAR はベクター命令をデコードして処理の設定をするのに極めて時間がかかっており、性能を出すには特殊なデータの設定を必要とした。

この技術は有名なCray-1で完成された。STARやASCのようにデータをメモリに置いておくのではなく、Cray は8本のベクターレジスタを持ち、各レジスタは64×64ビットワードで構成されていた。ベクター命令はそれらレジスタ間の演算を実行した。これはメモリからデータを取ってくるよりもずっと高速に動作した。また、この方式を取ることにより、ベクター命令をパイプラインで並行して実行することができた(この技術を vector chaining と呼ぶ)。Cray-1 は平均的に 80MFLOPS の性能だったが、ベクター命令を3個チェインさせることで最高 240MFLOPS を記録した。

次の例は CDC が再挑戦した ETA10 マシンであるが、このマシンはほとんど売れず、CDC がスーパーコンピュータ市場から撤退するきっかけとなった。多くの日本の企業(富士通日立製作所NEC)が Cray-1 に倣ったレジスタベースのベクトル計算機を開発した。これらは、高速で小さいことが特長である。また、Floating Point Systems(FPS)はミニコンピュータ向けのアドオン・アレイプロセッサを開発した。後に FPS 自身も ミニスーパーコンピュータ を製造している。クレイ社は、その間も性能のトップを走り続け、Cray-2Cray X-MPCray Y-MP とマシンをリリースしていった。その後、スーパーコンピュータ市場はベクタープロセッサの実装の改良よりも超並列プロセッシングに焦点が移っていった。日本メーカでは、富士通がVPPシリーズのVPP5000を最後に、日立がHITAC S-3800を最後に、超並列スカラ型に移行し、日本電気のSXシリーズのみが、スーパーコンピュータ市場に残るベクトル計算機となっている。

一方で、コモディティ化したパーソナルコンピュータにおいて、例えば動画データの再生を行う時など、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(まとめて結果を保存)

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

このような算術演算ではメモリからデータを取り出す時間ははるかに限定的となり全体的なパフォーマンス向上につながる。

しかし、すべての問題がこの種の手法で潰せるわけではなく、プロセッサにベクトル命令を加えることは煩雑さにつながり、数字が予め一列に並んでいない場合は逆に処理全体が遅くなってしまう。煩雑な命令体系はデコーダそのものの単純化も妨げ、通常の加算のようなごく簡単な命令でさえデコードに時間を要する場合もある。

実際のところ、ベクトル計算機は大量のデータに同様の処理を繰り返すときに最良の働きをする。こういった理由からスーパーコンピュータが利用される気象予報センターや物理学研究所のような膨大な量のデータ処理を行う現場に向いているとされる。

関連項目 [編集]