Ocelot : Binary translator for PTX.

by syoyo

(via gpupapers)

ocelotfigure.png

http://code.google.com/p/gpuocelot/

http://code.google.com/p/gpuocelot/wiki/References

(papers)

CUDA で使われている PTX(中間言語表現)の、バイナリトランスレータ.
名前は Ocelot.

PTX の時点で、プログラムは並列性を生かしたものになっているので、
要は PTX コードを変換するツールを書けば,
高級言語(CUDA)の段階からうまーく並列化されたコードが書けていろんなプラットフォームで動かせるぜ、という発想らしい。

PTX へのバイナリトランスレータを作ることで、

– PTX のスレッド階層はメニーコアにもマップ可能
– 変換のテクニックは、メモリレイテンシの隠蔽にも使うことができる。
– GPU データ構造を効率的にエミュレートしたり似たようなプロセッサにマップできる

なことを示している。
例として、PTX -> SPE(Cell) アセンブラへのバイナリトランスレータを作り、
うまくいったということを示している.

Binary Translator であることの利点

Ocelot は PTX のバイナリトランスレータでり、既存の MCUDA などの CUDA を CPU で動かすなどの手法と比べて以下の 2 点の利点があると述べている.

– スレッドの階層レベルをランタイム時に動的に割り当てることができる.
– 実行時情報を利用して、hot path 最適化などが行える.

気になる点

SPU に変換したときのパフォーマンスが書かれていないですね。
sin とか同期プリミティブなどの PTX(GPU) 専用の命令が SPU には無いので,
これを SPU ではエミュレートする必要があり命令長がそれなりに増えそう.
これがどれだけパフォーマンスに影響を与えるか気になります.

また、浮動小数点の演算精度が PTX(NV) と SPU では微妙に異なるので、
完全一致な結果を得られることができません。
ゲーム用などならいいかもしれませんが、
精度を求められる用途だとどうかなーという気がします。

gpuocelet

Ocelot は open source で公開されており、
LLVM IR をサポートするなど論文では取り上げてないものも含まれている.
将来的には、PTX から x86/LLVM/LRB/OpenCL などへのバイナリ変換ツールを目指しているようだ。

まとめ

中間言語に PTX を使っちゃう手法、なかなかいいんじゃないかと思います。
ユーザとしては CUDA プログラムをするか、CUDA コードを吐く DSL コンパイラを作ることで、いろいろなプロセッサで動く並列コードが書けるようになるわけですし。
CPU に出すことで、デバッグも楽になるんじゃないかな.

また、PTX -> OpenCL という方法も取れるわけで、既存のアプリの OpenCL 化にも使えそうです.
このとき、単にトランスレートするのではなく、動的実行してプロファイリングを取り、ターゲットプロセッサに最適な OpenCL コードを吐いたりとかできそう.
(OpenCL は中間言語の規定がないので、このような動的最適化をするのが難しい)

Advertisements