2011-03-27 47 views
8

我需要評估C++函數在一堆關於內存層次效率的假設中花費的時間(例如:在讀取部分內存時發生緩存未命中,緩存命中或頁錯誤一個數組),所以我想有一些庫讓我計算緩存未命中/頁面錯誤,以便能夠自動生成性能摘要。以編程方式計算緩存故障

我知道有一些像cachegrind這樣的工具可以給出與給定應用程序執行相關的一些統計信息,但我想要一個庫,就像我已經說過的那樣。

編輯哦,我忘了:我在使用Linux,而且我對可移植性不感興趣,這是一個學術問題。

歡迎任何建議!

+1

你能儀表操作系統,以幫助給你一些信息?在一個具有虛擬內存的現代先發制人的多任務系統中,操作系統很可能會在你的應用程序中不知情地做各種瘋狂的事情...... – 2011-03-27 08:01:01

+0

我不知道,我正在使用Linux。至於頁面錯誤,我知道由於現代操作系統管理內存的方式,這樣的統計數據並沒有什麼意義,正如你所說的:實際上,我對L2緩存未命中更感興趣,我認爲它更獨立於操作系統管理。 – akappa 2011-03-27 08:05:25

回答

4

它看起來像現在正是我正在尋找的東西: perf_event_open

它可以讓你做一些有趣的事情,如初始化/啓用/禁用某些性能計數器,以便隨後通過統一直觀的API獲取它們的值(它爲您提供了一個特殊的文件描述符,它承載着一個包含先前請求的信息的結構體)。

這是一個只有Linux解決方案和功能的變化取決於內核版本,所以要小心:)

+0

修復(這是一個手冊頁現在)。 – akappa 2016-07-12 19:50:54

1

緩存未命中不能簡單計數。大多數工具或分析器通過將內存訪問重定向到提供此功能的函數來模擬內存訪問。這意味着這些工具可以在所有存儲器訪問完成的地方對代碼進行測試,並使代碼運行得非常緩慢。這不是我的想法。

但是,根據硬件的不同,您可能還有其他一些可能性。但即使是這種情況的OS應該給予支持(否則你會得到系統全局統計不相關的進程或線程的那些)

編輯:我發現這個有趣的文章,可以幫助你:http://lwn.net/Articles/417979/

+0

我正在考慮一些「神奇」的處理器功能(比如一些不錯的寄存器,用於計算緩存故障),由一個庫自動檢測處理器類型並執行必要的管道來獲取實際數據。我不知道是否有可能發生類似這樣的事情 - 例如,應該在上下文切換時複製這些「魔法值」 - 但是如果存在這樣的庫會很好。 – akappa 2011-03-27 08:10:31

5

最近的CPU(包括AMD和Intel)都有性能監視寄存器,可以用於這類工作。對於英特爾,它們在程序員參考手冊第3B卷第30章中有介紹。對於AMD,它在「BIOS和內核開發者指南」中。無論採用哪種方法,您都可以計算緩存命中,緩存未命中,內存請求,數據預取等等。它們有非常特定的選擇器,因此您可以計算(例如)L2上的讀取次數緩存來填充L1指令緩存中的行(但仍不包括L2讀取以填充L1數據緩存中的行)。

有一個Linux內核模塊可以訪問MSR(型號特定的寄存器)。不速之客,我不知道它是否允許訪問性能監視器寄存器,但我希望它可以。

+0

在談論內核模塊時是否提到了perfmon2? – akappa 2011-03-27 09:06:39

+0

@akappa:據我所知,它只是被稱爲「MSR內核模塊」或類似的東西。雖然我用過它已經有一段時間了,所以有可能我不記得名字是正確的。 – 2011-03-27 19:03:07

+0

好的,如果perfmon2太難使用,我會做一些研究。謝謝:) – akappa 2011-03-27 19:41:03

3

英特爾VTune是一個性能調優工具,它完全符合您的要求; 當然,它與英特爾處理器一起工作,因爲它訪問內部處理器計數器,如Jerry Coffin所解釋的,所以這可能不適用於AMD處理器。 它暴露了數百個計數器,如緩存命中/未命中,分支預測率等,真正的問題在於理解要檢查哪個計數器;)

+0

有趣的工具,但我正在閱讀文檔,並找不到任何提及一些API在運行時獲取一些性能統計信息。 – akappa 2011-03-28 16:35:06

+0

老實說,我總是作爲一個獨立的程序,如果我找到更多的細節,我會發布他們;) – sergico 2011-03-28 18:45:14

+0

這就是我發現:[鏈接](http://software.intel.com/en-us/articles/performance -tools-for-software-developers-using-the-vtune-analyzer-pauseresume-api-from-microsoft-visual-basic /)和[link](http://www.google.com/url?sa=t&source =網絡和CD = 1&VED = 0CBoQFjAA&URL = HTTP%3A%2F%2Fsoftware.intel.com%2Ffile%2F6743&RCT = J&q = V調諧%20API&EI = M9iQTbaDCZGbhQe41-G7Dg與USG = AFQjCNGP4BIHFHtUbNUBY4wcth9_Tmmd8A&CAD = RJA) – sergico 2011-03-28 18:48:39