首页 > 解决方案 > mem_load_uops_retired.l3_miss 和 offcore_response.demand_data_rd.l3_miss.local_dram 事件之间的区别

问题描述

我有一个Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz( Haswell) 处理器。AFAIKmem_load_uops_retired.l3_miss计算DRAM demand(即non-prefetch)数据读取访问次数。offcore_response.demand_data_rd.l3_miss.local_dram顾名思义,计算demand针对 DRAM 的数据读取次数。因此,这两个事件似乎是等价的(或至少几乎相同)。但基于以下基准,前一个事件的频率远低于后者:

1) 在循环中初始化 1000 个元素的全局数组C

Performance counter stats for '/home/ahmad/Simple Progs/loop':

         1,363      mem_load_uops_retired.l3_miss                                   
         1,543      offcore_response.demand_data_rd.l3_miss.local_dram                                   

   0.000749574 seconds time elapsed

   0.000778000 seconds user
   0.000000000 seconds sys

2) 在 Evince 中打开 PDF 文档:

Performance counter stats for '/opt/evince-3.28.4/bin/evince':

       936,152      mem_load_uops_retired.l3_miss                                   
     1,853,998      offcore_response.demand_data_rd.l3_miss.local_dram                                   

   4.346408203 seconds time elapsed

   1.644826000 seconds user
   0.103411000 seconds sys

3) 运行 Wireshark 5 秒:

Performance counter stats for 'wireshark':

     5,161,671      mem_load_uops_retired.l3_miss                                   
     8,126,526      offcore_response.demand_data_rd.l3_miss.local_dram                                   

  15.713828395 seconds time elapsed

   0.904280000 seconds user
   0.693906000 seconds sys

4) 在 Inkscape 中对图像运行模糊滤镜:

Performance counter stats for 'inkscape':

    13,852,121      mem_load_uops_retired.l3_miss                                   
    23,475,970      offcore_response.demand_data_rd.l3_miss.local_dram                                   

  25.355643897 seconds time elapsed

   7.244404000 seconds user
   1.019895000 seconds sys

所有四个基准测试中,频率几乎offcore_response.demand_data_rd.l3_miss.local_dram是. 这合理吗?为什么?请告诉我基准是否过于复杂粗粒度mem_load_uops_retired.l3_miss

标签: intelperformancecounterperfmemory-accessintel-pmu

解决方案


据我(目前)所知,下表显示了 Haswell 上这两个事件之间的差异:

mem_load_uops_retired.l3_miss offcore_response.demand _data_rd.l3_miss.local_dram
可缓存的已停用负载 Uop 每 uop 每行
可缓存的非退休负载 Uop ñ
不可缓存的 WC 已停用的加载 Uops 每行一个事件 ñ
不可缓存的 UC 退休负载 Uops 可能发生 ñ
不可缓存的 WC 或 UC 非退休负载 Uop ñ ñ
任何类型的锁定加载到任何内存类型 可能发生 我不知道
旧版 IO 请求 可能发生 ñ
L1D 预取 ñ
L2 预取到 L2 或 L3 ñ ñ
无意写入的软件预取 ñ
页面浏览加载 ñ
服务单位 任何 本地 DRAM
可靠性 可能不可靠 可靠的

现在您应该清楚,这些事件通常根本不等同。同样,比较这两个事件的计数以推断出有意义的事情也不是一件容易的事。

在您提供的所有示例中,offcore_response.demand_data_rd.l3_miss.local_dram事件计数都大于mem_load_uops_retired.l3_miss事件计数。但是,不难想出后者大于前者的真实例子。

在所有四个基准测试中,offcore_response.demand_data_rd.l3_miss.local_dram 的频率几乎是 mem_load_uops_retired.l3_miss 的两倍。这合理吗?

我认为“几乎两次”的描述实际上只适用于第二个例子,而不适用于其他例子。如果没有看到确切的代码和执行环境信息,我无法评论您显示的数字。


推荐阅读