Upload
mitsunari-shigeo
View
1.767
Download
1
Embed Size (px)
DESCRIPTION
How to profile JIT code with VTune
Citation preview
JIT Code Profiling with VTune JIT Code Profiling with VTune
Cybozu Labs
2011/10/1 光成滋生
x86/x64最適化勉強会2
内容 内容
プロファイラの紹介
JITコードプロファイルの問題点
原因
対策
結果
2011/10/1 /12 2
CodeAnalyst vs. VTune CodeAnalyst vs. VTune
CodeAnalyst(AMD) VTune(Intel)
値段 無料,Intel CPUでも利用可 有料
GUI シンプルで分かりやすい 高機能で分かりにくい
(情報が多すぎる)
JITコード
プロファイルAPI
アンドキュメント
環境によって
動いたり動かなかったり
ヘルプに載ってる
安定性 安心して使える 非常によく落ちる
2011/10/1 /12 3
JITコードプロファイルの問題点 JITコードプロファイルの問題点
多用するとプロファイラが役に立たない
一番食ってる部分が[Unknown stack frame(s)]
2011/10/1 /12 4
原因 原因
プロファイラは実行時のeipを記録し,終了時に シンボル情報を使ってソースコードと対応づける
実行時生成されたコードはプロセス終了時に消える
どこかのスタックやヒープを指してるeipばかり記録される
シンボル情報には含まれない(知りようがない)
→ プロファイラがそれらの情報を解析できない
2011/10/1 /12 5
対策 対策
プロファイラにJITコードの情報を伝えればよい
どうやって?
関数ポインタとサイズ,表示用の名前を与えさえすれば
CodeAnalystやVTuneはそういうAPIを持っている
今回はWindows用VTuneでのやりかたを紹介
2011/10/1 /12 6
VTune用APIを使う準備 VTune用APIを使う準備
インクルードパス
<インストールパス>/Intel/VTune Amplifier XE/include
ライブラリパス
<インストールパス>/Intel/VTune Amplifier XE/lib{32,64}
プログラムの先頭
/12 7 2011/10/1
#include "jitprofiling.h" #pragma comment(lib, "libittnotify.lib") #pragma comment(lib, "jitprofiling.lib")
設定方法(1/2) 設定方法(1/2)
ユーティリティ関数を用意した
SetJitCode(関数ポインタ, サイズ, 名前);で呼び出す
/12 8 2011/10/1
void SetJitCode(void *ptr, size_t size, const char *name){ iJIT_Method_Load jmethod = {0}; jmethod.method_id = iJIT_GetNewMethodID(); jmethod.class_file_name = ""; jmethod.source_file_name = __FILE__; jmethod.method_load_address = ptr; jmethod.method_size = (unsigned int)size; jmethod.line_number_size = 0; jmethod.method_name = const_cast<char*>(name); iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod); }
設定方法(1/2) 設定方法(1/2)
例えばこんな感じ
プログラム終了前にプロファイラに知らせる
2011/10/1 /12 9
iJIT_NotifyEvent(iJVM_EVENT_TYPE_SHUTDOWN, NULL);
static const struct { const Xbyak::CodeGenerator& g, const char *name; } tbl[] = { { genAdd, "ZmZ_2::add" }, { genAddNC, "ZmZ_2::addNC" }, ... }; for (size_t i = 0; i < tblN - 1; i++) { SetJitCode(tbl[i].g.getCode(),tbl[i].g.getSize(),tbl[i].name); }
最初の例 最初の例
2011/10/1 /12 10
JIT生成された関数
が見える!
関数をクリックすると…
JIT生成されたコード JIT生成されたコード
中身も見える!
2011/10/1 /12 11
説明とコード 説明とコード
CodeAnalystとVTuneの両方のやりかたを書いた
http://homepage1.nifty.com/herumi/prog/profile.html (プロファイラを使おう)
http://github.com/herumi/opti/ (サンプルコード)
/12 12 2011/10/1