为什么 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 总是 returns 这个:
<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
无法在当前机器上完全实现。
你的 cpu 是 "Product formerly Kaby Lake" which has skylake PMU according to linux kernel file arch/x86/events/intel/core.c
:
#L4986
case INTEL_FAM6_KABYLAKE:
memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids));
此文件的第 420 行是 skylake pmu 的缓存事件映射(通用 perf 事件名称到真实 hw pmu 事件代码)- skl_hw_cache_event_ids
, and your l1d load/store miss are [ C(L1D ) ]
- [ C(OP_READ) ]
/ [ C(OP_WRITE) ]
- [ C(RESULT_MISS) ]
fields of this strange data structure (= 0
means not mapped, and 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
命令的输出到 select 支持您的 CPU 及其 PMU 的事件。此命令(在最近的 perf 工具版本中)将仅输出映射的通用名称,还将打印特定于硬件的事件名称。您还应该查看 Intel SDM, optimization and perfcounters 手册以了解加载和存储的实现方式以及您应该使用哪些 PMU 事件来计算硬件事件。
虽然 L1d store miss 在您的 cpu 上不可用,您应该考虑什么是 store miss 以及它是如何实现的。可能,此请求将传递到 cache/memory 层次结构的下一级,例如它将成为 L2 存储访问。 perf generic event set很难看(在Core2的2级缓存时代引入),只有L1和LLC(末级缓存)缓存事件。不确定 LLC 在当前共享 L3 时代是如何映射的,是 L2 还是 L3(skylake's llc = L3). But intel-specific events 应该可以。
我正在使用 perf 收集关于我的代码的一些指标,我是 运行 以下命令:
sudo perf stat -e L1-dcache-load-misses,L1-dcache-store-misses ./progB
L1-dcache-load 未命中效果很好,但 L1-dcache-store-misses 总是 returns 这个:
<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
无法在当前机器上完全实现。
你的 cpu 是 "Product formerly Kaby Lake" which has skylake PMU according to linux kernel file arch/x86/events/intel/core.c
:
#L4986
case INTEL_FAM6_KABYLAKE:
memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids));
此文件的第 420 行是 skylake pmu 的缓存事件映射(通用 perf 事件名称到真实 hw pmu 事件代码)- skl_hw_cache_event_ids
, and your l1d load/store miss are [ C(L1D ) ]
- [ C(OP_READ) ]
/ [ C(OP_WRITE) ]
- [ C(RESULT_MISS) ]
fields of this strange data structure (= 0
means not mapped, and 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
命令的输出到 select 支持您的 CPU 及其 PMU 的事件。此命令(在最近的 perf 工具版本中)将仅输出映射的通用名称,还将打印特定于硬件的事件名称。您还应该查看 Intel SDM, optimization and perfcounters 手册以了解加载和存储的实现方式以及您应该使用哪些 PMU 事件来计算硬件事件。
虽然 L1d store miss 在您的 cpu 上不可用,您应该考虑什么是 store miss 以及它是如何实现的。可能,此请求将传递到 cache/memory 层次结构的下一级,例如它将成为 L2 存储访问。 perf generic event set很难看(在Core2的2级缓存时代引入),只有L1和LLC(末级缓存)缓存事件。不确定 LLC 在当前共享 L3 时代是如何映射的,是 L2 还是 L3(skylake's llc = L3). But intel-specific events 应该可以。