ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

The Cray X-MP/Model 24

久しぶりにまとまった時間が取れたので、Lecture Note in Compluter Science シリーズのThe Cray X-MP/Model 24 : A Case Study in Pipelined Architecture and Vector Processingを読みました。高速化のための割り切りがFPGAにおける回路設計にも役に立ちそうで、とても面白かったです。

Wikipediaによると、Cray XPは1983年から1985年の間に最速を誇った、クレイ社初のマルチプロセッサによるスーパーコンピュータです。SIMD形式によるベクトル演算を基本とし、処理速度を上げています。Cray XPが開発された1980年台前半は、MIPSプロジェクトの開始時期とも重なります。メモリへのアクセスをロード/ストアに限定する、パイプラインを効率的に動かすという共通点はありますが、設計思想と結果出来上がったアーキテクチャはかなり違う物になっています。パタヘネを読みながらパイプラインを比較してみるのも面白いでしょう。

参考:http://ja.wikipedia.org/wiki/Cray_X-MP

Crayのベクトル演算

ベクトル演算は、このような形で行われます。

A1 53         # A1レジスタに53を入れる
VL A1         # ベクターの長さを指定するVLレジスタに53を入れる
V4 V2 + V3    # V2とV3の和を取ってV4に入れる。

あらかじめレジスタの配列にV2、V3にデータが入っていれば、この3命令で53個分の加算が行われます。処理に必要な時間はベクターの数(53)+3クロックで56クロックになります。一般的なSIMDが並列のデータ数によってクロック数が変わらないのに対し、Cray XPでは処理するデータの個数によって処理速度が変わります。

一般的なSIMDでクロック数が変化しないのは、並列度の数だけ並んでいるALUが同時に動作しているからです。それに対して、Cray XPのベクター演算はパイプライン化されているALUに順にデータを入れているので、データ数+定数で全データの処理が完了します。

レジスタで処理数を指定してひたすらパイプラインに入れていくというのはFPGAでもよく使う回路構成です。高いスループットを保ちながらALUの数は抑え、パイプライン化されることでクロック周波数を上げることができます。

高速化のためにハードウェアを単純にする。

Cray XPのアーキテクチャレジスタの直交性がありません。アドレス指定に使うレジスタはAレジスタしか使えませんし、ベクトル演算をするためにはVレジスタに一度データを入れる必要があります。設計当時に直交性に関する議論があったのかどうかは分かりませんが、今の感覚で見ると使いにくいプロセッサの部類に入りますが、こうすることでハードウェアを単純化しクロック周波数を上げています。

マルチプロセッサの制御も非常に単純化されています。排他制御用用のTest And Set命令は専用のレジスタを使用します。最近のプロセッサがどこのメモリでもTest And Set動作が出来る事に比べるとハード構成は楽になっています。メモリアクセスの優先順位もシンプルでCPU0が常にCPU1よりも優先されます。

メモリ構成

Cray XPはマルチプロセッサでありながら、ローカルキャッシュやローカルメモリを持ちません。CPU0とCPU1が共通のメインメモリを持ちます。メインメモリ、レジスタ間の転送はインタリーブ化されています。メモリの並びと命令によっては、上手くインタリーブできるケースとできないケースが出てきますが、これはインタリーブできるようにメモリ配置と命令を最適化するというのが正しい使い方でしょう。

Cray XPのアーキテクチャから学べること

一番大きな所でパタヘネ病からの脱出があります。
http://twitter.com/okuoku/statuses/764939966
レジスタには直交性が必要で、パイプラインは一定でなければならず、キャッシュがパフォーマンスのキモとなっているという固定観念を持ってしまった人には良い刺激になるはずです。

FPGAを使った専用プロセッサを作る場合、MIPSアーキテクチャよりはCrayのアーキテクチャに近い物ができるはずです。私の経験でも同じような回路構成を見たことがあります。レジスタをCPUレジスタではなくRTLのレジスタと見た場合で考えた時、

レジスタに処理の先頭アドレス、処理の長さ、処理の内容を書き込む
レジスタのライトで、メモリから内部レジスタにデータを転送する
・パイプラインでデータの処理を行う。
・内部レジスタの処理後データを、メモリに書き戻す。
・ステータスを更新し、終了の通知を行う

とう構成になります。汎用的な回路ですとこれにPortの概念が入ってくるでしょう。この一連の流れとCray XPのアーキテクチャは、設計思想としては同一の物です。Crayを語るときは、MIPSx86といったアーキテクチャの比較ではなく、特定の計算のための専用プロセッサとして見た方が理解しやすいです。Cray XPの中には高速FPGA回路設計のヒントがいっぱい詰まっています。

The Cray X-MP/Model 24 の本自体は、リファレンスマニュアルのような物とは違い、設計思想と動作について簡単に説明しています。簡単な説明の中にも、全ての機能でベストケース、ワーストケースの説明があるのが素晴らしいです。実際にFPGAでシステム設計をする場合ワースト時の性能見積もりは避けて通れません。回路構成も単純な部類に入り、メインメモリの大きささえ何とかすれば、FPGAでも簡単に作れそうです。