簡體   English   中英

為什么 perf 不報告“dcache-store-misses”?

[英]Why won't perf report “dcache-store-misses”?

我正在使用 perf 收集有關我的代碼的一些指標,並且正在運行以下命令:

sudo perf stat -e L1-dcache-load-misses,L1-dcache-store-misses ./progB

L1-dcache-load 未命中運行良好,但 L1-dcache-store-misses 總是返回:

<not supported>      L1-dcache-store-misses   

我可能做錯了什么?

Perf 為用戶請求的通用事件或默認事件集(在perf stat中)打印<not supported> ,這些事件未映射到當前硬件上的真實硬件 PMU 事件。 您的硬件與L1-dcache-store-misses通用事件不完全匹配,因此 perf 會通知您您的請求sudo perf stat -e L1-dcache-load-misses,L1-dcache-store-misses./progB不能在當前機器上完全實現。

根據linux kernel 文件arch/x86/events/intel/core.c ,您的 cpu 是“以前的 Kaby Lake 產品”

#L4986
case INTEL_FAM6_KABYLAKE:
    memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids));

此文件的第 420 行是 skylake pmu - skl_hw_cache_event_ids的緩存事件映射(通用 perf 事件名稱到真實 hw pmu 事件代碼),並且您的 l1d 加載/存儲未命中是[ C(L1D ) ] - [ C(OP_READ) ] / [ C(OP_WRITE) ] - [ C(RESULT_MISS) ]這個奇怪數據結構的字段( = 0表示未映射,並且skl_hw_cache_extra_regs L525有額外的 umask 設置事件):

static ... const... skl_hw_cache_event_ids ... =
{
 [ C(L1D ) ] = {
    [ C(OP_READ) ] = {
        [ C(RESULT_ACCESS) ] = 0x81d0,  /* MEM_INST_RETIRED.ALL_LOADS */
        [ C(RESULT_MISS)   ] = 0x151,   /* L1D.REPLACEMENT */
    },
    [ C(OP_WRITE) ] = {
        [ C(RESULT_ACCESS) ] = 0x82d0,  /* MEM_INST_RETIRED.ALL_STORES */
        [ C(RESULT_MISS)   ] = 0x0,
    }, ...
 },

因此,對於 SkyLake,L1d 未命中是為加載定義的(op_read),而不是為存儲定義的(op_write)。 並且為這兩個操作定義了 L1d 訪問。

這些通用事件可能是很久以前創建的,當時硬件有一些 PMU 事件來實現它們。 例如,Core 2 PMU 有這些事件的映射, arch/x86/events/intel/core.c line 1254 core2_hw_cache_event_ids const - l1d read miss 是 L1D_CACHE_LD.I_STATE,l1d write miss 是 L1D_CACHE_ST.I_STATE。 kernel 中的 perf 子系統只需要保留許多在舊版本中添加的通用事件名稱即可具有兼容性。

您應該檢查sudo perf list cache命令的 output 到 select 支持的 CPU 及其 PMU 事件。 此命令(在最近的 perf 工具版本中)將 output 僅映射通用名稱,還將打印特定於硬件的事件名稱。 您還應該查看英特爾 SDM優化性能計數器手冊,以了解加載和存儲是如何實現的,以及您應該使用哪些 PMU 事件來計算硬件事件。

雖然 L1d 存儲未命中在您的 cpu 上不可用,但您應該考慮什么是存儲未命中以及它是如何實現的。 很可能,這個請求將被傳遞到下一級緩存/內存層次結構,例如它將成為 L2 存儲訪問。 perf 通用事件集很丑陋(在 Core2 的 2 級緩存時代引入)並且只有 L1 和 LLC(最后一級緩存)緩存事件。 不確定 LLC 在當前共享 L3 時代是如何映射的,是 L2 還是 L3( skylake 的 llc = L3 )。 但是特定於英特爾的事件應該可以工作。

暫無
暫無

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

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