如何统计缓存中已加载未使用的数据?Intel与AMD平台PMU方案咨询
Intel 8352Y(Icelake)平台监控方案
1. 预取判断错误
- 直接统计无效预取:使用
L2_PREFETCH.L2_DATA_PREFETCH_MISS事件,它会记录L2预取器发起的预取请求最终未命中L2的次数,这类情况基本代表预取的数据没被用上就被淘汰;针对L1预取的错误,可使用L2_PREFETCH.L1_DATA_PREFETCH_MISS事件。 - 间接评估比例:结合
MEM_INST_RETIRED.PREFETCH(已完成的预取指令总数)和LLC_MISSES.PREFETCH(预取导致的LLC未命中数),两者的差值可大致算出无效预取的规模。
2. 缓存行部分访问
- 核心事件:
MEM_LOAD_RETIRED.LINE_SPLIT统计跨缓存行的加载操作,这类操作必然只用到了缓存行的部分数据;对应存储场景使用MEM_STORE_RETIRED.LINE_SPLIT事件。 - 比例评估:将上述拆分事件的计数,与
MEM_INST_RETIRED.ALL_LOADS/MEM_INST_RETIRED.ALL_STORES的总访问数做对比,即可算出部分访问的占比。
AMD 9654(Zen4)平台监控方案
1. 预取判断错误
- 层级化无效预取统计:L2层级使用
L2_PREFETCH_FETCH.MISS事件,记录L2预取未命中的次数;L3层级使用L3_PREFETCH.FETCH_MISS事件。 - 直接对比预取使用率:用
PREFETCH_INSTRUCTIONS.RETIRED(退休的预取指令总数)减去PREFETCH_INSTRUCTIONS.USED(实际被使用的预取指令数),得到的就是未被使用的预取数量。
2. 缓存行部分访问
- 核心事件:
MEMORY_OPERATIONS.LOAD_SPLIT统计跨缓存行的加载操作,MEMORY_OPERATIONS.STORE_SPLIT统计跨缓存行的存储操作,这两类事件直接对应缓存行部分访问的场景。 - 比例评估:结合
CACHE_ACCESS.L1D_ALL(L1数据缓存总访问数)和上述拆分事件的计数,计算部分访问的占比。
通用工具使用
可以用perf工具直接采集这些事件,比如:
- Intel平台测试跨缓存行加载:
perf stat -e mem_load_retired.line_split <你的程序> - AMD平台测试预取使用率:
perf stat -e prefetch_instructions.retired,prefetch_instructions.used <你的程序>
内容的提问来源于stack exchange,提问作者Frontier_Setter
相关产品推荐
相关产品推荐

