2009-01-06 24 views
5

我必須分析幾個程序的內存訪問。我正在尋找的是一個分析器,它讓我能夠看到我的哪個程序的內存密集程度更高,而且是計算密集型的。我對訪問L1數據緩存L2和主內存的次數非常感興趣。分析用於分析我的程序的低級內存訪問

它需要適用於Linux,並且只適用於命令使用情況。編程語言是C++。如果我的問題有任何問題,例如我不明白您的意思,或者我們需要更多數據,請在下面評論。

謝謝。

更新與我選擇的,因爲收藏最多Crashworks的答案的解決方案

是提供什麼,我一直在尋找的東西,唯一的一個。但問題仍然存在,如果你知道一個更好的解決方案,請回答。

回答

1

如果您正在運行英特爾硬件,那麼VTune for Linux可能是您可以使用的最好且功能最全的工具。

否則,您可能需要使用perfctr庫直接讀取性能計數器MSR。我自己對Linux沒有任何經驗,但是我發現了幾篇可能對您有幫助的論文(假設您使用x86 - 如果您正在運行PPC,請回復並提供更詳細的答案): http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel5/11169/35961/01704008.pdf?temp=x http://www.cise.ufl.edu/~sb3/files/pmc.pdf

一般來說,這些工具不能告訴你到底發生上線的高速緩存未命中,因爲他們通過民意調查工作的計數器。你需要做的是在你感興趣的每個函數的開始和結束處輪詢「l1 cache miss」計數器,以查看該函數內有多少未命中事件,當然你也可以分層次地執行。這可以通過來簡化,例如發明了一個類,該類在進入作用域時記錄啓動計時器並計算離開作用域時的增量。

VTune的插裝模式可以在整個程序中自動執行此操作。等效的AMD工具是CodeAnalyst。 Valgrind聲稱是一個開源的緩存分析器,但我從來沒有用過它。

0

你是否需要比unix命令top提供更多的東西?這提供了易於閱讀的演示文稿格式的Linux程序的CPU使用情況和內存使用情況。

如果你需要更具體的東西,一個分析器或許,軟件語言(java/C++/etc)將有助於確定哪種分析器最適合你的情況。

2

不可能確定所有對內存的訪問,因爲它沒有多大意義。對內存的訪問可能正在執行下一條指令(程序駐留在內存中),或者當你的程序讀取或寫入一個變量時,所以你的程序幾乎總是訪問內存

有什麼可能是更有趣的你可以跟隨你的程序(堆和棧)的內存使用情況。在這種情況下,您可以使用標準頂部命令。您也可以監視系統調用(即寫入磁盤或附加/分配共享內存段)。在這種情況下,您應該使用strace命令。

一個更完整的控件來做任何事情都將通過gdb調試程序來調試你的程序。它可以讓你控制你的程序,比如將斷點設置爲一個變量,這樣當程序被讀取或寫入時(或許這就是你正在尋找的內容),程序就會被內部進行互操作。另一方面,GDB學習起來可能非常棘手,所以DDD是一個gtk圖形前端,可以幫助您開始使用它。

更新:您正在尋找的是真正的低級別內存訪問,它在用戶級別(即操作系統內核的任務)不可用。我不確定L1緩存管理是否被CPU透明地處理並隱藏到內核中。 明確的是,你需要像內核級一樣下降,所以KDB,解釋here o KDBG,解釋here

更新2:似乎Linux內核確實處理CPU緩存但只處理L1緩存。這本書Understanding the Linux Virtual Memory Manager闡述了Linux內核的內存管理是如何工作的。 This chapter解釋了L1緩存處理的一些內容。