簡體   English   中英

是否可以在C ++代碼中使用Linux Perf profiler?

[英]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無法實現,那么獲取該信息的最簡單方法是什么?

聽起來你要做的就是閱讀幾個性能計數器,這是PAPI庫非常適合的。

例。

支持的計數器完整列表很長,但聽起來你最感興趣的是PAPI_L1_TCMPAPI_L1_TCA以及它們的L2L3對應物。 請注意,您還可以將訪問分解為讀/寫,並且可以區分指令和數據緩存。

是的,有特殊的每線程監控,允許從用戶空間內讀取perf計數器。 參見perf_event_open(2)手冊頁perf_event_open(2)

由於perf僅支持L1i,L1d和最后一級緩存事件,因此您需要使用PERF_EVENT_RAW模式並將手動數字用於CPU。

要實現分析,您需要設置sample_intervalpoll / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM