|
ベクトル計算機 (ベクトルけいさんき) は、ベクトル演算(SIMDを参照)を行うことができるコンピュータのこと。特に(狭義では)ベクトル演算のための高性能でパイプライン化された実行ユニットを持ち、その演算能力を可能な限り発揮できるように全てが設計されたアーキテクチャを持つスーパーコンピュータを指す。広義にはSIMDによる、ベクトルを対象とした並列演算も指す。メインフレームにもベクトル演算機能を持っているものがある(NECのACOS-6の一部など)。以下、主に狭義の、すなわちパイプラインによるベクトル計算機について述べる。 ベクトル計算機のプロセッサを ベクトルプロセッサ(''Vector Processor'')または アレイプロセッサ(''Array Processor'')と呼ぶ。ベクトルプロセッサは数値演算を複数のデータに対してパイプラインにより次々と実行することができる。ベクトルプロセッサは科学技術計算分野でよく使われ、特に1980年代から1990年代にかけてのスーパーコンピュータでは一般的であった。現在、ベクトルプロセッサを名乗るプロセッサは少ないが、SIMDと呼ばれるベクトル演算を行う機能を備えたマイクロプロセッサは多い。ただし、それらが対象とするのはグラフィックスやマルチメディアのための計算である。200x年代後半頃から、GPGPUによる汎目的計算が行われるようになってきている。 == 概要 == 一般的なコンピュータのプロセッサは同時に1~2個のデータしか取り扱うことが出来ない。例として「AとBを加算しCに代入せよ」といったようなプログラムを考えよう(A、B、Cはいずれもメモリにある変数とする)。だいたい、CISCであれば「Copy , R1」「Add , R1」「Copy R1, 」といった感じの機械語命令で、RISCであれば「Load , R1」「Load , R2」「Add R1, R2, R3」「Store R3, 」といった感じの機械語命令で、だいたいどちらも数個の命令により、数個の値(スカラ値)を操作している。 ここで、AやBやCというデータはメモリに保持されるものであり、メモリアドレスによりidentifyされる。アドレスをデコードし、メモリからデータを取り出すには一定の時間が必要となる。プロセッサの高速化に合わせてバスやメモリを高速化(正確には速度(スループット)だけでなく低レンテンシであることも重要)することは不可能であったため(フォン・ノイマン・ボトルネック)、「周辺がプロセッサに追いつかない」ということが問題となる。 また、プロセッサにおける命令の処理は「命令パイプライン」で行われる。最初のサブユニットがアドレスを読み込み、デコード、次のユニットがアドレスからデータを取り出し、その次が演算を行う仕組みである。パイプラインの仕掛けは、まるで組立ラインのように一つ目の命令が終わる前に次の命令をデコードし始めることで、アドレス・デコーダは絶えず使用され続ける。 一方で科学技術計算において必要な大量の計算では、ベクトルの加算のことを考えてみればわかるように、配列のそれぞれのデータに対して、一斉に同じ演算をするようなものが多い。これを効率的に処理するには、命令を「アドレス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はその構成要素が全て同時に最高の性能を発揮し続けるようにプログラミングが可能である。 以上により、ベクトル計算機は大量のデータに同様の処理を繰り返すときに最良の働きをする。他にも大規模並列機には通信が大量に発生するといった理由などから向かない、といったものもあり、ベクトル計算機はスーパーコンピュータが利用される施設の中でも、数値予報や数値流体力学のような膨大な演算を行うサイトで採用されている。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「ベクトル計算機」の詳細全文を読む スポンサード リンク
|