• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
グローバル変数探索回数削減による高速化 for 3impVM
 

グローバル変数探索回数削減による高速化 for 3impVM

on

  • 2,623 views

 

Statistics

Views

Total Views
2,623
Views on SlideShare
2,612
Embed Views
11

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 11

https://twitter.com 7
http://www.slideshare.net 4

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

グローバル変数探索回数削減による高速化 for 3impVM グローバル変数探索回数削減による高速化 for 3impVM Presentation Transcript

      • グローバル変数探索回数削減による
      • 高速化
      • for 3impVM
      • mokehehe
    '09/04/05
  • 動機
    • 3imp (Three Implementation Models for Scheme [ pdf ])という、Schemeコンパイラを実装するための論文がある
      • SchemeのソースをコンパイルしVMで実行する
    • スタックベースモデルの実装例
    • 速度検証してみよう
  • フィボナッチ計算
    • 比較、if式、関数呼び出しと加算減算だけの簡単なお仕事
    (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
    • 計算量は指数的に増加 -> 無駄な計算をさせるのに最適
  • ベンチマーク
    • fib(30)の処理時間の比較
  • 遅い
    • gccで機械語にコンパイルしたものはともかく、同じVM方式のGaucheやLuaにも負けてる
    うそっ…私の VM, 遅すぎ…? 5分 で判定! 26 万処理系が受けた大人気の フィボナッチベンチ 。あなたの 処理速度 や 呼び出し回数 がすぐわかる…
    • 何が遅いのか?
  • コンパイルされた命令列は? ( FRAME (CONST 2 ARG LREF 0 ARG GREF < APPLY 2) TEST ( LREF 0 RET ) FRAME ( FRAME (CONST 2 ARG LREF 0 ARG GREF - APPLY 2) ARG GREF fib APPLY 1 ) ARG FRAME (FRAME ( CONST 1 ARG LREF 0 ARG GREF - APPLY 2) ARG GREF fib APPLY 1 ) ARG GREF + SHIFT 2 APPLY 2 ) (define (fib n) (if (< n 2) n ( + (fib (- n 1)) (fib (- n 2)) ))) コンパイル 基本演算も関数呼び出しというところはあるが、別段おかしなところはない
  • プロファイルを取る
    • よろしい、ならばプロファイリングだ
    Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 52.14 1.10 1.10 2 0.55 1.05 VM 28.67 1.71 0.61 9423958 0.00 0.00 ht_find 5.21 1.82 0.11 9423879 0.00 0.00 gvht_check 4.27 1.91 0.09 9423948 0.00 0.00 gvht_hash 3.08 1.97 0.07 2692536 0.00 0.00 subr_difference 2.37 2.02 0.05 2692537 0.00 0.00 subr_lessthan 1.90 2.06 0.04 2692537 0.00 0.00 check_argnum 1.42 2.09 0.03 1346268 0.00 0.00 subr_plus ... やたらと呼び出し回数の多いものがある
  • グローバル変数の探索が多すぎる
    • fibを呼び出す度に6回GREFが発生
    • スクリプト言語だと関数呼び出し時の、呼び出し先関数(グローバル変数)の参照にもコストがかかる
    • 解決するには?
  • 回想シーン
    • Ypsilon/LittleWingの藤田さんの話
      • 実行時に命令を書き換えて、トップレベルの関数のアドレスを埋め込んでいる、との話
  • 回想シーン(2)
    • Higeponさんのmosh高速化の話
      • 聞いてくれ Mosh に信じられないことが起きたんだ
    • Gauche:グローバル変数参照の最適化
    • グローバル変数アクセスを改善したら劇的にスピードアップしたという話
  • 3impVMでも試してみよう
    • でもどうやって?
  • 実行時のグローバル変数探索
    • キー(変数名)からハッシュ値を計算
    • ハッシュエントリを探す
    fib ハッシュ値 HashTable HashEntry fib 関数の実体 ...
  • コンパイルされたバイトコード GREF fib 次の命令 前の命令
  • GREF初回実行時に書き換え GLOC fib 関数の実体 GREF fib 次の命令 前の命令
  • 結果: (1)呼び出し回数
    • 実行時の呼び出し回数上位を占めていたグローバル変数探索回数が激減!
    % cumulative self self total time seconds seconds calls s/call s/call name 52.14 1.10 1.10 2 0.55 1.05 VM 28.67 1.71 0.61 9423958 0.00 0.00 ht_find 5.21 1.82 0.11 9423879 0.00 0.00 gvht_check 4.27 1.91 0.09 9423948 0.00 0.00 gvht_hash 75.56 0.68 0.68 2 340.02 437.53 VM ... 0.00 0.90 0.00 87 0.00 0.00 ht_find 0.00 0.90 0.00 77 0.00 0.00 gvht_hash 0.00 0.90 0.00 8 0.00 0.00 gvht_check
  • 結果: (2)実行速度
    • fib(30)の速度:
      • GLOC使用前:1.857秒
      • GLOC使用後:0.961秒  48.2% 高速化!
    • 他の VM と比べても遜色ない速度を達成
  • 結論
    • 実行時に命令を書き換えてグローバル変数の探索を減らすことによってフィボナッチベンチマークで 約 50% の実行時間の短縮を実現できた
    • グローバル変数の参照(グローバル関数呼び出し含む)が多数を占めるプログラムではこの実行時書き換えは非常に有効
  • 落ち
    • それでもC版の35.6倍かかってるけどな!
    以上、ありがとうございました