FOXCを入れてみた

OpenCLというとNVidiaAMD(ATI)などのGPUインプリが目立つのだけれど、x86環境でマルチコア, SSEなどを活用するクロスコンパイラFOXCというのもある。リリース元はCellやYDL for CUDAなどHPC関連で有名なFixStarsさん。現状はLinux環境のみに対応している。動作確認OS CentOS 5.3 (64bit)となっているけど、僕はUbuntuで試してみた。

インストール

インストールは非常に簡単。fixstarsさんのページからダウンロードしてきて、適当な場所に展開するだけ。
http://www.fixstars.com/foxc/download.html
あとはLD_LIBRARY_PATHをあわせて、オフラインコンパイルしたい場合はfoxcコマンドのパスを設定するだけ。とっても簡単。

サンプルをテスト

サンプルが$(INSTDIR)/foxc/share/foxc/sample/ に展開されているので試してみる。基本的にはここでmake一発。
付属しているサンプルは2つ。

hello
our old nice great friend :)
dataParallel
ちょっとした配列演算をデータ並列で行うらしい

問題なく動作

どんなものができてるのか

どんな仕組みで動いてるのかなー?というのが気になっていろいろ。。。
まずfoxcコマンドを使うとclCreateProgramWithSource()使わずにオフラインコンパイルができる。これに-save-tempsオプションをつけると中間ファイルを吐いてくれるっぽい。
ランタイムっぽいのと(*.fox.c)とkernelに対応したCsnipple(*_$(CLFILENAME).c)を吐いてる。

./dataParallelの方、中を見てみた。なんかややこしくスタックフレームをこさえたり、なんぞしているようだけれど、名前とは裏腹に直接的にvecになっているところは無いみたいに見える。見落としてるんだろうか? --sse*フラグもつけてみたけど良くわからない。後で調べる。

ひょっとしてランタイムで実行したときもコンパイラが起動しているんだろうか? と気になってstrace取って見ると

open("/tmp/foxckernel-126758227600006763030.dll.foxc.c", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
  :
write(4, "#include <foxc/kernel-binary.h>\n"..., 3039) = 3039
  :
clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7fff17248fe8) = 9451
wait4(9451, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9451

てな感じに /tmpにcファイルをこさえてそれをコンパイルしてるっぽい。
直前に

open("/home/tkuro/foxc/share/foxc/pp-format", O_RDONLY) = 4

とか言うのをリードしてるのでナニカと思ってみてみると

// For detail, see /ctrump/trunk/ctrump/io/pprint-format.h

// must be >= 0
indentation_size                4
num_blank_lines_after_func      2


// 0 or 1
indentation_before_left_brace   0
                                  // ex. void func(int x, int y) {...}
newline_after_declspec          0 // newline between "void" and "func()"
newline_after_decl_params       0 // newline between "int x," and "int y"
newline_after_declarator        1 // newline between "func(...)" and "{"

newline_before_left_brace       0
newline_after_right_brace       0

space_before_statement_parens   1
space_before_braces             1
space_before_brackets           0

space_after_comma               1
space_after_semicolon           1
space_after_type_cast           0
space_after_negation            0

spaces_around_assignment_op     1
spaces_around_logical_op        1
spaces_around_relational_op     1
spaces_around_bitwise_op        0
spaces_around_math_op           0
spaces_around_shift_op          0

padding_around_statement_parens 0
padding_around_braces           0
padding_around_brackets         0
padding_around_type_cast        0

なんだろう? Cコード吐くときのコード規約設定かな?

感想

面白い。現状オンラインコンパイルだとかなり起動タイムが重そう。もう一層被せるといいのかな、とか思った。