我想找回DRAM 存取次数在我的应用程序中。准确地说,我需要区分数据和代码访问之间。该处理器是一个Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz
(Haswell
)。基于英特尔软件开发人员手册,第 3 卷 https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html and Perf
, 我可以find and 分类下列内存访问相关 events:
(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
My choices如下面所述:
- 看来总和是
LLC-load-misses
and LLC-store-misses
将返回wholeDRAM 访问(相当于,我可以使用LLC-misses
in Perf
).
- For 仅数据访问,我用过
mem_load_uops_retired.l3_miss
。
它不包括stores,但似乎是OK (because商店似乎
成为much 频率较低?!).
- 简单来说,
LLC-load-misses
- mem_load_uops_retired.l3_miss
=
DRAM Accesses for Code
(因为代码是只读).
这些是不是选择合理的?
我的其他问题:(第二个是最重要的)
- 什么是
local_dram
and any_response
?
- 乍一看,似乎,组(C), is a 更高分辨率的版本load的事件组(A)。但我的测试表明,事件former组是更频繁比latter。例如,在一个simple基准,数量
offcore_response.all_reads.l3_miss.any_response
事件是twice像......一样多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组,包括由以下原因引起的 DRAM 访问事件Read for Ownership
操作(对于Cache Coherency
协议)。它似乎不相关的我的问题。
组(F),对由以下原因引起的 DRAM 读取进行计数L2-cache
预取器这也是不相关的我的问题。
根据我对问题的理解,我建议在指定处理器上使用以下两个事件:
-
OFFCORE_RESPONSE.ALL_READS.L3_MISS.LOCAL_DRAM
:这包括所有可缓存数据读取和写入事务以及所有代码提取事务,无论该事务是由指令(退休与否)或预取或任何类型启动的。每个事件准确地代表对内存控制器的 64 字节读取请求。
-
OFFCORE_RESPONSE.ALL_CODE_RD.L3_MISS.LOCAL_DRAM
:这包括对 IMC 的所有代码获取访问。
(我认为对于不可缓存的代码获取请求,这两个事件都不会发生,但我没有对此进行测试,并且文档对此并不清楚。)
通过从第一个事件中减去第二个事件,可以将“数据访问”与“代码访问”分开来测量。这两个事件可以在 Haswell 上的同一个逻辑核心上同时计数,无需复用。
当然,还有其他交易确实会进入 IMC,但不会被上述两个事件中的任何一个计算在内。其中包括:(1) L3 写回、(2) 来自内核的不可缓存的部分读取和写入、(3) 完全 WCB 逐出以及 (4) 来自 IO 设备的内存访问。根据工作负载,类型 (1)、(3) 和 (4) 的访问可能会占 IMC 总访问的很大一部分。
看来 LLC-load-misses 和 LLC-store-misses 的总和将
返回整个 DRAM 访问(相当于,我可以使用 LLC-misses
在性能中)。
请注意以下事项:
- 事件
LLC-load-misses
is a perf
映射到本机事件的事件OFFCORE_RESPONSE.DEMAND_DATA_RD.L3_MISS.ANY_RESPONSE
.
- 事件
LLC-store-misses
被映射到OFFCORE_RESPONSE.DEMAND_RFO.L3_MISS.ANY_RESPONSE
.
这些不是您想要的事件,因为:
- The
ANY_RESPONSE
位指示针对任何单元(而不仅仅是 IMC)的请求都可能发生该事件。
- 这些事件对 L1 数据预取和页面遍历请求进行计数,但不对 L2 数据预取进行计数。您通常需要对消耗内存带宽的所有预取进行计数。
对于仅数据访问,我使用了 mem_load_uops_retired.l3_miss。确实如此
不包括商店,但似乎还可以(因为商店似乎很多
频率较低?!)。
使用过程中存在很多问题mem_load_uops_retired.l3_miss
哈斯韦尔:
- 在某些情况下,此事件不可靠,因此如果有替代方案,则应避免使用此事件。否则,分析方法应考虑此事件计数的潜在不可靠性。
- 该事件仅针对来自退役负载的请求而发生,并且忽略推测负载和所有存储,这可能很重要。
- 以有意义的方式对这个事件和其他事件进行算术并不容易。例如,您建议做“
LLC-load-misses
- mem_load_uops_retired.l3_miss
= 代码的 DRAM 访问”不正确。
local_dram 和any_response 是什么?
并非所有在 L3 中丢失的请求都会发送至 IMC。一个典型的例子是内存映射的 IO 请求。您说过您只想要发送至 IMC 的核心发起请求,所以local_dram
是正确的位。
乍一看,组(C)似乎是更高分辨率的版本
(A)组的负载事件。但我的测试表明,事件
前一组比后一组出现的频率要高得多。例如,在一个
简单的基准,数量
offcore_response.all_reads.l3_miss.any_response 事件是
许多是 LLC 负载未命中。
这是正常的,因为offcore_response.all_reads.l3_miss.any_response
包含LLC-load-misses
并且可以很容易地变得更大。
组 (E) 属于按需读取(即所有非预取读取)。
这是否意味着,例如:
offcore_response.all_data_rd.l3_miss.any_response -
offcore_response.demand_data_rd.l3_miss.any_response = DRAM 读取
预取导致的访问?
没有为什么:
- the
any_response
如上所述,
- 此减法仅导致 L2 数据加载预取,而不是所有数据加载硬件和软件预取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)