【发布时间】:2021-02-26 20:44:04
【问题描述】:
我想在我的应用程序中检索 DRAM 访问次数。准确地说,我需要区分数据和代码访问。处理器是Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz (Haswell)。基于Intel Software Developer's Manual, Volume 3 和Perf,我可以找到和分类以下内存访问相关的事件:
(A)
LLC-load-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-store-misses [Hardware cache event]
LLC-stores [Hardware cache event]
=========================================================================
(B)
mem_load_uops_l3_miss_retired.local_dram
mem_load_uops_retired.l3_miss
=========================================================================
(C)
offcore_response.all_code_rd.l3_miss.any_response
offcore_response.all_code_rd.l3_miss.local_dram
offcore_response.all_data_rd.l3_miss.any_response
offcore_response.all_data_rd.l3_miss.local_dram
offcore_response.all_reads.l3_miss.any_response
offcore_response.all_reads.l3_miss.local_dram
offcore_response.all_requests.l3_miss.any_response
=========================================================================
(D)
offcore_response.all_rfo.l3_miss.any_response
offcore_response.all_rfo.l3_miss.local_dram
=========================================================================
(E)
offcore_response.demand_code_rd.l3_miss.any_response
offcore_response.demand_code_rd.l3_miss.local_dram
offcore_response.demand_data_rd.l3_miss.any_response
offcore_response.demand_data_rd.l3_miss.local_dram
offcore_response.demand_rfo.l3_miss.any_response
offcore_response.demand_rfo.l3_miss.local_dram
=========================================================================
(F)
offcore_response.pf_l2_code_rd.l3_miss.any_response
offcore_response.pf_l2_data_rd.l3_miss.any_response
offcore_response.pf_l2_rfo.l3_miss.any_response
offcore_response.pf_l3_code_rd.l3_miss.any_response
offcore_response.pf_l3_data_rd.l3_miss.any_response
offcore_response.pf_l3_rfo.l3_miss.any_response
我的选择如下:
- 看来
LLC-load-misses和LLC-store-misses之和 将返回 whole DRAM 访问(等效地,我可以使用LLC-misses在Perf)。 - 对于仅数据访问,我使用了
mem_load_uops_retired.l3_miss。 它不包括商店,但似乎OK(因为商店似乎 很多 不那么频繁?!)。 - 简单地说,
LLC-load-misses-mem_load_uops_retired.l3_miss=DRAM Accesses for Code(因为代码是只读)。
这些选择是否合理?
我的其他问题:(第二个最重要)
- 什么是
local_dram和any_response? - 起初,group (C) 似乎是 group 的 load 事件的更高分辨率版本(一)。但我的测试表明,前组中的事件比后组中的事件更频繁。例如,在简单基准测试中,
offcore_response.all_reads.l3_miss.any_response事件的数量是LLC-load-misses的两倍。 -
组 (E),属于
demand reads(即所有non-prefetched读取)。这是否意味着,例如:offcore_response.all_data_rd.l3_miss.any_response-offcore_response.demand_data_rd.l3_miss.any_response= 预取导致的 DRAM 读取访问?
组 (D),包括由Read for Ownership 操作(针对Cache Coherency 协议)引起的 DRAM 访问事件。这似乎与我的问题无关。
组 (F),计算由 L2-cache prefetcher 引起的 DRAM 读取,这也与我的问题无关。
【问题讨论】:
-
请注意,对同一缓存行的多次未命中(同时)只会触发一个
LLC-load-misses事件,但 IIRC 每一个都将计为mem_load_uops_retired.l3_miss。例如如果你访问一个结构的多个成员,这些成员都来自同一个缓存行,加载的微指令将自己附加到一个 LFB 以等待传入的缓存行。 -
@PeterCordes - 不,同一行的后续未命中应该是
mem_load_uops_retired.hit_lfb。 -
“DRAM 访问”是指源自内核并在 L3 中丢失并进入 IMC 的访问?正在寻找适用于 i7-4720HQ 或更多处理器集合的解决方案?
-
是的,上面提到的处理器就足够了。
-
如果你没有像 @HadiBrais 这样 ping 我,我可能会忘记跟进你的回复。
标签: performance-testing intel performancecounter perf memory-access