簡體   English   中英

以編程方式計算緩存故障

[英]Programmatically counting cache faults

我需要在一堆關於內存層次結構效率的假設中評估C ++函數所花費的時間(例如:當我們讀取一部分數據時遇到緩存未命中,緩存命中或頁面錯誤時所花費的時間),所以我我希望有一些庫可以讓我計算緩存未命中/頁面錯誤,以便能夠自動生成性能摘要。

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

編輯哦,我忘了:我正在使用Linux,我對可移植性不感興趣,這是一個學術性的東西。

歡迎任何建議!

最新的CPU(AMD和Intel)都有性能監視器寄存器,可用於此類工作。 對於英特爾,程序員參考手冊第3B卷第30章介紹了它們。對於AMD,它在BIOS和內核開發人員指南中。

無論哪種方式,您都可以計算緩存命中,緩存未命中,內存請求,數據預取等等。它們具有非常特定的選擇器,因此您可以獲得(例如)L2緩存上的讀取次數來填充行在L1指令高速緩存中(同時仍然排除L2讀取以填充L1數據高速緩存中的行)。

有一個Linux內核模塊可以訪問MSR(特定於模型的寄存器)。 另外,我不知道它是否可以訪問性能監視器寄存器,但我希望它可能會這樣做。

看起來現在正是我正在搜索的內容: perf_event_open

它允許您執行有趣的操作,例如初始化/啟用/禁用某些性能計數器,以便隨后通過統一且直觀的API獲取其值(它為您提供了一個特殊的文件描述符,其中包含一個包含先前請求的信息的結構)。

它是一個僅限Linux的解決方案,功能因內核版本而異,所以要小心:)

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

緩存未命中不能輕易計算。 大多數工具或分析器通過將內存訪問重定向到提供此功能的函數來模擬內存訪問。 這意味着這些工具可以在所有進行內存訪問的地方檢測代碼,並使代碼運行緩慢。 這不是我的意圖。

但是,根據硬件的不同,您可能還有其他一些可能性。 但即使是這種情況,操作系統也應該支持它(因為否則你會獲得系統全局統計信息而不是與進程或線程相關的統計信息)

編輯:我可以找到這篇可能對你有幫助的文章: http//lwn.net/Articles/417979/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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