2014-10-29 80 views
-2

我想調用一個函數並測量該函數使用的數據緩存內存量。在C或C++或基於Linux的系統中的任何庫中是否有任何過程?測量緩存內存使用率

要測量一次,它是像

start = timestamp(); 
proc() 
end = timestamp(); 
proctime = end - start; 
+1

它必須是內置到緩存中的東西,以及如何隔離緩存使用情況與系統中運行的所有其他軟件的使用情況。 – 2014-10-29 18:56:46

+0

它必須是內置到緩存中的東西,以及如何隔離緩存使用情況與系統中運行的所有其他軟件的使用情況。 – 2014-10-29 18:56:50

回答

1

簡短的回答:

沒有模擬處理器,它可能無法做到。

龍答:

在用戶模式,在任何現代的操作系統,你將無法得到這種類型的數據。您可以使用oprofileperf來獲得緩存命中&未命中數字 - 不幸的是,它不會準確地告訴您有多少是由您的進程造成的,以及系統中其他進程有多少(因爲處理器具有處理器全局的,並且該工具不知道何時進程被切入/切出,只有「計數器達到觸發值時運行哪個進程」)。

換句話說,這將給出統計數字,而不是實際的數字,正是你想要衡量的。此外,它實際上並不會告訴您是否使用1%或100%的緩存,相比於緩存中有多少數據不在緩存中,您使用的是多少數據 - 如果您真的很聰明,你可能會寫一些獲得95%緩存未命中的東西,但只使用少量的緩存行[但是需要一些實際上在一個或多個具有N * cache_size距離的內存塊中實際使用正確地址的工作它們之間]。

然而,這是一個非常可行的模型,用於確定「我的代碼是否有緩存未命中問題」。

我不知道任何方法來實際做你想要什麼,除了極端方法:

  1. 將一個內核模塊中的代碼。
  2. 禁用所有中斷。
  3. 設置性能計數器以計算數據L1,L2等的緩存命中/未命中。
  4. 運行您要測試的功能。
  5. 收集結果。

變成巨大的不切實際,因爲代碼將無法做到這一點被換出任何I/O或存取存儲器,以及操作系統可能會生氣,如果中斷是關閉超過一個較長几毫秒...

鏈接到「PERF」項目Linux內核: https://perf.wiki.kernel.org/index.php/Main_Page 如果你有一個合理的新的內核,這將是你的一般衡量業績理想工具。