NUONのVLIWアーキテクチャ

NUONというゲームハードは耳慣れないかもしれないが、DVDプレーヤの付加機能としてのゲーム機能を提供することを目的としたアーキテクチャで、同世代のハードウェアであるPS2よりも先鋭的な並列VLIWアーキテクチャを採用していた。

NUONのSDKはWeb上で公開されている。公式サイトは既に消滅しているが、いくつかのミラーが有る。

いくつかの動画がアップロードされている。特にリアルタイムレイトレースデモはNUONの特徴的なサンプルの一つ。

チップアーキテクチャ

(↓の2枚の出典 : NUON(TM) Multimedia Architecture Programmer's manual)

NUONはMPE(Media Processor Element)と呼ばれるVLIWコア4つを中心に構成されている。MPEは7-wayのVLIWコアで4kb〜8kbのローカルメモリを持ち、MPE0とMPE3はこれらをキャッシュとして使ってメインメモリ上のプログラムを直接実行できる。MPE1/2はローカルメモリ上のプログラムしか実行できない。
MPE0はさらに定数テーブルROMも内蔵している。
バスは3つ有り:

  • Main: 32bit巾、216MB/sec。データストリーミングのためのバスで、8MB(以上)のSDRAMが繋っている。NUONはいわゆるUMAアーキテクチャを採用するため、テクスチャやzバッファへのアクセスもここを経由する。
  • Communication: 32bit巾、172MB/sec。128bitパケットを相互にやりとりするためのバス。
  • Ohter: 16bit巾、108MB/sec。こちらにも8MBのSDRAMが有り、データのバッファに使用する。

MPEの内部は以下のように図解されている。

  • ECU: Execution Control Unit
    • 命令フローの分岐を専門に行う。bra/jmp/jsr/rtsの4命令しかない。
  • RCU: Register Unit
    • RCUは8086のLEA命令のように、レジスタに対する参照の演算を行う。
    • 境界チェック機能を持つ。
    • RCUは通常の命令と独立して2つのレジスタ減算を行うことができる。この2つを加えて、7wayということになる。
  • ALU
    • ALUは通常の32bitALUで、通常のフラグ(ZCVNの4つ)を持つ。
    • いわゆるバタフライ演算用の専用命令を持つのと、ビット操作命令を豊富に持つのが特徴か。
    • ベクタ(16bitx4)加減算も持つ。
  • MUL: Multiply Unit
    • 32x32のスカラ乗算と16x16x4のベクタ乗算を持つ。
    • 乗算、ドット積、加減算の命令(6 op)しか持たない。
  • MEM: Memory Unit
    • いわゆるLOAD/STOREを行う。
    • ビット反転命令(mirror)が有る。

命令は"命令パケット"と呼ばれる単位で発行され、16bit - 128bitの可変長となっている。

開発環境

開発環境はecgs(初期)またはgcc2.95ベースのものが提供された(C/C++)。
NUONはCOFFを採用している。NUONは新規アーキテクチャなので、これといって選択の要因は無いように思う。
アセンブラはgasを使わず、LLAMAという独自のものを使用している。(この命名から、これはVLMやTempest2000で知られるJeff Minterの作でないかと思う。http://www.vmlabs.de/team.htm によると、Jeff Minterはチップデザインを手掛けている。)
このシステムの特徴的なところは、アセンブラが命令のスケジューリング等の最適化を行うという点にある。つまり、GCCが基本的な命令ストリームを生成はするが、後段のアセンブラが実際の命令スケジューリングを行う。対して、GCCを採用した通常のプラットフォームでは、命令のスケジューリングもGCCが行うのが普通となっている。
GCCを採用した(とされている)他のVLIWプロセサにはCrusoeが有るが、Crusoeのコードはあまり最適化されているとは言い難いように思える。いわゆるGPUVLIWを採用していることもあるが、ATIであればAMDIL、nVIDIAであればPTXという中間言語を経由している。
(Multiflowのような)伝統的なVLIWコンパイラと密接に連携してデザインされるのが普通だが、このようにアセンブラ側にコードスケジューラを持たせるのは折衷案としてはかなり現実的に思える。
ライブラリは基本的だが、多くはソースコードが提供されている。OpenGL風の3Dグラフィックスライブラリも提供されるが、これはアセンブラで書かれたソフトウェアラスタライザで構成されている。NUONは3D専用のハードウェアを殆ど持たない(DMAコントローラにZバッファ機能は統合されている)。
SDK自体は非常に詳細なプログラミングが可能なようにデザインされているが、通常のアプリケーションプログラマは、あたかも専用ハーウェアを操作するかのように個々のソフトウェアライブラリを利用するよう期待されている。MPE0とMPE3は通常のプロセサのように使えるし、SDKでは将来の拡張に備えるようにいくつかの警告が為されている。

教訓

NUONは統合シェーダの先駆けとも言える先進的なデザインを持っていたが:

  • 政治的に良くなかった。NUONに参入したサードパーティは殆どいない。
    • NUON向けに出たゲームは数本しか無いので、唯一の"本体バリエーションの方がソフトよりも多いゲーム機"かもしれない。
  • パフォーマンスがイマイチだった。当初57MHz、次世代でも108MHzのクロックしか無く、バスの帯域も十分でなかった。
    • これは汎用のメモリを使用することによる限界で、PowerVRのような省帯域のアーキテクチャを模索する必要が有っただろう。しかし、Jeff MinterがJaguarやこのNUONでやったように、フルスクリーンエフェクトを多用した絵作りでは省帯域にするのは非常に難しい。
  • 拡張性を担保するためにデザインが保守的であった。
    • マルチベンダのゲーム機は過去に一度も成功していない。

というわけで市場での成功を収めることはできなかった。
NUONのデザインコンセプト、つまり汎用DSPを載せ、柔軟な描画処理を期待するというアーキテクチャはなかなか成功しづらい。Jaguarも成功していないし、Nintendo64PS3も大成功と言える状況にはなっていない。