コケスレに書いたCELLのクッタリまとめ
コケスレにてGKの"PS3はスパコン"発言から始まった技術論議が落ち着いたので、結果を纏めてみます。
長いので続きを読むで。
SPEのDMA・リングバス
発端
この記事で、
もちろんSPEからの256MBのXDR DRAMメインメモリに対する読み書きは可能だが、MFC(Memory Flow Controller)と呼ばれるメモリコントローラ内のDMA(Direct Memory Access)ユニットを介してバルク単位(複数個)のアクセスが基本となる。つまり、いわゆる通常のCPUのメインメモリアクセスとは異なり、多大なレイテンシ(非公開)の発生を覚悟して行なう必要がある。
"非公開になるほどレイテンシが悪いのか?"と話題に。
DMAコントローラー×7の悪夢
住人が"7つもDMAコントローラーがあったら互いにバス使用権を奪い合ってまともに動かないのでは?"と言うことを指摘。
DSPでもDMAコントローラーはありますが、Cellのような独立したDMAコントローラーが複数有るなんていう方式を使っている所はなくて、大抵1つのコントローラーにプライオリティーキューが複数有る方式です。
これについてバスを調べると別の驚くべきことが明らかになります。
リングバス
CellのCPU内部バスはEIBと呼ばれる2組のリングバスです。
http://www.watch.impress.co.jp/game/docs/20050316/ps304.htm
リングバスはATIの新型GPUでも使われている方式で、一定方向に流れるリング状のバスを使い、クロスバースイッチに比べて配線を容易にするものです。
ATIのリングバスの解説記事
それに対して、中央化されたメモリコントローラは、多くのユニットと接続する必要がある。そのため、チップ上で比較的センターに近い場所に配置されることになる。クロスバースイッチになると、必然的にチップ上のデータバスの引き回しも長くなる。だが、リングバスを使うことで、データバスについてはDRAMコントローラ間を結ぶだけにするなら、配線はより容易になると見られる。
もっとも、リングバスにもいくつか問題点はある。最大の課題はレイテンシが増えることだ。しかし、GPUではそれは大きな問題ではないという。
GPUは各スレッドに相関があまりないのでスレッド数を増やしまくることでレイテンシを隠すことができますが、CPUの内部バスでレイテンシが大きく(最低でも経由ストップ分だけはかかる)しかも安定しない(混み具合によって変化する)っていうのは致命的では?
しかもSPEのDMAへのリクエストなどもこのバスを通らなければならないので、最適化は人間の手では不可能で優秀なコンパイラが必須であると言えます。
なぜかメモリ-GPU間の転送もCPU内部バスを通過する
先ほどの図をもう一度見てください。
メモリコントローラーとメモリインターフェースのXIOは向かって左側にあります、周辺機器(GPU)とのインターフェースであるFlexIOは向かって右です。
この二つをつなぐインターフェースはEIBリングバスしかありません。
つまりCellはメモリ-GPUと言う転送をしようと思ったらそのデーターがプロセッサの内部バスを通過すると言う意味不明な設計になっています。
プログラマは、
- SPEでの処理時間
- PPEそのもののアクセスで生じるリングバスの混雑具合
- SPE-DMAアクセスでのリングバスの混雑具合
- メモリ-GPU間のデータ転送による混雑具合
を考えつつ、プログラミングしなければならないのか?と。
普通に死ねそうです。
メモリ-周辺IC間のアクセスには普通専用のパスを用意するものだと思うのですが…
分岐予測がないSPEの悪夢
PPEが全部面倒を見る方式ではなく、SPEそのものにローカルOSを走らせるプログラミングモデルも提唱されているのですが、分岐予測がない(これはPPEも同じ)SPE上でOSがまともに走るんですか?
確か分岐ペナルティは18クロックとかなり痛手だったと思うのですが…
プログラマorコンパイラorミドルウェアの苦悩
レイテンシは安定しない、分岐は弱い、片方は整数演算が弱くもう片方は浮動小数点が弱いヘテロコア…
こんな状況でまともに動くミドルウェアorコンパイラが製作できるのか?
Cellはどんなアプリケーションに向いてるのか
- 分岐予測がないのでできるだけ分岐せず
- SPE256KBメモリ縛りが有るのでなるべくプログラムとデータは軽く
- 浮動小数点ONLY
…動画のデコードぐらい?
少なくともゲームには向いてない。
結局理論性能はすごい(ベンチを走らせればすごい)が、実際のアプリには役に立たないと言うCPUに見える。