12
JIT Code Profiling with VTune JIT Code Profiling with VTune Cybozu Labs 2011/10/1 光成滋生 x86/x64最適化勉強会2

JIT Code Profiling with VTune

Embed Size (px)

DESCRIPTION

How to profile JIT code with VTune

Citation preview

Page 1: JIT Code Profiling with VTune

JIT Code Profiling with VTune JIT Code Profiling with VTune

Cybozu Labs

2011/10/1 光成滋生

x86/x64最適化勉強会2

Page 2: JIT Code Profiling with VTune

内容 内容

プロファイラの紹介

JITコードプロファイルの問題点

原因

対策

結果

2011/10/1 /12 2

Page 3: JIT Code Profiling with VTune

CodeAnalyst vs. VTune CodeAnalyst vs. VTune

CodeAnalyst(AMD) VTune(Intel)

値段 無料,Intel CPUでも利用可 有料

GUI シンプルで分かりやすい 高機能で分かりにくい

(情報が多すぎる)

JITコード

プロファイルAPI

アンドキュメント

環境によって

動いたり動かなかったり

ヘルプに載ってる

安定性 安心して使える 非常によく落ちる

2011/10/1 /12 3

Page 4: JIT Code Profiling with VTune

JITコードプロファイルの問題点 JITコードプロファイルの問題点

多用するとプロファイラが役に立たない

一番食ってる部分が[Unknown stack frame(s)]

2011/10/1 /12 4

Page 5: JIT Code Profiling with VTune

原因 原因

プロファイラは実行時のeipを記録し,終了時に シンボル情報を使ってソースコードと対応づける

実行時生成されたコードはプロセス終了時に消える

どこかのスタックやヒープを指してるeipばかり記録される

シンボル情報には含まれない(知りようがない)

→ プロファイラがそれらの情報を解析できない

2011/10/1 /12 5

Page 6: JIT Code Profiling with VTune

対策 対策

プロファイラにJITコードの情報を伝えればよい

どうやって?

関数ポインタとサイズ,表示用の名前を与えさえすれば

CodeAnalystやVTuneはそういうAPIを持っている

今回はWindows用VTuneでのやりかたを紹介

2011/10/1 /12 6

Page 7: JIT Code Profiling with VTune

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")

Page 8: JIT Code Profiling with VTune

設定方法(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); }

Page 9: JIT Code Profiling with VTune

設定方法(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); }

Page 10: JIT Code Profiling with VTune

最初の例 最初の例

2011/10/1 /12 10

JIT生成された関数

が見える!

関数をクリックすると…

Page 11: JIT Code Profiling with VTune

JIT生成されたコード JIT生成されたコード

中身も見える!

2011/10/1 /12 11

Page 12: JIT Code Profiling with VTune

説明とコード 説明とコード

CodeAnalystとVTuneの両方のやりかたを書いた

http://homepage1.nifty.com/herumi/prog/profile.html (プロファイラを使おう)

http://github.com/herumi/opti/ (サンプルコード)

/12 12 2011/10/1