DRAM 访问的性能计数器

2024-03-21

我想找回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(使用前将#替换为@)

DRAM 访问的性能计数器 的相关文章

  • 为什么 ls 的这些指令数相差如此之大? (ptrace vs perf vs qemu)

    我想统计运行 bin ls 时执行的指令总数 我使用了 3 种方法 其结果差异很大 我不知道为什么 1 使用 ptrace 进行指令计数 我编写了一段代码 调用 ls 的实例并使用 ptrace 单步执行它 include
  • 在 Skylake 上展开 1 周期循环会使性能降低 25%。 uops调度问题?

    TL DR我有一个循环需要 1 个周期才能在 Skylake 上执行 它执行 3 次加法 1 次增量 跳转 当我将其展开超过 2 次 无论多少次 时 我的程序运行速度会慢 25 左右 这可能与对齐有关 但我不清楚是什么 编辑 这个问题曾经询
  • Python 中的解释与动态调度惩罚

    我观看了 Brandon Rhodes 关于 Cython 的演讲 EXE 的日子即将到来 Brandon 在 09 30 提到 对于特定的一小段代码 跳过解释可以带来 40 的加速 而跳过分配和调度则可以带来 574 的加速 10 10
  • 使用 while() 和 sleep() 让程序进入睡眠模式的区别

    我创建了一个共享对象并从两个不同的程序访问它并测量时间 DATA 数组是两个进程之间的共享对象 您没有准确描述如何运行不同版本 不同的进程 但假设它们是连续的 您可能会看到 sleep 的影响 当然 这取决于具体的实现和硬件 但很可能会让您
  • 有没有办法将 kptr_restrict 设置为 0?

    我目前在运行 linux perf 时遇到问题 主要是因为 proc sys kernel kptr restrict当前设置为 1 但是 如果我尝试 proc sys kernel kptr restrict通过回显 0 来如下 echo
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • 如何使用汇编程序从英特尔处理器中获取随机数?

    我需要从处理器 英特尔酷睿 i3 中的英特尔随机生成器获取随机数 我不想使用任何图书馆 我想在 C 中使用汇编程序粘贴 但我不知道应该使用哪些寄存器和指令 呼叫RDRAND支持的 CPU 目前仅 Ivy Bridge 和 Haswell I
  • 存储缓冲区是否保存现代 x86 上的物理地址或虚拟地址?

    现代 Intel 和 AMD 芯片大存储缓冲区 https stackoverflow com a 54880249 149138在提交到 L1 缓存之前缓冲存储 从概念上讲 这些条目保存存储数据和存储地址 对于地址部分 这些缓冲区条目是否
  • 如何从内核读取性能计数器?

    我一直在用户空间使用Linux perf工具 我想编写代码 在每次执行上下文切换时读取线程的性能计数器 所需步骤是 1 获得一种读取性能计数器寄存器的机制 2 每次上下文切换后从调度程序调用步骤 1 我陷入了步骤 1 因为我无法弄清楚要调用
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • DRAM 访问的性能计数器

    我想找回DRAM 存取次数在我的应用程序中 准确地说 我需要区分数据和代码访问之间 该处理器是一个Intel R Core TM i7 4720HQ CPU 2 60GHz Haswell 基于英特尔软件开发人员手册 第 3 卷 https
  • 添加性能计数器类别使计算机挂起

    我正在尝试从 ASP NET MVC 应用程序 在 Windows 8 x64 PC 上使用 VS 2012 添加性能计数器 但我遇到的问题是 如果我检查类别是否存在或添加新的性能计数器类别 计算机就会挂起 我的代码是 namespace
  • 读取并解析 perf.data

    我正在使用命令 perf record 记录 frm linux 的性能计数器 我想使用结果perf data作为其他编程应用程序的输入 你知道我该如何读取和解析其中的数据吗perf data 有没有办法把它改造成 text文件或 csv
  • 性能分析 asp.net,什么是 ProcessRequestNotificationHelper?

    我正在对每秒 20 个用户的负载下的 ASP NET Web 应用程序进行性能分析 20 个用户基本上使应用程序瘫痪 并且无法加载任何内容 我正在使用 RedGate 性能分析器 但我不知道如何使用它 12 的时间花在我的代码上 我可以深入
  • 使用 rdmsr/rdpmc 提高分支预测精度

    我试图了解分支预测单元在 CPU 中如何工作 我用过papi还有linux的perf events但他们都没有给出准确的结果 对于我的情况 这是我的代码 void func int arr int sequence len for int
  • 跟踪 vb.net 中函数调用的持续时间

    在我们的 VB6 应用程序中 我们添加了一些实用函数来跟踪函数所花费的时间 我们这样做是为了跟踪性能瓶颈 基本上 它的工作原理是有两个实用函数 StartTickCount 和 EndTickCount 您将在每个函数中传递函数名称 函数将
  • 假设没有非时间指令,“xchg”是否包含“mfence”?

    我已经看过了这个答案 https stackoverflow com a 50279772 391161 and 这个答案 https stackoverflow com a 19099164 391161 但似乎都没有清楚明确地说明等价或
  • C#:TurboBoost 激活时如何获取 Intel i 系列 CPU 的当前时钟速度

    我知道有可能获得此信息 Intel 自己的 TurboBoost 侧边栏小工具似乎使用 ActiveX 控件来确定 TurboBoost 处于活动状态时 i3 i5 i7 CPU 的当前时钟速度 但是 我想在 C 中以编程方式执行此操作 从
  • 有没有办法使用 perf 工具查找流程中各个功能的性能?

    我正在尝试在流程中实现各个功能的性能 我该如何使用 perf 工具来做到这一点 还有其他工具吗 例如 假设 main 函数调用函数 A B C 我想分别获得主要功能以及功能 A B C 的性能 有没有一个很好的文档来了解 perf 源代码
  • JMeter:tearDown Thread Group的目的是什么

    我想了解JMeter中tearDown Thread Group的实际用法 在什么场景下可以使用tearDown Thread Group 根据提供的帮助JMeter 拆解线程组 http jmeter apache org userman

随机推荐

  • 滚动到 div 中的某个元素

    我有一个绝对定位的 div 它充当页面中心的模式窗口 模式窗口可垂直滚动 右侧有一个滚动条 页面本身也可以垂直滚动 右侧有一个滚动条 我希望能够单击链接并使模式窗口滚动到链接的项目 我几乎可以使用 target scrollIntoView
  • 检查后在 Gradle 插件中运行任务

    我在 Groovy 下编写了一个 Gradle 插件buildSrc as package test import org gradle api Plugin import org gradle api Project class Samp
  • Java 精确计算 - 使用选项

    我试图对 JAVA SQL 中精确计算的选项进行一些简洁的概述 到目前为止 我找到了以下选项 使用双打 接受他们的缺点 不行 use BigDecimals 在复杂的公式中使用它们对我来说是有问题的 use String format De
  • 将函数应用于列表中所有数据帧的某些列,然后为列赋值

    类似问题已回答here https stackoverflow com questions 22002838 same function over multiple data frames in r 我有一个数据框列表 即 1000 如下所
  • 增强 qi::rule 上的精神语义动作

    我一直在阅读语义动作 我有一个如下所示的规则 property rule identifier rule gt gt lit L gt gt type specification rule gt gt lit L gt gt alnum g
  • Emacs:如何将杀戮环从系统剪贴板中分离出来?

    默认情况下 Emacs 23 x 似乎会将被删除的内容复制到删除环和系统剪贴板 是否可以将杀戮环和剪贴板分开 例如 ctrl k 将内容放入终止环 cmd x 将内容放入系统剪贴板并保留终止环 这在中讨论过这个线程 http lists g
  • 如何在每个测试方法之前和之后执行sql脚本

    有一个 Sqlspring中的注释允许执行sql测试方法前后的代码 Test Sql init sql Sql scripts clean sql executionPhase Sql ExecutionPhase AFTER TEST M
  • 与 Kotlin 泛型的混淆

    我是 Kotlin 的新手 我正在尝试编写一些相当简单的代码 但是我不知道如何使用泛型来使其工作 我有一个Handler代表事物处理程序的特征 我无法更改处理程序的代码 因为它来自库 trait Handler
  • 当我构建多个 ProductFlavors 时,使用 Facebook SDK INSTALL_FAILED_CONFLICTING_PROVIDER

    我正在构建一个包含多个 Android 应用程序productFlavors 并使用Facebook SDK v4 1进行登录和分享内容 问题是 当我尝试在已安装相同应用程序 但风格不同 的设备上安装应用程序时 会引发错误 它不允许我安装第
  • 如何向 Quill.js 添加新格式(
    标签)?

    我想添加一个按钮来添加 hr 标记到quill js 测试版 http beta quilljs com docs quickstart editor 这里的fiddle https jsfiddle net Lgxkj4ag div sp
  • 如何多次发送文件

    有两个 C 项目 一个项目用于客户端 另一个项目用于服务器 第一步是运行服务器 然后选择一个目标文件夹 然后运行客户端项目 选择一些text txt发送到服务器的目标文件夹 只有客户端可以向服务器发送文件 Demo 1 choosing f
  • 为什么有些资源文件放在META-INF目录下

    我想知道为什么有些资源文件放在JAR中的META INF目录下 我总是将像 test properties 这样的资源放在根目录下 将它们放入 META INF 有什么好处吗 许多 Java EE API 都有一个约定 即当您将特定的配置
  • iText,Font、BaseFont 和 createFont() 发生了什么?

    关于 font 和 basefont 的情况对我来说有很多谜团 尤其是当涉及到构造函数时 iText 网站提供了这一行作为新字体的示例代码 BaseFont unicode BaseFont createFont c windows fon
  • Rails 4 - 如何使用枚举?

    我正在尝试在 Rails 4 上制作一个应用程序 我发布了这个问题并得到了一些建议 Rails 4 Simple Form 如何保存键和显示值 https stackoverflow com questions 36539924 rails
  • 如何使用 OpenCV 交换图像中的蓝色和红色通道

    我在交换图像的通道 特别是红色和蓝色 时遇到了一些问题 我正在使用 Opencv 3 0 0 和 Python 2 7 12 以下是我交换频道的代码 import cv2 img cv2 imread input car1 jpg The
  • 逗号运算符重置此

    在下面code https www typescriptlang org play src var 20x 20 3D 20 7B 20f 3A 20function 20 20 7B 20return 20this 20 3D 3D 3D
  • 将图像缩略图添加到网格布局中?

    我有一个图像列表 我需要将小缩略图添加到框架中 我目前有框架SpringLayout 如何使用滚动窗格在某些网格中添加缩略图 如时尚 照片列表可能很大 所以我需要一个滚动窗格 我不知道如何处理这个问题SpringLayout 我知道如何添加
  • 如何在Python中将pptx导出为图像(png、jpeg)?

    我用 Python 开发了一段小代码来生成 PPTX 文件 但我还想生成一张 PNG 或 JPEG 格式的幻灯片图片 from pptx import Presentation from pptx util import Inches im
  • 为 Blazor WASM 保存时重新编译 .razor 文件

    有没有办法让 Blazor WebAssembly 重新编译 razor文件更改 更新然后保存时 我已经习惯了这种情况在传统的 ASP NET Core MVC razor 视图以及客户端框架 如 Angular 中发生 在 ASP NET
  • DRAM 访问的性能计数器

    我想找回DRAM 存取次数在我的应用程序中 准确地说 我需要区分数据和代码访问之间 该处理器是一个Intel R Core TM i7 4720HQ CPU 2 60GHz Haswell 基于英特尔软件开发人员手册 第 3 卷 https