繁体   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