如何确定缓存行write allocate产生的内存加载次数?是否有perf events可统计?
如何统计缓存行写分配导致的内存加载次数
针对你的问题,以下是几种可靠的方法,尤其是基于CPU性能计数器(Perf Events)的方案:
一、利用Perf Events直接/间接统计
不同CPU架构提供了针对性的性能事件,可精准或近似统计写分配触发的内存加载:
Intel平台
- 精准事件(Ice Lake及以后架构):
MEM_INST_RETIRED.STORE_ALLOC_LOADS直接统计因写分配操作而退休的加载指令数,这是最准确的指标。
执行命令:perf stat -e mem_inst_retired.store_alloc_loads ./your_workload - 兼容方案(旧架构):通过计算差值得到写分配加载数:用
LLC-loads(所有L3缓存加载请求)减去LLC-loads-from-reads(主动读请求触发的L3加载),剩余部分即为写分配导致的L3加载。
执行命令:
计算方式:perf stat -e llc-loads,llc-loads-from-reads ./your_workload写分配加载数 = llc-loads - llc-loads-from-reads
AMD平台
- 直接使用
L3_CACHE_MISS.WRITE_ALLOC事件,统计L3缓存写分配导致的缺失(即触发的内存加载):
执行命令:perf stat -e l3_cache_miss.write_alloc ./your_workload
二、代码对比验证
通过对比普通存储和非临时存储的性能数据,验证写分配的影响:
- 在目标代码段中,先使用普通存储指令运行,统计上述Perf事件;
- 再替换为非临时存储指令(如Intel的
_mm_stream_si64、_mm_stream_ps,AMD的对应内置函数),重新统计; - 两次统计的差值,就是该代码段中写分配带来的内存加载次数。
注意:非临时存储仅适用于后续不再复用的缓存行,滥用会破坏正常缓存命中,反而降低性能。
三、采样分析定位热点
使用Perf采样工具定位产生大量写分配的代码路径:
perf record -e mem_inst_retired.store_alloc_loads -g ./your_workload perf report
该命令会生成带调用栈的采样报告,可直观看到哪些函数或代码块贡献了最多的写分配加载。此外,Intel VTune、AMD uProf等专业工具也提供了可视化的写分配统计面板,便于深入分析。
内容的提问来源于stack exchange,提问作者Frontier_Setter
相关产品推荐
相关产品推荐

