ベクトルプロセッサのアーキティクチャ
ホントに知られていないとわかりました。
で、知らずに色々と言っている人達が大勢いることもわかりました。
とあるベクトルプロセッサの構成をプログラマの視線で説明したいと思います。
元ネタは実在した(どこかで健気に稼働してたらご免)スーパーコンピュータのお話です。
思い出すのにマニュアル「HITAC S-820処理装置」がどこかに転がってないかな?
一番の特徴(特長と書かない点に注意)は、ベクトルレジスタの存在。
VR0からVR15まで16本のベクトルレジスタが…あれ?VR7までの8本だっけ20年も経つと覚えてないや。
単位が「本」なんです。1本のベクトルレジスタに浮動小数点レジスタが512個入ってます。
あとフラグレジスタ(PSWだっけ?20年も…以下略)も1本あって、
普通の(笑)フラグレジスタが512個入っています。
でも、これじゃ何故速くなるかさっぱりわかりませんよね。
性能のキモを説明するために何か処理例を挙げましょう。
ある計算が2,000セット必要で、1セットの内容が「A×B+C→D」としましょう。
2,000セットあるのでAが2,000個、B、Cも2,000個あり、計算結果も2,000個出てきます。
メモリ上にA、B、C、Dを用意するのは、スカラープロセッサ(HITAC Mシリーズと同義)での普通のプログラムです。
ハードディスクからメモリにデータを移動させるのに専用のプログラムを作るのは開発費の無駄ですから
計算以外の処理は開発済の処理装置にやらせます。OSとアプリケーションは互換性100%って訳です。
※この説明での「スカラープロセッサ」は一般の処理装置のことです。スーパーコンピュータではありません。
面白いことにベクトルプロセッサを使うプログラムは、スカラープロセッサの命令が普通に並んでいます(笑)。
で、2,000セットの計算をさせたい段階まで来ました。命令の順番は確かこんな感じ。
これからベクトルプロセッサを使うよ。
セット数は2,000セット
1セットの内容は
VR0は、Aのメモリから。
VR1は、Bのメモリから。
VR2は、Cのメモリから。
VR0×VR1+VR2→VR3 ※これは「積和計算」といって1命令になってます。シミュレーションに使われるのかな?
VR3は、Dのメモリへ。
1セット終わり。
(ここまで処理が進むと、1セットの計算方法が確定するので、準備します。
だって1セット毎に計算方法をデコード(命令を解釈)していると遅いから。
あくまでも推測ですけれど、動的に電子回路を組み直してトコロテン式に計算結果が出るようにしてると思っています。
現代のFPGAみたいなことを、原始的かつ高速に。<野武士だからね)
はい、計算!
ここで、2,000セットの計算は完了しています。
レジスタが512個しかないのに2,000セットの計算をどうやって?ベクトルプロセッサは2,000セットとわかっているので
自動的に512+512+512+464の4回に分割して計算します。だから512個というレジスタ数はプログラム上に出てきません。
実は512個というのはS-820/80での個数なので、例えばS-820/20(128個モデル)でも同一プログラムを使えるように工夫しています。
処理時間のかかる所はVRとメモリの転送なので、一度VRに持ってきたデータ(例ではA、B、C)は何度も使うと、転送回数を減らせるし、
VRにできたデータ(例ではD)はメモリに入れる前に何度も使うと、同様に転送回数を減らせます。
という訳で、ベクトルレジスタ上での計算「VR0×VR1+VR2→VR3」といったものをできるだけ連続して行なうと性能が向上します。
それをサポートするための命令がちゃんと用意されています。
コンパイラ(当時はFORTRAN…今、笑った奴、ちょっと表へ出ろ。おまえのアセンブラより速いコードを吐くって知らんだろ。)は
できるだけ1セットに処理を押し込みます。当然、プログラマも1セットに入るよう工夫します。
納期前の最後の性能向上で3日かけて2セットを1セットに統合したときはうれしかったなぁ。それだけで性能が数%あがったもん。
このページを作っていて、20年前のプログラムの立場がようやくわかった。
当時はプログラムの立場とか考えたこともなかったです、はは。
よくまあ私1人に開発させたもんだ。会社の度胸もスゴいと思う。<丸投げとも言う。