2016-09-07 64 views
0

我使用perf來測試理論上被證明是緩存友好算法的代碼。爲什麼高速緩存未命中指令比率是緩存性能的一個更好的指標,與高速緩存未引用高速緩存未命中比率相比?

根據this article指令緩存未命中是緩存性能的一個很好的指標。

緩存未命中與指令的比率將指示緩存如何工作;比例越低越好。在這個示例中,比率是1.26%(6,605,955次緩存未命中/ 525,543,766次 次)。由於RAM存儲器與高速緩存訪​​問之間的成本差異較大(100個週期與<個20個週期) 即使緩存未命中率的小改進也可以顯着提高 的性能。如果每條指令的高速緩存未命中率超過5%,則需要進一步調查。

然而,當我運行PERF的是這樣的:

perf stat -B -e cache-references,cache-misses,instructions ./td 1.txt 2.txt

逆足會發布如下:

Performance counter stats for './td 1.txt 2.txt': 

    93,497,101  cache-references            
    56,452,246  cache-misses    # 60.379 % of all cache refs  
8,115,626,200  instructions    

    2.509309040 seconds time elapsed 

所以它更側重於緩存引用緩存缺失率而不是文章中提出的那個。

緩存缺失到緩存引用的比率看起來很差,60%,這意味着我的應用訪問緩存的時間有60%我得到緩存缺失。另一方面,緩存缺失率與指令比率僅爲0.6%。

我不知道該從哪弄出什麼。我應該優化哪個比例?

回答

2

它們最終都是誤導性的,但方式不同。

錯過點擊是有趣的知道,但是你可以通過在處理錯誤時進行大量的算術來「浸泡」一些錯過。錯過#instructions會告訴你一些事情,因爲很少的失誤/指令建議你是在這種情況下。這並不意味着你確實是這樣的,例如,如果下一個未命中的負載的地址是通過一個長計算來計算的,而這個長計算本身取決於前一個未命中,那麼它將全部變成序列化,並且未命中/指令變得有點誤導。即便如此,如果它足夠低,那麼總時間主要取決於算術,所以錯過不會是一個大問題。

它不應該被優化,因爲你可以做無用的算術工作作弊。或者更合理地說,做一個折衷,花費更多(有用)的算術來減少一些失誤,這聽起來不錯,除非你可以用它做得太過分。很明顯,如果它開始佔用更多的實際時間(或者一般情況下它開始在你真正關心的任何事情上表現更差),那麼改進一些相當人爲的指標並不重要(除非那真的是你所關心的,你可能在綜合基準)。錯誤/引用很明顯地告訴你一些關於你的訪問模式的事情,但是做大量的緩存命中內存引用並不是一個好代碼的指示器:也許只有很多不必要的內存引用。或者換一種說法,如果只需要一次數據,然後再次觸摸它(即使沒有錯過時)仍然是浪費。這真的取決於問題。例如,如果你只是總結一個數組,從這個度量標準的角度看,把累加器放到內存中看起來非常好,但是這顯然是一件非常糟糕的事情。

所以,

該比值應我的目標是優化?

既不是,除非你想要的東西是純合成的。使用它們來獲取代碼執行方式的線索,然後優化已用時間(或功率或其他,取決於您的目標)。這些「可疑的好人」可能是他們「壞」的線索,所以也許應該被稱爲低和高。

相關問題