2011年8月15日月曜日

JITされたコードの視覚化

原文はこちら: Visualization of JITted code

こんにちわ。

私たちはjitviewerの最初の公式リリースを発表できることを誇りに思います。
現在のところ、jitviewerはPyPyのJITによってマシンコードにコンパイルされた
Pythonソースコードの理解を助けるちょっとした内部ツールです。

インストールするには、PyPyのごく最近のバージョン(8月9よりも新しい)、例えば、ナイトリービルドのいずれかが必要です:

  • pipとdistributeをインストールするまたは、PyPyで作られたvirtualenvか、次の述べるinstallation instructions

  • PyPyのソースコードチェックアウトし、PYTHONPATHに確実に入れてください。

  • pip install jitviewer。グローバルにインストールされたpipではなく、PyPyの管理下にあるpipを実行する必要があることに注意して下さい。


jitviewerをはじめるにはREADMEを見るまたは、それをただ実行したいならオンラインデモを試みてください。

jitviewerはflaskとjinja2で書かれたWebアプリケーションです。
ウェブ開発経験があって、PyPyを助けたいなら、私たちに遠慮無く連絡してください。PyPyを向上する多くのことがあります :-)

本当のところjitviewerは何をするのでしょうか?


ページの上部には、JITでコンパイルされたコードの一部分のリストが表示されます。
あなたは通常のループと"エントリブリッジ"の両方を確認することができます。ここでは、それらの違いについて議論する適当な場所ではありませんが、たぶんあなたは、通常はほとんどの時間が費やされている場所なので、ループをもっとも見たがっているでしょう。

各ループにおいて、ループの最初の命令を含んだ関数の名前が表示されることに注意してください。
しかしながら、JITによって行われるインライン化のおかげで、それに他の関数のコードが含まれます。

あなたがひとたびループを選択すると、jitviewerはJITがどのような階層的な方法でPythonソースコードをアセンブラにコンパイルしたのかを示します。それは4つのレベルで表示します:

Pythonソースコード: 空色で示された行だけが、この特定のループのためにコンパイルされており、灰色のものはそうではありません。

Pythonバイトコード, あなたが実行することによって得るもの:
def f(a, b):

return a + b
import dis
dis.dis(f)
命令コード(opcodes)は、例えば LOAD\_FAST, LOAD\_GLOBAL などです。
太字になっていない命令コード(opcodes)は、完全にJITで常に最適化されています
  • JITコードの中間表現(IR)。これは操作(整数加算のような、構造体のフィールド読み出し)とガード(私達の仮定が実際に真であることを確認する)の組合せです。ガードは赤色です。それらの操作は"Cと同じレベルで": そう、例えば、+は、CPUのレジスタに格納された2つのボックス化が解除された整数を取ります。

  • アセンブラ: あなたは、右上メニューの"Show assembler"をクリックして、それを確認することができます。


時に、ガードが頻繁に失敗し、アセンブラの新しい部分が呼ばれてコンパイルされた事がわかるでしょう。
これはコードを通した迂回経路であり、そして、それはブリッジと呼ばれます。
ガードの横にリンクがある時には、jitviewerでブリッジを見ることができます。

詳しい情報の成果を得たいのであればjit documentationを探して下さい。

いまだに混沌としています


私が現状について説明すると、Jitviewerは完全ではありません。
あなたが、IRC上に現れたり、私たちのメーリングリストへメールを送ることは自由であり、また私たちはそれを説明し、解決策を改良するでしょう。
詳細については、お問い合わせのページを参照してください。

Cheers,
fijal & antocuni

(原文:Posted by Maciej Fijalkowski)

0 件のコメント:

コメントを投稿