10周年のSPコンテンツ!
15
Ryotaro Ikeda @chlere
らぼでPyPyの新しい論文読んでる
Ryotaro Ikeda @chlere
今回はlanguage-specificな特徴量をいかにしてMeta-Tracingで扱うかについて述べられています (via : http://t.co/miqpeba ) #pypy
Ryotaro Ikeda @chlere
Pythonで簡単にVMを作りたい!->RPythonで作れるPyPyというFWを作りました!->JITは言語の実装に寄らないようにRPythonそのものを対象にしちゃうよ!->あれ、データモデルの部分にもJITが入り込むからすげー早くなっちゃった (いまここ) #pypy
Ryotaro Ikeda @chlere
Meta-TracingがTypical-Tracingを凌駕する日は来るのだろうか?Trace monkeyと張って勝てれば確実に凌駕したと言えそうだが。 #pypy
Ryotaro Ikeda @chlere
論文をみる限りだと、Meta-Tracingは"Typicalでは難しいから実装を保留してしまっている部分"にも入り込める事をアドバンテージとして謳っているが、仮にTypicalで全て実装した場合とタイマン張ったらどうなるんだろう。ほぼ互角ならMetaの時代だな #pypy
Ryotaro Ikeda @chlere
そう考えると、日本では(?)PyPyはもっぱら高速化ソリューションとして見なされがちだが、本来はTracing-JITとGCを実装した本格的なVMを「手軽に作る」為のものなんだよなー。Meta-Tracingが出てきちゃったからごっちゃになってる。 #pypy
Ryotaro Ikeda @chlere
filter/map/reduceはそもそもRPython上で定義されていないことが分かった。だから、PyPy上で呼ぶと(多分C callなので)遅いんじゃないかなぁ。 #pypy
Ryotaro Ikeda @chlere
"PyPyは元々処理系作成用のフレームワークなのにそういう使い方をする為のチュートリアルがねーぞー"とか思ってたら、普通にあった。3ヶ月前とか最近すぎる。 http://j.mp/ojv1lb
Ryotaro Ikeda @chlere
そもそもMeta-Tracingの"Meta"とは何か。ここではつまるところ「本来であれば複数の対象があればその都度同じ仕事を各対象に対して行わなければならないが、それを1つの仕事に集約できる」というC++のテンプレート「メタ」と同様の意味を持っている。 #pypy
Ryotaro Ikeda @chlere
PyPyではRPythonで処理系(インタプリタ)を書いてもらい、そのRPythonに対してJITを適応することで、本来であればインタプリタごとに書かなければ実装できない”JITコンパイラの実装”という仕事をメタ化している。 #pypy
Ryotaro Ikeda @chlere
けれど結局、メタ化したせいで実装するインタプリタ言語依存の特徴を利用できないという欠点があるように思われるが、実は、メタ化によって本来JITを組む際に難しくてトレースから除外されるようなデータ操作もトレースできるようになってしまうという驚くべきアドバンテージが生まれた。#pypy
Ryotaro Ikeda @chlere
JITのトレースはRPythonレベルで行われるので、JITコンパイルによりそれがマシンコードになる直前までに行われる最適化処理も、やはりRPythonレベルで行われたトレースを基にして行われる。 #pypy
Ryotaro Ikeda @chlere
RPython上でトレースする(メタトレーシング)する仕組みだから、RPythonで実装さえすればどんなインタプリタ言語であれGC, JITコンパイラが自動装備されたきちっとした処理系が手軽に作れる #pypy
Ryotaro Ikeda @chlere
多くの場合、JITコンパイラは頻繁に実行される部分(ループなど)を見つけてそこをコンパイルする。ユーザープログラムのループを処理している時には処理系のプログラム自体も似たような経路のメインループを何度も処理しているハズなので、RPythonレベルでこれを行える。 #pypy
Ryotaro Ikeda @chlere
あるユーザープログラムのトレースの閉路を考える時、その閉路を実行する為のRPythonの命令列はそのユーザープログラムのトレースと意味が等価な「変形」とみなすことができる #pypy
Ryotaro Ikeda @chlere
PyPyでの最適化は、RPythonのトレースが終わった後、バックエンドにそれらが送られる前に(RPythonのままの形式で)行われる。 #pypy
Ryotaro Ikeda @chlere
トレースはリニアな形式であるため、主にここでの最適化はトレースの簡略化に重点が置かれる。すなわち、定数値置き換え、共通式除去、冗長メモリ割り当ての除去などを適応する。 #pypy
Ryotaro Ikeda @chlere
結局の所、「RPythonで書けば速くなる」も「RPythonから別言語へのSource-to-Sourceコンパイラ」も事実上は正しい認識なんだよな #pypy
Ryotaro Ikeda @chlere
PyPyでは、RPythonで実装したインタプリタ内から2種類の「ヒント」を貰う事で、定数値置き換えの最適化を行う。それが適切に作用する事がPyPyにおけるクリティカルな速度向上の要となる。何故なら、この定数置き換えがさまざまな最適化を行う事を可能にするからだ #pypy
Ryotaro Ikeda @chlere
インタプリタ実行とJITによって生産されたネイティブコード実行を切り替える為の条件分岐である「Guard」は、型推論と定数置き換えに使える。例えばあるトレースのGuardが「x==1」であれば、そのGuard以降のxはint型の1に置き換えることが可能となる。 #pypy
Ryotaro Ikeda @chlere
このGuardを用いた型推論/定数置き換えの方法を「プロモーション」と云う。 やべぇちょっとかっけぇ #pypy
Ryotaro Ikeda @chlere
この「プロモーション」を効率的に行うために、RPython上で「promote」という組み込み関数を用いてPyPyに対してヒントを提供することができる。例えば、ループ毎に殆ど値の変わらない変数xに対して、promote(x)などとしてヒントの記述を行う。 #pypy
Ryotaro Ikeda @chlere
このpromote()はインタプリタ上では何の動作もしないダミー関数のようにふるまう。だけど、実際にJITコンパイラによってTraceが行われる時にプロモーションの対象となる。(このプロモーションは、どうやらPyPy側では自動では行われないようだ) #pypy
Ryotaro Ikeda @chlere
promote()は不適切な部分に挿入してもエラーにはならない。トレースの分岐が増えて、結局は実行しているうちにその部分もコンパイルされて実行されるようになる。しかし、それはマシンコードの無駄な増加を意味するので好ましくはない(遅くなる) #pypy
残りを読む(114)

コメント

Ike Tohru @rokujyouhitoma 2011年8月15日
不要ツイートの削除。
Ike Tohru @rokujyouhitoma 2011年8月15日
順番の修正と、ツイートの追加。
Ike Tohru @rokujyouhitoma 2011年8月18日
関連ツイートの追加。
Ike Tohru @rokujyouhitoma 2011年11月3日
PyPyの基本アーキテクチャについて、知人が論文をもとに解説してくれていたので追加。
Ike Tohru @rokujyouhitoma 2011年11月3日
RPythonや最適化に関して追記。
Ike Tohru @rokujyouhitoma 2011年11月3日
取りこぼしがないか見直した。
Ike Tohru @rokujyouhitoma 2011年11月3日
お昼行っている間に進んだツイートをさらう。
ログインして広告を非表示にする
ログインして広告を非表示にする