2009年1月3日土曜日

LSとレジスタ

最近、Cellでまたプログラムを組んでいる。今回は、あるニューラルネットみたいなもんなんだが、今までになく、演算が軽くてデータ転送は多い。

なんとか、データ転送が律速にならないように、まとめてLSに転送したり、何回も利用したりして、なるべく転送を減らしている。

そうこうして、LS<->DRAM間のDMA転送はかなり量を減らして、こりゃいけると思ったら、今度はLSからレジスタへのロード/ストアが律速になっていることが判明。

LSとレジスタの間の転送量ってそこまで気にしてなかったので、調べるとどうやら片方向16B/cycleらしい。

ということはだ、spu_maddで、毎サイクルLSにある違うベクトルに対して、2命令同時実行で読み書きはできないっちゅうことだ。なんてこったい!

これは結構きつい。まえから、なんとなく、うすうす感づいてはいたのだが、そこまでロードと演算の比が厳しいアプリケーションは今までなかったのだ。画像処理で少しあったけど、ここまで厳しくはなかった。

それで、いろいろどうすっぺかとコードを見て、結局なるべくレジスタにデータを乗せといて、ぐるぐる使えるようにするのがいいということに行きつく。うう…、辛い。だって、のせないと性能が1/5~1/10とか平気で落ちるが、そんな努力をしろと(涙)。しかし、いろいろやってるとちょっとずつ改善したりして、なんだかんだいって、まだいける、まだいけると、どんどんどつぼに。

どうやら、Cellのスカラデータのロードストアはかなり遅いらしい。たしかに、スカラデータを使っていたら、予測以上に性能が落ちていて謎だったのだ。

そんでスカラをベクトルデータにしたりするが、今度は、LSの容量が足りなくなってくる。

はー、もういや

0 件のコメント: