[英]Is it possible to use Linux Perf profiler inside C++ code?
我想測量我的C ++代碼的某些部分的L1,L2和L3緩存命中/未命中率。 我對整個應用程序使用Perf不感興趣。 Perf可以用作C ++中的庫嗎?
int main() {
...
...
start_profiling()
// The part I'm interested in
...
end_profiling()
...
...
}
我給了英特爾PCM一個鏡頭,但我有兩個問題。 首先,它給了我一些奇怪的數字 。 其次,它不支持L1 Cache分析。
如果使用Perf無法實現,那么獲取該信息的最簡單方法是什么?
是的,有特殊的每線程監控,允許從用戶空間內讀取perf計數器。 參見perf_event_open(2)
手冊頁perf_event_open(2)
由於perf
僅支持L1i,L1d和最后一級緩存事件,因此您需要使用PERF_EVENT_RAW
模式並將手動數字用於CPU。
要實現分析,您需要設置sample_interval
, poll
/ select
fd或等待SIGIO
信號,當它發生時,從中讀取樣本和指令指針。 您可能會嘗試使用像GDB這樣的調試器來解析返回到函數名的指針指針。
另一種選擇是使用SystemTap 。 你需要空的start|end_profiling()
,只是為了使用類似的東西啟用SystemTap分析:
global traceme, prof;
probe process("/path/to/your/executable").function("start_profiling") {
traceme = 1;
}
probe process("/path/to/your/executable").function("end_profiling") {
traceme = 0;
}
probe perf.type(4).config(/* RAW value of perf event */).sample(10000) {
prof[usymname(uaddr())] <<< 1;
}
probe end {
foreach([sym+] in prof) {
printf("%16s %d\n", sym, @count(prof[sym]));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.