【问题标题】:Why won't perf report "dcache-store-misses"?为什么 perf 不报告“dcache-store-misses”?
【发布时间】:2023-03-28 20:10:01
【问题描述】:

我正在使用 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   

我做错了什么?

【问题讨论】:

标签: linux caching perf


【解决方案1】:

Perf 为用户请求的通用事件或默认事件集(在perf stat)打印&lt;not supported&gt;,这些事件未映射到当前硬件上的真实硬件 PMU 事件。您的硬件与 L1-dcache-store-misses 通用事件不完全匹配,因此 perf 会通知您您的请求 sudo perf stat -e L1-dcache-load-misses,L1-dcache-store-misses ./progB 无法在当前机器上完全实现。

你的cpu是"Product formerly Kaby Lake",根据linux kernel file arch/x86/events/intel/core.c有skylake PMU:

#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 事件名称到真实硬件 pmu 事件代码),而您的 l1d 加载/存储未命中是 [ C(L1D ) ] - [ C(OP_READ) ] / @ 987654340@ - [ 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 读取未命中是 L1D_CACHE_LD.I_STATE,l1d 写入未命中是 L1D_CACHE_ST.I_STATE。内核中的 perf 子系统只需要保留许多在旧版本中添加的通用事件名称即可具有兼容性。

您应该检查sudo perf list cache 命令的输出,为您的 CPU 及其 PMU 选择支持的事件。此命令(在最近的 perf 工具版本中)将仅输出映射的通用名称,还将打印特定于硬件的事件名称。您还应该查看Intel SDM、optimization 和perfcounters 手册,以了解加载和存储是如何实现的,以及您应该使用哪些 PMU 事件来计算硬件事件。

虽然 L1d 存储未命中在您的 cpu 上不可用,但您应该考虑什么是存储未命中以及它是如何实现的。很可能,这个请求将被传递到下一级缓存/内存层次结构,例如它将成为 L2 存储访问。 perf 通用事件集是丑陋的(在 Core2 的 2 级缓存时代引入)并且只有 L1 和 LLC(最后一级缓存)缓存事件。不确定 LLC 在当前共享 L3 时代是如何映射的,是 L2 还是 L3 (skylake's llc = L3)。但是intel-specific events 应该可以工作。

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2022-01-22
    • 2013-01-18
    • 2014-01-26
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多