2012-09-26 73 views
22

我想弄清楚爲什麼修改後的C程序運行速度比未修改的計數器部分要快(我添加了幾行代碼來執行一些額外的工作)。在這種情況下,我懷疑「緩存效果」是主要的解釋(指令緩存)。因此,我到達perf(https://perf.wiki.kernel.org/index.php/Main_Page)概要分析工具,但不幸的是,我無法理解其輸出緩存未命中的含義。提供什麼是perf cache事件的含義?

有關緩存幾個事件:

cache-references         [Hardware event] 
    cache-misses          [Hardware event] 
    L1-dcache-loads         [Hardware cache event] 
    L1-dcache-load-misses        [Hardware cache event] 
    L1-dcache-stores         [Hardware cache event] 
    L1-dcache-store-misses        [Hardware cache event] 
    L1-dcache-prefetches        [Hardware cache event] 
    L1-dcache-prefetch-misses       [Hardware cache event] 
    L1-icache-loads         [Hardware cache event] 
    L1-icache-load-misses        [Hardware cache event] 
    L1-icache-prefetches        [Hardware cache event] 
    L1-icache-prefetch-misses       [Hardware cache event] 
    LLC-loads           [Hardware cache event] 
    LLC-load-misses         [Hardware cache event] 
    LLC-stores           [Hardware cache event] 
    LLC-store-misses         [Hardware cache event] 
    LLC-prefetches          [Hardware cache event] 
    LLC-prefetch-misses        [Hardware cache event] 
    dTLB-loads           [Hardware cache event] 
    dTLB-load-misses         [Hardware cache event] 
    dTLB-stores          [Hardware cache event] 
    dTLB-store-misses         [Hardware cache event] 
    dTLB-prefetches         [Hardware cache event] 
    dTLB-prefetch-misses        [Hardware cache event] 
    iTLB-loads           [Hardware cache event] 
    iTLB-load-misses         [Hardware cache event] 
    branch-loads          [Hardware cache event] 
    branch-load-misses         [Hardware cache event] 
    node-loads           [Hardware cache event] 
    node-load-misses         [Hardware cache event] 
    node-stores          [Hardware cache event] 
    node-store-misses         [Hardware cache event] 
    node-prefetches         [Hardware cache event] 
    node-prefetch-misses        [Hardware cache event] 

我在哪裏可以找到有關這些字段的解釋?緩存未命中事件總是比其他事件小。這個事件是什麼措施?

如何解釋ls中的26,760個L1-icache-load-misses與下例中的5,708個cache-misses?

perf stat -e L1-icache-load-misses ls 
caches caches~ out 

Performance counter stats for 'ls': 

      26,760 L1-icache-load-misses          

     0.002816690 seconds time elapsed 



perf stat -e cache-misses ls 
caches caches~ out 

Performance counter stats for 'ls': 

      5,708 cache-misses             

     0.002822122 seconds time elapsed 

回答

17

你似乎認爲cache-misses事件是所有其他類型的高速緩存未命中(L1-dcache-load-misses,等等)的總和。其實並非如此。

cache-misses事件表示任何緩存無法提供的內存訪問次數。

我承認perf的文檔不是最好的。

但是,通過閱讀(假設您已經對CPU和性能監視單元的工作方式有了很好的瞭解,這顯然不是計算機體系結構課程),可以學習perf_event_open的相關文檔()函數:

http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html

例如,通過閱讀它,你可以看到cache-misses事件表明通過PERF列表對應PERF_COUNT_HW_CACHE_MISSES

22

一些答案:

  • L1是Level-1的緩存,最小的和最快的國家之一。另一方面,LLC指的是cache hierarchy的最後一級,因此表示最大但最慢的高速緩存。
  • id區分指令緩存和數據緩存。這種方式僅分割L1,其他緩存在數據和指令之間共享。
  • TLB指的是translation lookaside buffer,這是在將虛擬地址映射到物理地址時使用的緩存。
  • 不同的TLB計數器取決於指定的地址是指某個指令還是某些數據。
  • 對於所有的數據訪問,根據給定的內存位置是讀取,寫入還是預取(即爲了稍後讀取而獲取)來保存不同的計數器。
  • 未命中數表示多長時間訪問一個給定的數據項,但是而不是存在於緩存中。
+0

感謝您的回答。你在使用這個工具嗎?您如何解釋被稱爲硬件事件而不是硬件緩存事件的緩存未命中事件。我雖然是其他人的總和,但根本沒有。 –

+0

此外,「加載」和「預取」之間有什麼區別? –

+0

@ManuelSelva:我自己並沒有使用'perf',所以我沒有什麼實際經驗。特別是,與所有硬件緩存事件相比,我不確定「cache-missses」事件實際描述的是什麼。我並不完全確定預取:有一種方法可以在應用程序級別觸發預取以及硬件預測的數據訪問的自動預取。其中之一或兩者都可能是預取計數器實際描述的內容。 'perf'文件提到製造商規格的更多細節,但我還沒有找到相關章節。 – MvG