SATOXのシテオク日記

~ふもっふ、ふもふも~

PS3が技術的に苦しいところ

PS3/Cell BEが技術的に苦しいところをプログラマの観点で、出来るだけ簡単に説明してみたいと脳みそが思いついたわけです。はい。(つっこまれても困っちゃうわ)
PS3に搭載されているCPU「Cell」。正式には「Cell Broadband Engine」。ちょっと略して「Cell BE」と言うこともあります。
Cellは昨今のマルチコアアーキテクチャとはちょっと趣旨が異なり、CPUからするとSIMDのような位置づけ(そのままだけど)でマルチメディア処理を複数こなす事が出来るサブコアをたくさん搭載しているアーキテクチャなのです。

■PPUとSPE
Cell BEの中には1つのPowerPC系のコア(PPE/PowerPC Processor Element)と8つのSIMDサブコア(SPE/Synergistic Processor Element、SPEはALU自体がSIMD。)があります。
コア、サブコアはそれぞれ独立して仕事をする事が出来るため、これはこれで非常に強力です。
インテルCore2Duoなんかが2個のコアだとすると、Cell BEは9個のコアが独立して働くことが出来るわけです。
■SPEに仕事をさせるのは大変
PPUが9個あれば話は早いのですが、サブコアと呼ばれるSPEはちょっとくせ者。
なぜならば、SPEはPS3が搭載する256MBのXDR DRAMメモリに直接アクセスすることが出来ません。アクセス可能なのはSPEが占有する256KBのメモリ空間(Local Strage)だけ。
つまり、SPEはこの256KBのメモリに収まるような仕事しかできないわけです。このメモリの中には処理したいデータや処理されたデータ、そしてプログラムコード自身が含まれます。複雑な処理をしようと思うとプログラムコードが増え、データ処理領域が圧迫されるというジレンマが起こるわけです。
XDRメモリとLocal Strageメモリ間をどのように繋いでいるかというと、DMA*1による転送のみ。256KBのメモリ空間をDMAでとっかえひっかえ入れ替えてあげればよいわけですが、DMAリソースも有限だし、取り回しが面倒なのは間違いないところ。(ちなみに、この「とっかえひっかえ」をソフト的に面倒みる仕組みも提供されています。)
個人的にはSIMD自体が大量のデータを少ない命令サイクル数で処理していくものであるはずなので、ローカルメモリが少ないのはかなり苦しいところです。せめてLSが1MBくらいあれば………。
■PPUとSPEは命令セットが違う
SPEが直接扱えるメモリが大変狭いことを説明しましたが、もう1つ大きな問題があります。
PPUはPowerPC、SPEはSIMD命令………命令セットが全然違うわけです。つまりはPPU用のコンパイラ、SPE用のコンパイラが必要で、それぞれ出力されたバイナリコードは相互に利用することは出来ません。
アセンブラでバリバリ最適化されたソースコードはPPU用・SPE用と分かれるため、取り回しは大変なわけです。
■SPEにちゃんと仕事を与えられればよく働く
SPEの難しさを挙げましたが、SPEに効率よく仕事を与えれば独立したものが8個もあるわけなので非常によく働きます。
また、PS3にはNVIDIA製のGPU「RSX」が搭載されていますが、実のところ性能面(例えば頂点計算など)ではCell BEの方が勝っていたりします。
RSXもちょっと非力な点があるのですがそれはまぁいいことにします(笑)。
まとめとしては、Cell BEのプログラミングは大変難しいけども、うまく設計すれば非常に強力。さらにRSXもうまく使えばさらに強力なものになるけど、その処理も大変といったところです。

*1:メモリ転送を行う専用ユニット。CPUに頼らない転送が出来るのがメリット。