Contenu connexe
Similaire à 明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
Similaire à 明日使える超高速Ruby - RXbyak (Mitaka.rb #5) (20)
Plus de Shuyo Nakatani (20)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
- 1. 明日使える超高速 Ruby
~ Ruby で Xbyak ~
2009/10/22
id:n_shuyo / @shuyo
中谷 秀洋@サイボウズ・ラボ
- 5. なんかこんなやつ
• ロジスティック回帰
• パーセプトロン
• ニューラルネットワーク
• サポートベクトルマシン(そのうち)
- 11. Rubyにもいいところはある
• ネットワーク構造をDSL で表現!
– ネットワークを変えての実験が容易
# units
in_units = [Unit.new("x1"), Unit.new("x2")]
hiddenunits = (1..6).map{|i| TanhUnit.new("z1#{i}")}
out_unit = [SigUnit.new("y1")]
# network
network = Network.new(:error_func=>ErrorFunction::CrossEntropy)
network.in = in_units # 入力
network.link in_units, hiddenunits # 入力 → 隠れユニット
network.link hiddenunits, out_unit # 隠れユニット → 出力
network.out = out_unit # 出力
- 12. そうは言っても、速さは正義
• 少なくとも何百回とか学習が必要
– パラメータを変えながら交差検定とかしたい
• やっぱりC++で実装するか……
– Rubyの100倍~1000倍違うし
• 24時間/100 = 15分
– Rubyのお手軽さは捨てがたくもある
• C++はいちいちコンパイル
– C++に逃げたらなんか負けた気がする
• naoya_tさん曰く「リニアに速くなるだけでしょ?」
- 15. Xbyak(カイビャック)
• 実行バイナリ(ネイティブコード)を動的に生
成するC++ライブラリ
• つまり JIT (Just in Time compiler)
• C++より速い
– C++のライブラリなのに!?
– もちろんRubyなんかメじゃない
• 光成さん(サイボウズ・ラボ)開発
– http://homepage1.nifty.com/herumi/soft/xbyak.html
- 20. RXbyak (Xbyak for Ruby)
• Xbyakを使えるRuby拡張
• Xbyak のネイティブコード生成機能を Ruby
からそのまま利用可能に
• 生成したコードをRubyから呼び出す
– 実装率低め
– 明日まだ使えない!(><
http://github.com/shuyo/cpp/tree/master/rxbyak/
- 24. RXbyak サンプル
• SIMDを使って倍精度の掛け算
– どこからどうみても Ruby のプログラム。
rx = RXbyak.new
rx.mov :eax, [:esp, 8] # mov eax, (esp+8) // 第1引数のポインタ
rx.movq :xmm0, [:eax] # movq xmm0, (eax)
rx.mov :eax, [:esp, 12] # mov eax, (esp+12) // 第2引数のポインタ
rx.movq :xmm1, [:eax] # movq xmm1, (eax)
rx.mulsd :xmm0, :xmm1 # mulsd xmm0, xmm1 // かけ算
rx.mov :eax, [:esp, 4] # mov eax, (esp+4) // 返値のポインタ
rx.movq [:eax], :xmm0 # movq (eax), xmm0
rx.ret # ret
puts rx.call(256.0, 256.0) # => 65536.0
puts rx.call(123.45, 678.9) # => 83810.205
※このサンプルに使われている命令しかまだ実装されていません。
- 27. (参考) Python vs Xbyak
http://labs.cybozu.co.jp/blog/mitsunari/2007/08/ll2007.html
- 29. RXbyakの応用範囲
• 実行時に処理が決まる場合(JIT)
– ニューラルネットワークはグラフが与えられれば
– URI Templates はテンプレートが与えられれば
• 参考:URI Templates のC++(Xbyak)実装
• http://labs.cybozu.co.jp/blog/nakatani/2008/07/uri_template_c_xbyak_jit.html
– 正規表現
• プロセッサを極限まで使い切る!(アセンブラ)
– SIMD(SSE) で浮動小数演算
• 並列演算とか128bit精度とか。SSE4.1 なら内積も1命
令で!
※使用者の感想であり、
効用を約束するものではありません。
- 33. 明日から
ビュンビュン
ですね!
※2009/10/22現在、
mov(代入) と mul(掛け算) と ret しか実装されていません。