簡體   English   中英

PERF STAT不計算內存負載,但計算內存存儲

[英]PERF STAT does not count memory-loads but counts memory-stores

Linux內核: 4.10.0-20(通用)(也在4.11.3上嘗試過)

Ubuntu的: 17.04

我一直在嘗試使用perf stat收集內存訪問的perf stat 我能夠收集內存存儲的統計信息,但內存負載的計數返回0值

以下是內存存儲的詳細信息:

perf stat -e cpu/mem-stores/u ./libquantum_base.arnab 100
N = 100, 37 qubits required
Random seed: 33
Measured 3277 (0.200012), fractional approximation is 1/5.
Odd denominator, trying to expand by 2.
Possible period is 10.
100 = 4 * 25

 Performance counter stats for './libquantum_base.arnab 100':

       158,115,510      cpu/mem-stores/u                                            

       0.559922797 seconds time elapsed

對於內存負載,我得到一個0計數 ,如下所示:-

perf stat -e cpu/mem-loads/u ./libquantum_base.arnab 100
N = 100, 37 qubits required
Random seed: 33
Measured 3277 (0.200012), fractional approximation is 1/5.
Odd denominator, trying to expand by 2.
Possible period is 10.
100 = 4 * 25

 Performance counter stats for './libquantum_base.arnab 100':

                 0      cpu/mem-loads/u                                             

       0.563806170 seconds time elapsed

我不明白為什么這算不上正確。 我是否應該以任何方式使用其他事件來獲取正確的數據

mem-loads事件映射到Intel處理器上的MEM_TRANS_RETIRED.LOAD_LATENCY_GT_3性能監視單元事件。 事件MEM_TRANS_RETIRED.LOAD_LATENCY_*是特殊事件,只能通過使用p修飾符進行計數。 也就是說,必須將mem-loads:p指定給perf才能正確使用該事件。

MEM_TRANS_RETIRED.LOAD_LATENCY_*是一個精確事件,僅在精確級別進行計數才有意義。 根據這篇英特爾文章(重點是我):

當用戶選擇對這些事件之一進行采樣時,將使用特殊的硬件來跟蹤從發布到完成的數據加載。 這比簡單地對事件的實例進行計數(如基於常規事件的常規采樣)更為復雜,因此僅跟蹤某些負載 隨機選擇負載,確定每個負載的延遲,然后增加正確的事件(延遲> 4,> 8,> 16等)。 由於此事件的采樣性質, 在任何時候都只能跟蹤應用程序數據加載的一小部分

如您所見, MEM_TRANS_RETIRED.LOAD_LATENCY_*絕不計算負載總數,它根本不是為此目的而設計的。

如果要確定代碼中的哪些指令正在發出需要完成多個周期的加載請求,則MEM_TRANS_RETIRED.LOAD_LATENCY_*是正確的性能事件。 實際上,這恰恰是perf-mem的目的,它通過使用此事件來實現其目的。

如果要計算已退休的負載總數,則應使用L1-dcache-loads ,它映射到Intel處理器上的MEM_UOPS_RETIRED.ALL_LOADS性能事件。

另一方面, mem-storesL1-dcache-stores被映射到所有當前Intel處理器上的完全相同的性能事件,即MEM_UOPS_RETIRED.ALL_STORES ,該事件不計算所有已退休的存儲單元。

因此,總而言之,如果您使用的是perf-stat ,則(幾乎)應該始終使用L1-dcache-loadsL1-dcache-stores分別計算退休的負載和存儲。 這些被映射到您在發布的答案中使用的原始事件,僅具有更高的可移植性,因為它們也適用於AMD處理器。

我已使用Broadwell(CPU e5-2620)服務器計算機來收集以下所有事件。

要收集內存加載事件,我必須使用數字事件值。 我基本上運行了以下命令-

./perf record -e "r81d0:u" -c 1 -d -m 128 ../../.././libquantum_base 20

在此,r81d0表示用於計算“所有已退出指令中的內存負載”的原始事件。 可以理解的“ u”表示用戶空間。

另一方面,以下命令

./perf record -e "r82d0:u" -c 1 -d -m 128 ../../.././libquantum_base 20

具有“ r82d0:u”作為原始事件,表示“在用戶空間中退休的所有指令中的存儲器”。

暫無
暫無

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

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