AObench with Emscripten
-
Upload
syoyo-fujita -
Category
Documents
-
view
1.731 -
download
4
Transcript of AObench with Emscripten
emscripten でaobench
Monday, January 24, 2011
Agenda
• emscripten
• aobench
• 手順、ハマった点
• Performance
• まとめ
Monday, January 24, 2011
emscripten
• C/C++ -> JavaScript compiler
• LLVM IR を JS に変換
• clang, llvm-gcc を使って C/C++ を LLVM
IR に変換.
Monday, January 24, 2011
aobench
• AmbientOcclusion を計算する, 小さい
CG プログラム
• グラフィックス、浮動小数点ベンチマークとして使える.
Monday, January 24, 2011
手順• raytrace サンプルをベースに変更を加える.
• clang で LLVM IR にコンパイル
• emscripten で LLVM IR -> JS
• web で開いて実行
Monday, January 24, 2011
ハマった点• 最初まったく動かず
• compile は出来るが, js が動かない.
• 手探りで原因を探す...
• Firebug がとても参考になった.
Monday, January 24, 2011
特殊 include file
• #include “emscripten.h”
• を C/C++ ソースに挿入
Monday, January 24, 2011
乱数
• rand() が変換できなかった.
• 線形合同法を利用してみた
• -> やはり動かない(オーバーフローの扱い周り?)
xorshift を使うように書き換え
Monday, January 24, 2011
配列アドレッシング
@llvm.umul.with.overflow.i64 が呼ばれるコードが吐かれる
-> 変換できない
double *pixels = new double[3 * x];
配列を使わないようにコード書き換え
Monday, January 24, 2011
optimize
• opt -std-compile-opts で LLVM IR を最適化すると動かない.
• 原因不明...
Monday, January 24, 2011
js code
• 吐かれた JS コードがおかしい部分がいくらかあるので要修正
var args = arguments;
// しかし arguments は定義されていない.// var args = [] として解決
Monday, January 24, 2011
Performance
• Chrome 12.8 secs
• Firefox 82.92 secs
• Safari 動かず...
0
22.5
45
67.5
90
secs
Chrome Firefox
Monday, January 24, 2011
Closure compiler
• Closure compiler(JS -> JS optimizer)を使えばさらに JS 実行が高速化される、、、かもしれない.
Monday, January 24, 2011
まとめ• JS デバッガなどで吐かれた JS コードを確認しましょう.
• C と JS での数値の精度の違いに気をつけたほうがよさそう.
• LLVM IR が読めるようになっておくとベター
• lowlevel の知識があるとよりベター
Monday, January 24, 2011