Hack the Cell '09 に参戦します
PS3でLinuxが動く! SPUとかいう面白いプロセッサのプログラムを自分で書いて動かせる!ということで、 KLabでもPS3を購入していたのですが、最近あまり有効に活用されていませんでした。
何か良い使い道無いかなと思っていたところ、 Fixstars が開催している "Hack the Cell '09 - Cell Programming Contest" を見つけて、他の社員も誘って参加することにしました。
私はSPUのプログラムを書くのは初めてだったのですが、Fixstars,SCEI,IBMのサイトの情報を参考にしながら C言語拡張機能を使ってSPU SIMDのプログラムを書いてみました。
触ってみた感想ですが、まず、32bit固定長の3オペランド命令群と128bitレジスタの組み合わせが 非常に気持ちいいです。今まで触ったことのあるCPUは2オペランドマルチバイト命令ばかりだったので、 3オペランドだとmov命令が要らないのが新鮮でした。C言語上で spu_??? という関数を使うと、ほぼ1対1で 機械語に置き換わっていき、あとはコンパイラが適切にレジスタ割り当てやパイプラインを意識した 命令語順の並べ替えを行っていきます。 spu_timing というツールでパイプラインの利用の仕方を可視化することができ、 Dual Issue(2つのパイプライン両方への命令発行に成功した状態)がきれいに並んでいると胸のすくような思いです。
また、予測不可能な割り込み、キャッシュミス、TLBミス等が存在しないので、同じコードを同じ条件で動かすと 必ず同じクロック数で完了するのも面白いです。 x86 ではCPUの種類がたくさんあるので、あるCPUに最適化すると 他のCPUで遅くなることがあり、早い段階で「これ以上最適化しても意味ないや」と満足してしまっていました。 SPUでは数%、数サイクルの最適化まで詰めていくことができますが、そうすると「これ以上命令削れない」と 思っていた部分が後のひらめきで削れたりするので、今まで自分がどれだけいいかげんに「最適化」という単語を 使っていたのかを思い知らされました。
3/20の結果発表後、入賞したKLab社員による参戦レポートをこのBlog上で公開していくつもりです。 3/6の課題提出締め切りまでまだ時間があるので、腕に覚えのある方は一緒に挑戦してみませんか?
