Perf 显示没有内存访问的块中的 L1-dcache-load-misses

2023-11-29

下面是一个代码块,perf record 标记为导致所有 L1-dcache 未命中的 10%,但该块完全是 zmm 寄存器之间的移动。这是 perf 命令字符串:

perf record -e L1-dcache-load-misses -c 10000 -a -- ./Program_to_Test.exe

代码块:

Round:
vmulpd zmm1,zmm0,zmm28
VCVTTPD2QQ zmm0{k7},zmm1
VCVTUQQ2PD zmm2{k7},zmm0
vsubpd zmm3,zmm1,zmm2
vmulpd zmm4,zmm3,zmm27
VCVTTPD2QQ zmm5{k7}{z},zmm4

VPCMPGTQ k2,zmm5,zmm26
VPCMPEQQ k3 {k7},zmm5,zmm26
KADDQ k1,k2,k3

VCVTQQ2PD zmm2{k7},zmm0
VDIVPD zmm1{k7},zmm2,zmm28 ; Divide by 100
VPXORQ zmm2{k7},zmm2,zmm2
vmovupd zmm2,zmm1
VADDPD zmm2{k1},zmm1,zmm25

对于该代码块,我使用其他 L1 度量(例如 l1d.replacement)得到了类似的结果。

我的问题是,一个仅是 zmm 寄存器移动的块如何会产生 L1 缓存未命中?我认为寄存器根本不会进入内存。事实上,最后一次内存访问是在该代码块之上的10条指令;其他9条指令都是寄存器到寄存器指令。


事件L1-dcache-load-misses被映射到L1D.REPLACEMENT在桑迪桥和后来的微架构上(或映射到旧微架构上的类似事件)。此事件不支持精确采样,这意味着样本可能指向无法生成采样事件的指令。 (注意L1-dcache-load-misses当前任何 Atom 均不支持。)

从在 Haswell+ 或 Silvermont+ 微架构上运行的 Linux 3.11 开始,可以通过指定满足以下两个条件的采样事件,使用事件指令指针捕获样本:

  • 该事件支持精确采样。例如,您可以使用代表内存微指令或指令退休的任何事件。事件的确切名称和含义取决于微体系结构。有关详细信息,请参阅英特尔 SDM 第 3 卷。不存在支持精确采样且具有相同确切含义的事件L1D.REPLACEMENT。在支持扩展 PEBS 的处理器上,只有 PEBS 事件的子集支持精确采样。
  • 事件上启用精确采样级别。在 Linux perf 中,这可以通过在事件名称或原始事件编码后附加“:pp”或在 PMU 语法中指定的原始事件的终止斜杠后附加“pp”来完成。例如,在 Haswell 上,事件mem_load_uops_retired.l1_miss:pp可以指定给 Linux perf。

发生此类事件时,当事件计数器溢出时,PEBS 硬件就会启动,这意味着它现在正在寻找尽早收集精确样本的机会。当至少有一条指令会在此时间窗口期间引发事件时,PEBS 硬件最终将由这些指令之一触发,并且偏向于高延迟指令。当触发PEBS的指令退出时,PEBS微码例程将执行并捕获PEBS记录,其中包含触发PEBS的指令的IP(与架构IP不同)等。 perf 用于显示结果的指令指针 (IP) 就是该事件 IP。 (我注意到,指向不可能导致该事件的指令的样本数量可以忽略不计。)

在较旧的微架构(Haswell 和 Silvermont 之前)上,还支持“pp”精确采样级别。这些处理器上的 PEBS 将仅捕获架构事件,该事件指向按程序顺序紧随 PEBS 触发指令之后的静态指令。如果可能的话,Linux perf 使用 LBR,其中包含源-目标 IP 对来确定捕获的 IP 是否是跳转的目标。如果是这种情况,它会将源 IP 作为事件 IP 添加到示例记录中。

一些微体系结构支持一个或多个具有更好采样分布的事件(更好的程度取决于微体系结构、事件、计数器以及计数器即将溢出时正在执行的指令)。在 Linux perf 中,如果支持,可以通过指定精确级别“ppp”来启用精确分发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perf 显示没有内存访问的块中的 L1-dcache-load-misses 的相关文章

  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 我的用例可以合并到单个查询中而不影响性能吗?

    我主要着眼于改善表现查询的内容以及是否能够解决单一查询对于我的用例之一 解释如下 涉及到2张表 Table 1 EMPLOYEE column1 column2 email1 email2 column5 column6 Table 2 E
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 如何对单个 TypoSript 对象生成进行基准测试?

    我想对单个 TypoScript 对象生成进行基准测试以控制性能 是否可以使用某些 stdWrap 方法 我想要对其进行基准测试的 TS 对象示例 Test 1 page 10 RECORDS page 10 tables pages so
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 性能:cakephp-mysql 中的 UUID 与自动递增

    我正在搜索 cakePHP 生成的 UUID 32 个字符长 是否比自动增量在性能上更快 插入和选择操作的比较 我应该使用 cakePHP 生成的 UUID 还是使用 MySQL 的简单自动增量生成的 UUID 这是我发现的一个案例研究 但
  • SSL 速度:128 位与 256 位

    我决定使用 SSL 加密我的整个网站 即使实际上只有部分网站是必要的 最终结果是该网站现在有点慢 所以 我的问题是 我是否应该只加密网站的会员部分 请记住我在首页上有登录表单 我是否应该将加密降低到 128 位 如果站点总体较小 速度差异是
  • PyQt5 - 无法使用 QVideoWidget 播放视频

    from PyQt5 QtWidgets import from PyQt5 QtMultimedia import from PyQt5 QtMultimediaWidgets import from PyQt5 QtCore impor
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • IN 运算符对 SQL 查询性能的影响有多大?

    我的 SQL 查询需要 9 个小时才能执行 见下文 Select Field1 Field2 From A Where Field3 IN 45 unique values here 当我将此查询拆分为 3 个完全相同的查询 仅每个 IN
  • 在生产代码/服务器上运行测试

    我在单元测试 自动化测试方面相对缺乏经验 所以如果这个问题没有任何意义 请原谅 我当前正在处理的代码库耦合如此紧密 以至于我需要重构大部分代码才能对其运行单元测试 所以我阅读了一些帖子并发现了 Selenium 我认为它确实是一个很酷的程序
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 使用 plistBuddy 获取值数组

    var keychain access groups declare a val usr libexec PlistBuddy c Print var sample plist echo val echo val 0 Ouput Array
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都

随机推荐