Cellプログラミングのレポートについて

西川善司さんの"CEDEC 2006 - CellプロセッサをGPU的に活用することができるのか"がCellでのプログラム設計とGPUのソフトウェア処理として面白かった。

演算能力だけでいけばGPUに匹敵するものだけど、実際に処理させると専用ハードウェアと差がでるものだな。やはり原因は画像処理には大量のメモリアクセスが生じるのだけど、DMAにメモリアクセスを任せるCellはレイテンシが生じてしまって演算器が遊んでしまう。ATIのGPUのように届いたデータから演算器に渡せれば良いけどPPUの処理能力が弱いから無理で、SPEは自立的にメモリにアクセスする必要がありそうだ。

メモリアクセスのレイテンシを抑えるためにデータを溜め込むにはSPUのLSが256kBと小さいのも苦しい。SPUを並列に使うのをやめてパイプラインにできれば、プログラムにつかう領域を減らすことができる。しかし、この場合プログラムをキリの良いところで分割する必要があるので演算器をぎりぎりまで使えなくなるかも、少なくともバランスをとるのがが非常に難しくなる。演算力は無駄に多いから、ある程度犠牲にしても良いかな。

プログラムとしては、もう少しデータ量の少ない処理が良さそう。ポリゴンの生成あたり十分な性能が出ているので、行動アルゴリズムや認識、インタラクションありの物理演算をさせるとかだろう。そうするとプログラムが複雑になるから、分岐予測ユニットをつけなかったのが痛い。それと、メモリやSPU間のDMA転送をデフォルトで使っていてはレイテンシの影響が予測しきれずモノにならない。各SPUの使い方をある程度固定化して、アクセス優先順位をDMAで設定したフレームのようなものを作るべきだろう。たしかDMAはある程度設定できた筈だけど、他で工夫する前に基礎的な部分をチューニングすべきでは。

追記:
たるさんのパソコンフィールドでCellの科学演算ベンチマークからメモリ帯域と演算力を評価している。http://www.ne.jp/asahi/comp/tarusan/main148.htm

科学演算では、要素ひとつに対する演算が単純である一方で非常に多い要素数を満遍なく処理する。そのためキャッシュが効きにくくなりメモリ帯域依存的な結果をだす。レポートの評価をまとめると、

  1. いままでのプロセッサと比べて、Cellは短精度では比較にならないほど、倍精度でも数倍処は理能力が高い。
  2. メモリ帯域に依存するようなベンチマークでは短精度の1/14の処理能力である倍精度でメモリ帯域とバランスが取れる。
  3. 規模の大きいFFT(行列処理)で効率が上がり、スカラプロセッサとベクトルプロセッサの中間のような性質を持つ。

3.はなかなか面白い。Cellの演算器自体は1命令で2つデータを処理するので、最近のスカラプロセッサにも含まれるSIMDと同じ。だから、この性質の違いはキャッシュを持つかローカルキャッシュを持つかの違いによって生じている。最新のスカラプロセッサのキャッシュは先読みする機能がつき効率も上がっているはずだけど科学演算には向かないようだ。小さいローカルキャッシュだけど有効に機能している。

Cellの短精度処理ではメモリ帯域の制限に為に効率が1-10%あたりしか出ていない。一般プログラムでは、もっとキャッシュ(LS)が利くからここまではひどくないと思う。でも科学演算では隠蔽しやすいメモリアクセスのレイテンシの問題も出てくるから、メモリアクセスを極力抑える事を最優先にプログラムを組むのが正しそうだ。それから計算の省略だな、一般のプログラムと順番が逆になる。