JIT Code Profiling with VTune

2,351 views

Published on

How to profile JIT code with VTune

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,351
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
13
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

JIT Code Profiling with VTune

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

×