memory - 为什么较新的 Intel CPU 不支持停止循环后端的性能计数器?

标签 memory intel performancecounter perf intel-pmu

我正在使用内存预取来解决内存延迟问题。 Intel 的一些(较旧的)CPU 支持性能计数器,用于计算 CPU 因等待内存( stalled-cycles-backend )而浪费的周期,例如英特尔 E5-2690 .

在较新的 CPU(例如 Gold 6230Gold 6226)上,我找不到这个计数器。是否有另一种方法来计算 CPU 因等待内存 Controller 加载缓存行而浪费的周期?

最佳答案

perf 调用“stalled-cycles-backend”的事件是一个“通用”事件,在不同的处理器模型上实现方式不同。定义很难找到,但在 CentOS 7.6 内核源代码中,定义在“arch/x86/events/intel/core.c”中。对于 Sandy Bridge (Xeon E5-26xx),定义为 Event 0xB1、Umask 0x01、INV=1、CMASK=1。在英特尔架构软件开发人员手册(文档 325384-071,2019 年 10 月)第 3 卷第 19 章中查找此事件,表 19-3 表示在 Skylake Xeon(和 Cascade Lake Xeon)上,此事件意味着相同的事情: “对每个线程没有从保留站 (RS) 发送 uop 的周期进行计数。”

如果您想了解正在计算的内容,我建议不要使用这些“通用”事件。在内核源代码中寻找定义,或者构建一个测试程序来读取执行程序的实际 MSR 是一件痛苦的事情。我今天测试的第一个实际上是错误的——在 Xeon E5 v4 系统上,事件“uops_executed.core_cycles_none”被编程为事件 0xb1,Umask 0x02,INV=1,但 CMASK 未设置为 1。第 18.2 节SWDM 第 3 卷的第 3 卷说,如果 CMASK 为零,则忽略 INV,因此这实际上计算了执行的总 Uop,而不是没有执行 Uop 的周期。 (在运行完全相同内核的 SKX 机器上正确编程了相同的事件。)

在运行英特尔内存延迟测试器时计算总周期数、未分配 Uop 的周期以及至少分配了一个 Uop 的周期的示例:

perf stat -e r0043003c -e r01c301b1 -e r014301b1 ./mlc --idle_latency
  Intel(R) Memory Latency Checker - v3.7
  Command line parameters: --idle_latency 

  Using buffer size of 2000.000MiB
  *** Unable to modify prefetchers (try executing 'modprobe msr')
  *** So, enabling random access for latency measurements
  Each iteration took 182.4 core clocks (   87.1    ns)


 Performance counter stats for './mlc --idle_latency':

    91,815,806,587      r0043003c                                                   
    64,132,006,584      r01c301b1                                                   
    27,683,941,060      r014301b1                                                   

      14.587156882 seconds time elapsed

关于memory - 为什么较新的 Intel CPU 不支持停止循环后端的性能计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641225/

相关文章:

c++ - 在 Intel CPU 上选择 32 位和 64 位内部 CRC

c# - 如何在不让用户在命令提示符下使用 lodctr 重建的情况下让性能计数器工作?

directshow - 是否有任何现代 Windows PC 中没有至少一个 DirectShow 捕获设备?

list - 映射列表时是否在每次迭代后释放内存?

c - 如何在 Visual Studio 2005 中释放动态分配的内存

c++ - 收缩 std::vector 's size to fit its actual data to save memory usage? vec.swap() doesn' t 在 MSVC 中工作吗?

.net - 使用 System.Diagnostics.PerformanceData 中的新类有哪些优势?

javascript - 在哪里可以找到页面(包括图像和多媒体)的真实内存使用情况?

intel - mem_load_uops_retired.l3_miss 和 offcore_response.demand_data_rd.l3_miss.local_dram 事件之间的区别

intel - 了解 Intel Intrinsics Guide 中的代码示例