62
1 Rubyプログラムを高速に 実行するための処理系の開発 日本Rubyの会 ささだ こういち 東京農工大学大学院 笹田 耕一 2004 12/11 2004年度未踏ユース中間発表(筧PM

Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

1

Rubyプログラムを高速に実行するための処理系の開発

日本Rubyの会

ささだ こういち

東京農工大学大学院

笹田 耕一

2004 12/11 2004年度未踏ユース中間発表(筧PM)

Page 2: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

2

Agenda 背景 目標

Ruby の特徴

設計と実装 現在の状況 今後のスケジュール

Smithsonian National Museum of Natural History

Page 3: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

3

背景

オブジェクト指向スクリプト言語Ruby• 使いやすいと評判

• 世界中で広く利用

• Ruby-talk ML では一日に百通以上

• 日本発(主開発者:まつもとゆきひろ氏)

• コミュニティ活動も活発

• 日本Rubyの会

• Rubyist Magazine

Page 4: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

4

背景(cont.)

既存のRuby処理系は遅い

• 構文木を辿って実行(eval関数の再帰呼び出し)

• パフォーマンスの問題から、泣く泣く Javaなどを選択

• 誤った常識の流布「Rubyって遅いんでしょ? 使えないよ」

• あなたが思うほど遅くありません

• Ruby はとても使える道具

Page 5: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

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倍

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倍

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倍

10

Rubyの特徴 クラスベースのオブジェクト指向 ダイナミック

• いろいろ変更可能

• すべては実行時に解決

• すべては式

ブロック付きメソッド呼び出し• Closure をメソッド呼び出し時簡単に追加可能

例外処理など大域ジャンプ可能 スレッドのサポート Cによる拡張ライブラリ開発が容易

• Ruby側でAPIを用意,Cの苦手を吸収

Page 11: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

11

Rubyの特徴(cont.)

クラスベースのオブジェクト指向

• 単一継承によるモジュール定義

• モジュール定義

• モジュールの Mix-in クラスはオブジェクト

VMレベルでは定義命令を用意

Page 12: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

19

命令記述フォーマット

命令記述フォーマットを定義• 具体的な記述部分は C• 次を変数として宣言

• オペランド

• スタックからポップする値とプッシュする値

• VM 実装が非常に楽に

• コンパイラ,命令列変換による最適化器,逆アセンブラ,コードベリファイアなど(の一部)を自動生成

• デバッグプリント挿入が楽

• 最適化手法の適用

• ドキュメント生成が楽(コード埋め込みドキュメント)

Page 20: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

31

VM概要 – 例外処理

例外処理用テーブルを利用• JavaVM などと同様

例外処理部分(例外で保護された部分)突入• 特になにもしない(実行コスト0)

• 現在のRuby処理系では毎回 setjmp 例外が発生したら

• スタックフレーム巻き戻し

• 例外処理用テーブルを参照して処理

他の大域ジャンプもこの機構を利用

Page 32: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

34

YARVでの最適化(cont.)

インラインキャッシュ

• 命令にデータを埋め込み,キャッシュに利用

• 定数アクセスは遅い

• A::B::C は4命令必要

•各定数アクセスも結構遅い

• メソッド検索

• 現在のRuby処理系はグローバルメソッドキャッシュを利用

Page 35: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

37

命令融合

• 頻出する連続した命令列を1命令に

オペランド融合

• putobject true → puttrue 融合するものを指定すれば,自動的に生成

• 命令記述を解析すれば可能

• コンパイラ(変換器)も自動生成

YARVでの最適化(cont.)

Page 38: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

40

JIT compile• 未実装

• 簡単な方法を探してます

• JIT コンパイル用ライブラリの利用

• コンパイル結果のバイナリから切り貼り

YARVでの最適化(cont.)

Page 41: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

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倍

50

松江行き

まつもとさんと打ち合わせ

• Ruby2.0 の方向性・YARV との連携など

Page 51: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

51

RubyConf2004 YARV の宣伝

• 「お前の英語は正直わからないが,発表(ジョーク)は面白かった」・・・褒められているのか?

Page 52: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

52

Page 53: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

53

Page 54: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

54

Page 55: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

55

Page 56: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

56

関西オープンソース

RubyConf2004 の報告 YARV の宣伝

Page 57: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

58

今後の課題(まだまだたくさん)

デバッグ Ruby の仕様の完全準拠(まだまだ不十分) 最適化器を実装

• 特に JIT/AOT Compiler ベンチマークプログラムの充実 その他の仕組み

• コンパイル済み YARV 命令列のダンプ

YARV 上で他の動的言語の実装

• Scheme

Page 59: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

59

困っていること

研究との両立 諸手続き

• 税金とかいろいろ

コンパイラの影響が非常に大きい

• レジスタ割り当てが少しでも失敗すると性能がた落ち

• インタプリタ向きに最適化した C コンパイラが必要?

• GCC に組み込んでみる?

• (多分)コンパイラのバグに遭遇

Page 60: Rubyプログラムを高速に 実行するための処理系の開発sasada/tmp/youth_2004_sasada_mid.pdf世界一速いRuby処理系 •基本性能で2倍、JITコンパイラでは5倍

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倍

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倍

62

おしまい