rubyプログラムを高速に...
TRANSCRIPT
![Page 1: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/1.jpg)
1
Rubyプログラムを高速に実行するための処理系の開発
日本Rubyの会
ささだ こういち
東京農工大学大学院
笹田 耕一
2004 12/11 2004年度未踏ユース中間発表(筧PM)
![Page 2: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/2.jpg)
2
Agenda 背景 目標
Ruby の特徴
設計と実装 現在の状況 今後のスケジュール
Smithsonian National Museum of Natural History
![Page 3: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/3.jpg)
3
背景
オブジェクト指向スクリプト言語Ruby• 使いやすいと評判
• 世界中で広く利用
• Ruby-talk ML では一日に百通以上
• 日本発(主開発者:まつもとゆきひろ氏)
• コミュニティ活動も活発
• 日本Rubyの会
• Rubyist Magazine
![Page 4: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/4.jpg)
4
背景(cont.)
既存のRuby処理系は遅い
• 構文木を辿って実行(eval関数の再帰呼び出し)
• パフォーマンスの問題から、泣く泣く Javaなどを選択
• 誤った常識の流布「Rubyって遅いんでしょ? 使えないよ」
• あなたが思うほど遅くありません
• Ruby はとても使える道具
![Page 5: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/5.jpg)
5
背景(cont.) Ruby処理系の処理速度向上が必須
• バイトコード(仮想マシン型)処理系が最適
• Lisp, Java, .NET, Smalltalk 処理系など
いくつかのRubyバイトコード処理系→不十分
• まつもと氏 平成12年度未踏ソフトウェア創造事業
• 不完全(命令が不十分・コンパイラも無い)
• ByteCodeRuby(George Marrows氏) • 現状のRuby処理系よりも遅い→ プロジェクト終了
• その他、ほとんど作りかけ
![Page 6: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/6.jpg)
6
提案:Ruby処理系の開発
VM命令セットの設計
コンパイラの設計・開発
仮想機械(RubyVM)の設計・開発
JIT(Just In Time)コンパイラの設計・開発
AOT(Ahead of Time)コンパイラの設計・開発
• JIT/AOT Compiler は実験的
成果はオープンソースソフトウェアとして公開
YARV: Yet Another Ruby VM として開発中
![Page 7: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/7.jpg)
7
提案するシステムの全体像
Ruby Script
Compiler Ruby InstructionSequence
AOT Compiler
C Source code C Compiler ExecutableShared Library
Ruby VM
(Evaluator)JIT Compiler
Native Code
YARV – The Proposed System
![Page 8: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/8.jpg)
8
目標
世界一速いRuby処理系
• 基本性能で2倍、JITコンパイラでは5倍
AOTコンパイラでは10倍の性能向上を目指す
世界中の人に使ってもらえるように
• RubyVM としての十分な機能を実装
次期Rubyの公式実装 Rite に• Ruby2.0 処理系 Rite (現在 1.9.0 開発中)
• 本提案が成功すればこれをRiteとして採用
本年度目標
![Page 9: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/9.jpg)
9
FAQ. YARV が読めません
“Name is important” (Matz) But “YARV” name is not important Because “YARV” will become “Rite”
… if this project succeed If failed, no one remember “YARV” You can call “YARV” at your pleasure
![Page 10: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/10.jpg)
10
Rubyの特徴 クラスベースのオブジェクト指向 ダイナミック
• いろいろ変更可能
• すべては実行時に解決
• すべては式
ブロック付きメソッド呼び出し• Closure をメソッド呼び出し時簡単に追加可能
例外処理など大域ジャンプ可能 スレッドのサポート Cによる拡張ライブラリ開発が容易
• Ruby側でAPIを用意,Cの苦手を吸収
![Page 11: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/11.jpg)
11
Rubyの特徴(cont.)
クラスベースのオブジェクト指向
• 単一継承によるモジュール定義
• モジュール定義
• モジュールの Mix-in クラスはオブジェクト
VMレベルでは定義命令を用意
![Page 12: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/12.jpg)
12
Rubyの特徴(cont.)
ダイナミック• クラス定義に追加可能
• クラス定義を変更可能
• 定数定義を変更可能
• メソッド定義を変更可能
• Evil eval すべては式
• クラス定義なども式
• コンパイル時に決定不可
class C def m() endend
class C def n() # add n endend
class C def m() # redefine m endend
![Page 13: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/13.jpg)
13
Rubyの特徴(cont.)
ブロック付きメソッド呼び出し
• メソッド呼び出し時,容易に
closure を渡すことが可能
;; (1) in Ruby[1,2,3].each{|e| p e}
;; (2) in scheme(for-each (lambda (e) (print e)) '(1 2 3))
![Page 14: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/14.jpg)
14
Rubyの特徴(cont.)
例外処理など
• もちろん式なので値を持つ
• Javaの例外テーブル
そのままでは無理
スレッド
• ユーザレベルスレッド
(Yarvでどこまで対応できるか?)
# in Rubybegin Arescue Bensure C end
# in Javatry{ A}catch(...){ B}finally{ C}
a = begin A rescue B ensure C end
![Page 15: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/15.jpg)
15
Rubyの特徴(cont.)
C拡張ライブラリ
• Conservative GC• オブジェクト指向 C-Ruby Interface• 例外までCで記述可能
• setjmp/longjmp を利用
• グローバル変数ばりばり
→ VM インスタンス化を阻害
![Page 16: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/16.jpg)
16
YARV 概要 Simple Stack Machine 拡張ライブラリとして実装
既存のRuby と連携して機能を利用
• ガーベージコレクタ
• Ruby Script パーサ
• Ruby C API が使える
• i.e) Memory Management • using Array without “free()” is very happy
大部分,C言語で実装
![Page 17: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/17.jpg)
17
YARV命令セット
命令名は略さない
Stack control• Swap, dup, …
Accessor• get/setlocal, get/setconstant, …
Put something• putobject, putnil, putarray, …
Apply some change to object• concatstrings, …
![Page 18: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/18.jpg)
18
YARV命令セット
Method definition• methoddef
Method call, Class/Module def• send, classdef, moduledef, yield, super, …
Control flow• goto, if, unless, throw
Optimization• get/setinlinecache, opt_plus, opt_…, …
And others
![Page 19: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/19.jpg)
19
命令記述フォーマット
命令記述フォーマットを定義• 具体的な記述部分は C• 次を変数として宣言
• オペランド
• スタックからポップする値とプッシュする値
• VM 実装が非常に楽に
• コンパイラ,命令列変換による最適化器,逆アセンブラ,コードベリファイアなど(の一部)を自動生成
• デバッグプリント挿入が楽
• 最適化手法の適用
• ドキュメント生成が楽(コード埋め込みドキュメント)
![Page 20: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/20.jpg)
20
命令記述フォーマット(cont.)/** @c put @e put self. @j self を置く。 */DEFINE_INSNputself()()(VALUE val){ val = GET_SELF();}
![Page 21: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/21.jpg)
21
/** @c variable @e get local variable(which is pointed by idx). @j idx で指定されたローカル変数をスタックに置く。 */DEFINE_INSNgetlocal(ulong idx)()(VALUE val){ val = *(GET_LFP() - idx);}
命令記述フォーマット(cont.)
![Page 22: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/22.jpg)
22
命令記述によるVM生成
命令記述から生成されるもののまとめ
命令記述(1700 lines)
Compiler(including Optimizer)
VM Evaluator(17000行)
Verifier
Disassembler
Assembler
![Page 23: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/23.jpg)
23
コンパイラ概要
Ruby 構文木を YARV 命令列に変換
• Ruby Script Parser は構文木を作成
• 構文木をたどり,命令列に変換
• 最適化のためのコード変換を適宜行う
Ruby Script
Compiler(Node – Insns) Ruby insn.
Sequence
Ruby Parser(Ruby – Node)
Ruby AbstractSyntax Tree
Compiler with Ruby Parser
![Page 24: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/24.jpg)
24
VM概要:レジスタ
5 registers• PC: Program Counter• SP: Stack Pointer• LFP: Local Frame Pointer• DFP: Dynamic Frame Pointer• CFP: Control Frame Pointer
![Page 25: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/25.jpg)
25
VM概要 – Stack Frames
Frame types• Method Frame• Block Frame• Class Frame
![Page 26: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/26.jpg)
26
VM概要 – Stack Frames (.cont) Method Frame
• 他のVMとほぼ同様
• クラスフレームもほぼ同様
Control frame• 各フレームが持つ
• レシーバ
• 命令列情報
• 継続情報(caller regs)
• CFP によりアクセス可
Stack
Control
ArgsLocals
…
LFP, DFP
SP
Environment
CFP Self
ISeq
Cont.
Block
![Page 27: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/27.jpg)
27
VM概要 – Stack Frames (cont.)
Block Frame• ‘yield’ によって作成
• LFP points to methodlocal environment
• DFP point to currentenvironment
• DFP[0] == PDFP point toprevious environment
Stack
Ctrl
LFPArgs
Locals
…
PDFP
Ctrl
ArgsLocals
…
CFP
SP
Ctrl
ArgsLocals
…
PDFPBlockDFP
… …
![Page 28: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/28.jpg)
28
VM概要 – Proc Object
Proc オブジェクトの生成
• 要するにクロージャ
•環境をヒープに保存
• LFP, DFP はヒープ上を指す
• スタック上の値は遡って張り直す
Stack
Ctrl
ArgsLocals
…
Block
Proc
Env.
Env.
Env.
# Proc sampledef m arg; x = 0 iter{|a| i=1 iter{|b| j=2 Proc.new }}; end
LFP
DFP
CFP
SPStruct ProcObject: VALUE self; VALUE *lfp; VALUE *dfp VALUE iseqobj;
![Page 29: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/29.jpg)
29
VM概要 – Using Block
ブロック情報をスタックに積む
• 命令列・環境のセット
• “alloca” 関数と同じアイデア
• ‘yield’ 命令で利用
Stack
Ctrl
ArgsLocals
…
Block
BlcokInfo
Struct BlockObject: VALUE self; VALUE *lfp; VALUE *dfp VALUE iseqobj;
# Block sampleiter{ ...}
![Page 30: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/30.jpg)
30
VM概要 – Using Block (Proc)
ブロックとして Proc も利用可能
• ‘yield’ 命令で利用
• ブロックオブジェクトと同様
のデータ構造(区別無く扱う)
Stack
Ctrl
ArgsLocals
…
Block
# Proc sampledef m arg; x = 0 iter{|a| i=1 iter{|b| j=2 Proc.new }}; end
Proc
Env.
Env.
Env.
# cont.
iter(m(arg))
![Page 31: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/31.jpg)
31
VM概要 – 例外処理
例外処理用テーブルを利用• JavaVM などと同様
例外処理部分(例外で保護された部分)突入• 特になにもしない(実行コスト0)
• 現在のRuby処理系では毎回 setjmp 例外が発生したら
• スタックフレーム巻き戻し
• 例外処理用テーブルを参照して処理
他の大域ジャンプもこの機構を利用
![Page 32: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/32.jpg)
32
他の言語と違い,例外処理部分が式になる
• 単純に真似ればいいわけじゃない
VM概要 – 例外処理(cont.)
# Java can do this?v = begin FOO rescue BAR ensure BAZ end
![Page 33: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/33.jpg)
33
VM概要 – Ensure
例外処理用テーブルを利用
Ensure 節部分をコピー
# samplebegin Aensure Bend
Compiled: Start_A: A End_A: B End_B: end
ExceptionTable:entry: type: ensure range: Start_A – End_A do: B restart point: End_B restart sp: 0
![Page 34: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/34.jpg)
34
YARVでの最適化(cont.)
インラインキャッシュ
• 命令にデータを埋め込み,キャッシュに利用
• 定数アクセスは遅い
• A::B::C は4命令必要
•各定数アクセスも結構遅い
• メソッド検索
• 現在のRuby処理系はグローバルメソッドキャッシュを利用
![Page 35: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/35.jpg)
35
YARVでの最適化(cont.) インラインキャッシュ(cont.)
• Global “VM state counter”• VM state counter は再定義時インクリメント
• メソッド再定義
•定数再定義
• インラインキャッシュ時,このカウンタ値を一緒に格納
• キャッシュ参照時,現在のカウンタ値と格納されたカウンタ値を比較
•同じならキャッシュヒット
•違ったらキャッシュミス
![Page 36: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/36.jpg)
36
スタックキャッシング
• スタックトップの2つをキャッシュ
• 5状態
• 命令数は5倍(各状態ごとに命令を用意)
• putself_xx_ax• putself_ax_ab• putself_bx_ba• putself_ab_ba• putself_ba_ab
YARVでの最適化(cont.)
![Page 37: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/37.jpg)
37
命令融合
• 頻出する連続した命令列を1命令に
オペランド融合
• putobject true → puttrue 融合するものを指定すれば,自動的に生成
• 命令記述を解析すれば可能
• コンパイラ(変換器)も自動生成
YARVでの最適化(cont.)
![Page 38: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/38.jpg)
38
特化命令
• 単純な命令を特殊化
• a + b → opt_plus
YARVでの最適化(cont.)
if(a と b は整数か?)
if(整数の + メソッドは再定義されていないか?)
return a+b;
通常のメソッド呼び出し a.+(b) を実行
![Page 39: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/39.jpg)
39
YARVでの最適化(cont.) 最適化を含むコンパイラの仕事まとめ
Node Tree
YARV Compiler
YARV InsnSequence
Basic Compiler
Specialized Insn
Operand UnificationOptimizer
Peephole Optimizer
Instuction UnificationOptimizer
Stack Caching InsnsTranslator
![Page 40: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/40.jpg)
40
JIT compile• 未実装
• 簡単な方法を探してます
• JIT コンパイル用ライブラリの利用
• コンパイル結果のバイナリから切り貼り
YARVでの最適化(cont.)
![Page 41: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/41.jpg)
41
AOT compile• 未実装
• Ruby → YARV 命令列 → C Source code → Ruby 拡張ライブラリ
• YARV 命令列から C 言語変換は比較的容易
• 命令記述を利用
• C 言語コンパイラが頑張ってくれれば私は何もする必要がない
YARVでの最適化(cont.)
![Page 42: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/42.jpg)
42
現在できること
変数アクセス• メソッドローカル,ブロックローカル,インスタンス,グロ
ーバル,定数 クラス・モジュール定義 制御構文
• 基本フロー制御 if/unless, while/until, case/when• 例外処理 begin/rescue/ensure• 大域ジャンプ return, break/retry/next/redo
メソッド起動・ブロック起動• Call and yield with arguments, optional/rest arguments• Call with block
![Page 43: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/43.jpg)
43
現在できること(cont.)
Ruby → C → Ruby → …• 3.times{…} が動く
• Ruby へのパッチを用意
Proc オブジェクト(クロージャ)の作成 いくつかの最適化 YARV命令列の逆アセンブル プロファイラ いくつかのベンチマークプログラム
• 現在31個
![Page 44: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/44.jpg)
44
まだ出来ていないこと
いくつかの基本的な機能• super,defined? ,多重代入,スレッド対応
いくつかの便利機能• set_trace_func, method_missing, callcc• require, stack trace, …
いくつかの最適化• JIT/AOT コンパイラ
• 命令融合
• ブロックインライニング
![Page 45: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/45.jpg)
45
ベンチマーク結果
みんな大好きベンチマーク 評価環境
• CPU: Intel Celeron 1.7GHz, Mem: 512MB• OS: Windows2000 + Cygwin 1.52• コンパイラ: gcc (GCC) 3.3.3• 比較対象の Ruby: 1.9.0 (2004-11-30) [i386-cygwin]
利用した最適化
• Direct threading code• 特化命令(整数演算向け)
• オペランド融合
![Page 46: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/46.jpg)
46
ベンチマーク結果(cont.)
1.69 3.17 5.32 Rescue2 131.87 0.02 3.10 Rescue
8.58 1.60 13.76 block 9.83 0.74 7.25 Method 8.48 0.22 1.90 const 2.07 3.12 6.47 times
11.10 0.69 7.66 whileloop SpeedupYARV(sec)Ruby(sec)プログラム
![Page 47: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/47.jpg)
47
ベンチマーク結果(cont.)
1.03 0.61 0.63 count_words 11.55 0.27 3.06 ackermann
4.88 0.73 3.56 sieve 2.43 2.62 6.37 matrix 4.91 4.13 20.26 tarai 7.33 3.42 25.07 tak 9.82 0.79 7.73 fib
SpeedupYARV(sec)Ruby(sec)プログラム
![Page 48: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/48.jpg)
48
ベンチマーク結果(cont.)
1.72 0.40 0.69 whileloop
1.19 0.61 0.73 sieve
1.41 0.56 0.79 fib
1.72 0.40 0.69 whileloop
SpeedupYARV SC(sec)YARV(sec)プログラム
・スタックキャッシングの効果
![Page 49: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/49.jpg)
49
スケジュール(Done) 2004
• Aug. 7, 8 Lightweight Language Weekend• Aug. 30, 31 meeting with Matz• Oct. 1-3 RubyConf 2004• Oct. 22, 23 Kansai Open Source 2004
![Page 50: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/50.jpg)
50
松江行き
まつもとさんと打ち合わせ
• Ruby2.0 の方向性・YARV との連携など
![Page 51: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/51.jpg)
51
RubyConf2004 YARV の宣伝
• 「お前の英語は正直わからないが,発表(ジョーク)は面白かった」・・・褒められているのか?
![Page 52: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/52.jpg)
52
![Page 53: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/53.jpg)
53
![Page 54: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/54.jpg)
54
![Page 55: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/55.jpg)
55
![Page 56: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/56.jpg)
56
関西オープンソース
RubyConf2004 の報告 YARV の宣伝
![Page 57: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/57.jpg)
57
スケジュール(TODO) 2004
• 残りの機能の実装
2005• JIT/AOT compiler (experimental)• Debug Debug Debug!• Jan. Programming Symposium• Feb. 未踏ユース成果発表会
• Mar. IPSJ 全国大会
?• YARV rename to Rite
![Page 58: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/58.jpg)
58
今後の課題(まだまだたくさん)
デバッグ Ruby の仕様の完全準拠(まだまだ不十分) 最適化器を実装
• 特に JIT/AOT Compiler ベンチマークプログラムの充実 その他の仕組み
• コンパイル済み YARV 命令列のダンプ
YARV 上で他の動的言語の実装
• Scheme
![Page 59: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/59.jpg)
59
困っていること
研究との両立 諸手続き
• 税金とかいろいろ
コンパイラの影響が非常に大きい
• レジスタ割り当てが少しでも失敗すると性能がた落ち
• インタプリタ向きに最適化した C コンパイラが必要?
• GCC に組み込んでみる?
• (多分)コンパイラのバグに遭遇
![Page 60: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/60.jpg)
60
Compiler の不思議
if(真にしかならない条件){
THEN_PROCESS();
}
else{
ELSE_PROCESS();
}
if(真にしかならない条件){
THEN_PROCESS();
}
else{
DEBUG_PRINT(“hogehoge”);
ELSE_PROCESS();
}
どっちが速い?
![Page 61: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/61.jpg)
61
YARV 開発について
Home page• http://www.atdot.net/yarv/• インストール方法などもここに
Mailing list• Yarv-dev (in Japanese)• Yarv-devel (in English)
![Page 62: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍](https://reader033.vdocuments.site/reader033/viewer/2022041507/5e2617bea9052263ad7e91fb/html5/thumbnails/62.jpg)
62
おしまい