• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
JIT Code Profiling with VTune
 

JIT Code Profiling with VTune

on

  • 2,002 views

How to profile JIT code with VTune

How to profile JIT code with VTune

Statistics

Views

Total Views
2,002
Views on SlideShare
2,000
Embed Views
2

Actions

Likes
0
Downloads
8
Comments
0

2 Embeds 2

http://a0.twimg.com 1
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    JIT Code Profiling with VTune JIT Code Profiling with VTune Presentation Transcript

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