AObench with Emscripten

14
emscripten aobench Monday, January 24, 2011

Transcript of AObench with Emscripten

Page 1: AObench with Emscripten

emscripten でaobench

Monday, January 24, 2011

Page 2: AObench with Emscripten

Agenda

• emscripten

• aobench

• 手順、ハマった点

• Performance

• まとめ

Monday, January 24, 2011

Page 3: AObench with Emscripten

emscripten

• C/C++ -> JavaScript compiler

• LLVM IR を JS に変換

• clang, llvm-gcc を使って C/C++ を LLVM

IR に変換.

Monday, January 24, 2011

Page 4: AObench with Emscripten

aobench

• AmbientOcclusion を計算する, 小さい

CG プログラム

• グラフィックス、浮動小数点ベンチマークとして使える.

Monday, January 24, 2011

Page 5: AObench with Emscripten

手順• raytrace サンプルをベースに変更を加える.

• clang で LLVM IR にコンパイル

• emscripten で LLVM IR -> JS

• web で開いて実行

Monday, January 24, 2011

Page 6: AObench with Emscripten

ハマった点• 最初まったく動かず

• compile は出来るが, js が動かない.

• 手探りで原因を探す...

• Firebug がとても参考になった.

Monday, January 24, 2011

Page 7: AObench with Emscripten

特殊 include file

• #include “emscripten.h”

• を C/C++ ソースに挿入

Monday, January 24, 2011

Page 8: AObench with Emscripten

乱数

• rand() が変換できなかった.

• 線形合同法を利用してみた

• -> やはり動かない(オーバーフローの扱い周り?)

xorshift を使うように書き換え

Monday, January 24, 2011

Page 9: AObench with Emscripten

配列アドレッシング

@llvm.umul.with.overflow.i64 が呼ばれるコードが吐かれる

-> 変換できない

double *pixels = new double[3 * x];

配列を使わないようにコード書き換え

Monday, January 24, 2011

Page 10: AObench with Emscripten

optimize

• opt -std-compile-opts で LLVM IR を最適化すると動かない.

• 原因不明...

Monday, January 24, 2011

Page 11: AObench with Emscripten

js code

• 吐かれた JS コードがおかしい部分がいくらかあるので要修正

var args = arguments;

// しかし arguments は定義されていない.// var args = [] として解決

Monday, January 24, 2011

Page 12: AObench with Emscripten

Performance

• Chrome 12.8 secs

• Firefox 82.92 secs

• Safari 動かず...

0

22.5

45

67.5

90

secs

Chrome Firefox

Monday, January 24, 2011

Page 13: AObench with Emscripten

Closure compiler

• Closure compiler(JS -> JS optimizer)を使えばさらに JS 実行が高速化される、、、かもしれない.

Monday, January 24, 2011

Page 14: AObench with Emscripten

まとめ• JS デバッガなどで吐かれた JS コードを確認しましょう.

• C と JS での数値の精度の違いに気をつけたほうがよさそう.

• LLVM IR が読めるようになっておくとベター

• lowlevel の知識があるとよりベター

Monday, January 24, 2011