ローカルストアを搭載したコプロセッサはどこまでさかのぼれるのか

(Super FXチップのプログラミングチュートリアルをまとめたい話  だけど暇が無いので周辺事情から少しずつ。。)
ゲーム機におけるプロセッサは、CPU以外にベクトル処理などを行える小さいプロセッサを横に並べる構成であることが多かった。現在では、GPUを想像すれば良い。GPUで実行できるプログラムのサイズは数百から数万ステップ程度だが、非常に多くのGPUエフェクトがこのような小さなプログラムによって実現されているのは周知の通りといえる。

(要求される前提知識)

要するに以下のプロセッサはDSPであるため、DSPに関する基礎知識を仕入れればそのまま自然なこととして理解できる事項が非常に多い。
典型的なDSPとしてよく整理されたアーキテクチャを持つのは(個人的には)、Blackfinだと考えている。

もっとも、Blackfinは比較的オールラウンドなDSPであり、ゲーム機で使用されるようなものよりも複雑すぎるかもしれない。

MP3/Ogg等のデコーダとして使用されるVSDSPは規模的にゲーム機のそれに近いように思える。

SPU: PS3におけるCell B.E.


もっとも現代的な結実はCell B.E.だろう。Cellの仕様はSCEIのページから入手できる。

汎用CPUとしてはPowerPCを使用している。SPUは複数がリングバスに接続された形で提供される。この仕様は開発キットに同梱されている。

SPUの演算は全てベクトル演算となる。つまり、一つの128bitレジスタに入れた複数の値が平行して演算されるのが通常の動作となる。真に128bit幅の演算となるのはビット論理演算(ANDやOR等)だけで、加算などは32bitx4の形が最長となる。
加算などのオペレーションの結果は『連鎖的』にしか求められないため、128bitの加算器は(32bitの加算器に比べて)非常に遅くなる*1。それに比べて、論理演算は1bitずつの結果が全て独立しているため、並列して求めることが出来、128bitのANDやORを作っても大きな問題にはならない。
LSのサイズは256KBで、複雑なプログラムを動作させるためには依然十分ではない。
128個あるレジスタは、小さな数表を格納するために使うことができる。たとえば暗号化のような表引きの多い演算を数表をレジスタに置くことで高速化する。

VU0/1: PS2におけるベクタユニット


PS2は2つのベクトルユニット(VU0とVU1)を内蔵している。これらの仕様はPS2 Linux Kitの資料に同梱されている。
VU0はCPUのコプロセッサとして使用するモード(マクロモード)を備え、VU1は頂点のセットアップなど3Dハードウェア(GS)とのインターフェースを担当する。以下はマイクロモードに関して。
これは純粋にハーバードアーキテクチャを採用しており、命令用メモリがMicro Mem、データ用メモリがVU Memと呼ばれる。
Micro Memは64bit幅のメモリで、32bit命令2つを同時に供給する。VUはLIW(Long-Instruction-Word)*2型のアーキテクチャであり、UpperとLowerの2つの実行エンジンに同時にプログラムを供給するため、2つの命令を同時に供給出来なければならない。
VU Memは128bit幅のメモリで、32bit浮動小数点4つを同時に供給する。
レジスタは128bit(32x4)の浮動小数点ベクタレジスタを32本、16bit整数レジスタを16本備えている。他に、演算器の入出力を保持するための専用レジスタを備える。演算器(演算パイプライン)の出力を直接レジスタに格納するのではなく、一旦演算器のレジスタを経由することになる。
一部のパイプライン(初等関数ユニットや除算器)は非常に時間が掛かるのでパイプラインを待つための命令が存在する。
Upperは4つのFMACを持つ。つまり行列演算のために使用される。
Lowerは初等関数ユニット(sinやatan等の演算)、整数演算やロードストアなどの比較的高度な演算を行う。
CellのSPUとよく似ていることがわかる。簡単にわかる大きな差は、VUはLIWなのに対し、SPUはどちらの実行ユニットに命令を発行するかを自動的に判断してくれる点。これは、片方にしか発行できない命令が続いたようなケースで命令の密度を上げることが出来るが(VUの場合、もう片方が無駄な命令で埋まることになる)、多少のハードウェア増加を招く。

TomとJerry: Atari JaguarにおけるDSP

JaguarPS2と同様にDSPを2つ搭載している。ただし、Jaguarの場合、DSPの片方(Tomに内蔵されている方)は音声処理のために使用する。両者には多少のOPコードの違いがある。
Jaguarは他のコンソールと同様にDSPだけでなく汎用のコア(68000)も搭載している。
32bitレジスタを64個持っているが、レジスタは2つのバンクに分割されている。また、スタックポインタなどとして幾つかのレジスタが消費されている。
ローカルストアは32bit幅の1024ワード(4K)で、(当然)32bit幅のアクセスしかできない。
演算器は基本的に整数演算となっているが、浮動小数点演算を補助するための命令が多少ある。また、16.16の固定小数点除算をサポートしている。
DSPのパイプライン構造に関する明確な資料は無い。単純な(MIPSのような)RISCパイプラインを採用している。
ちなみにJaguarGPUという用語を95年までに使用している。これはGeForce256(99年)よりも早い。ただし、JaguarGPUはプロセッサそのものではなく様々な周辺回路も含んだUnitとして定義されている。

以降

Super FXやAmigaのBlitter/Copper、AtariのMathboxあたりか。。

*1:キャリー先読み加算器等が状況を改善するが、今度は回路規模の増大を招く。http://journal.mycom.co.jp/column/architecture/070/index.html

*2:VLIWからVeryを取った物。