如何解读uops.info?

2023-12-20

我查了一下说明在 uops.info 上尝试找出 (1) 延迟是多少,以及 (2) 我可以执行多少个并发负载?

我在解释结果时遇到困难(下面的屏幕截图,上面也有链接):

  • What do the different variants of the instruction mean? e.g. A64 Z (ZMM, K, ZMM) vs A64 (ZMM, K, ZMM)?
    • 它似乎为参数提供了不同的类型,也许表明哪些参数在寄存器中?但我不知道如何阅读该符号。
  • 为什么有时有两个延迟数字,例如[≤10;≤11]?这是否表示延迟范围,如果是,我可以计算出我的用例的确切延迟吗?
  • 我应该如何解释吞吐量 (TP) 列?

非常感谢任何对此的指示!


如果运行大块,则吞吐量是倒数吞吐量just该指令。 (或者对于像这样的情况使用破坏依赖的指令adc or div由于隐式寄存器输入/输出(尤其是标志),您无法使背靠背执行不具有数据依赖性。所以0.5意味着它可以每 0.5 个周期运行一次,即 2 个/时钟,正如我们所知道的具有 2 个负载端口的 CPU 所预期的那样。

为什么有时有两个延迟数字,例如[≤10;≤11]?

也可以看看多个值或范围作为单个指令的延迟意味着什么? https://stackoverflow.com/questions/60912850/what-do-multiple-values-or-ranges-means-as-the-latency-for-a-single-instruction以load+ALU ALU指令为例。 (我忘记了它有多接近重复,直到我写完这个答案的其余部分才寻找它。)

通常这表明从不同输入到输出的延迟可能不同。例如合并屏蔽加载必须合并到目标中,以便这是一个输入,加载地址是另一个输入(通过整数寄存器)。内存中最近存储的数据是第三个输入(存储转发延迟)。

对于矢量加载使用延迟等情况,加载结果与地址寄存器位于不同的域中,uops.info 创建一个依赖链,其指令序列涉及movd or vmovq rax, xmm0将加载结果耦合回另一个加载的地址。很难单独确定每个部分的延迟,因此 IIRC 他们假设链中的每个其他指令至少有 1 个周期,并将被测指令的延迟显示为<= N,其中 N + dep 链的其余部分加起来就是测试代码每次迭代的总周期。

查看这些结果之一的详细信息页面,其中显示了用于测量它的测试序列。表中的每个数字也是一个链接。这些详细信息页面告诉您哪个操作数是哪个,并细分从每个输入到每个输出的延迟。让我们look at https://uops.info/html-lat/SKX/VMOVDQA64_Z_ZMM_K_M512-Measurements.html零掩码vmovdqa64512 位负载(VMOVDQA64_Z (ZMM, K, M512))他们在 asm 中测试使用vmovdqa64 zmm0{k1}{z},ZMMWORD PTR [r14]。列出的延迟是[1;≤9].

他们将操作数编号为

  • 1(只写):ZMM 目的地。
  • 2(只读):k0..7掩码寄存器
  • 3(只读):内存(稍后分为地址与实际内存内容)

The 1周期延迟部分是从掩码寄存器到结果的延迟,“延迟操作数2→1:1”。因此,在加载单元获取数据之前,掩码不必准备好。

The <=9是从地址基址或索引寄存器到最终 ZMM 结果准备就绪的延迟。

显然,在存储/重新加载情况下,存储转发延迟成为瓶颈,“延迟操作数 3 → 1(内存):≤6”。他们用这个序列进行了测试,描述为“链延迟:≥6”。vshufpd zmm已知有 1 个周期延迟,我猜他们只是将商店计算为有 1 个周期延迟?就像我说的,他们只是假设一切都是 1 个周期,尽管将任何延迟分配给存储有点可疑。

Code:
   0:   62 d1 fd c9 6f 06       vmovdqa64 zmm0{k1}{z},ZMMWORD PTR [r14]
   6:   62 71 fd 48 c6 e8 00    vshufpd zmm13,zmm0,zmm0,0x0
   d:   62 51 95 48 c6 ed 00    vshufpd zmm13,zmm13,zmm13,0x0
  14:   62 51 95 48 c6 ed 00    vshufpd zmm13,zmm13,zmm13,0x0
  1b:   62 51 95 48 c6 ed 00    vshufpd zmm13,zmm13,zmm13,0x0
  22:   62 51 95 48 c6 ed 00    vshufpd zmm13,zmm13,zmm13,0x0
  29:   62 51 fd 48 11 2e       vmovupd ZMMWORD PTR [r14],zmm13

(对于吞吐量测试,他们多次重复该块以创建展开的循环。但对于延迟测试,他们可能只是在其周围包裹一个正常的循环。nanobench 是开源的,因此您可以检查。)

对于“延迟操作数 3 → 1(地址、基址寄存器):≤9”测量,他们说“链延迟:≥5”。我们知道一个vmovq r,x / vmovq x,r往返延迟超过 2 个周期,因此vmovq这里的链条的一部分可能不仅仅是一个循环。这就是为什么他们高估了加载使用延迟,保守上限为 9 个周期。

   0:   62 d1 fd c9 6f 06       vmovdqa64 zmm0{k1}{z},ZMMWORD PTR [r14]
   6:   c4 c1 f9 7e c4          vmovq  r12,xmm0
   b:   4d 31 e6                xor    r14,r12
   e:   4d 31 e6                xor    r14,r12
  11:   4d 31 e6                xor    r14,r12
  14:   4d 31 e6                xor    r14,r12

他们测量:

  • 已退役指令:6.0
  • 核心周期:14.0
  • 参考周期:10.81
  • UOPS_EXECUTED.线程:7.0

每次迭代总共 14 个周期,因此他们计算出掩码负载所占的 14-5 = 9 个周期。 (或者如果链延迟实际上长于 5,则更少。vmovq实际上可能是 3 或 4 个周期,因此 7 或 6 个周期的 SIMD 加载延迟听起来是正确的。我们知道整数加载使用延迟为 5 个周期,IIRC Intel 优化手册提到 SIMD 加载为 6 或 7 个周期。但我们真正能说的就是这个保守的上限 9sure纯粹基于测量,没有推断/猜测。)


AVX-512 指令命名。

“A64”是 AVX-512 的一部分vmovdqa64指令助记符当然:查看Intel的asm手册:https://www.felixcloutier.com/x86/movdqa:vmovdqa32:vmovdqa64 https://www.felixcloutier.com/x86/movdqa:vmovdqa32:vmovdqa64。请记住,AVX-512 支持(几乎)每条指令的每元素合并或零掩码,因此即使movdqa按位运算需要元素大小。这也是 AVX-512 按位布尔值的原因vpord / q而不仅仅是vpor(他们可以使用 b/w/d/q 命名 movdqa 元素大小,但我们会vmovdqad or vmovdqaq,但我想我们应该庆幸他们没有这么做。)

幸运的是,a32 与 a64 没有任何性能差异,只有当您使用掩码时,结果才会有任何差异,例如通过_mm512_maskz_load_epi32( __mmask16 k, void * sa)与 epi64 相比,仅采用__mmask8。或者对于较小的向量宽度,仅使用少于 8 位的掩码。

零掩码与合并掩码

op Z (ZMM, K, ZMM) vs op (ZMM, K, ZMM)是零掩蔽与合并掩蔽。如果您不知道 AVX-512 屏蔽的工作原理,请阅读相关内容。例如Kirill Yukhin 的演示幻灯片有一个概述:https://en.wikichip.org/w/images/d/d5/Intel_Advanced_Vector_Extensions_2015-2016_Support_in_GNU_Compiler_Collection.pdf https://en.wikichip.org/w/images/d/d5/Intel_Advanced_Vector_Extensions_2015-2016_Support_in_GNU_Compiler_Collection.pdf

Reg-reg vmovdqa 无屏蔽(无k寄存器)可以是 0 延迟(mov-elimination),但使用屏蔽时它始终为 1。

有趣的事实:寄存器重命名k0..k7使用与 MMX/x87 相同的物理寄存器文件空间:https://travisdowns.github.io/blog/2020/05/26/kreg2.html https://travisdowns.github.io/blog/2020/05/26/kreg2.html

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

如何解读uops.info? 的相关文章

  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • 各种中断的区别:SCI、SMI、NMI、普通中断

    我正在学习英特尔架构 到目前为止我遇到过几种类型的中断 SCI 系统控制中断 硬件使用的系统中断 用于向操作系统通知 ACPI 事件 SCI 是一个有效 低电平 可共享的电平中断 SMI 系统管理中断 由遗留系统上的中断事件生成的操作系统透
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 68000 汇编语言 - CMPI.B

    What are the contents of the CCR and D3 after the following instructions sequence executes Perform the calculation by ha
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 如何在 MacOS 上使用 nasm 进行编译

    我正在尝试在汇编器上编译并链接我的第一个程序 我尝试编译以下代码 include stud io inc global main section text main xor eax eax again PRINT Hello PUTCHAR
  • 如何计算汇编中的内存位移?

    我一直在研究 yasm 汇编语言 并生成了一个包含以下内容的列表文件 我需要帮助理解第一列中的内存位移是如何计算的 提前致谢 1 line 1 1 memory asm 2 section data 3 00000000 04000000
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • intfmt: db "%d", 10, 0 在汇编中的含义

    我最近在我的一个汇编文件的顶部看到了这个 并意识到我在打印整数的过程中花了很长时间使用它 而没有真正意识到它最初来自哪里 在我的基本汇编模板中使用 或 10 0 是什么结尾的意思是 section data intfmt db d 10 0
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • 如何构建gcc multilib工具链?

    我正在尝试在新安装的 ubuntu 14 04 的 AMD64 版本上构建 gcc multilib 工具链 它只有 x86 64 gcc 和 g 安装 没有 multilib 支持 我的配置行是 configure disable che
  • NASM:如何正确访问SSD驱动器?

    我需要使用 NASM 16 位代码访问 SSD 驱动器 访问普通硬盘时 需要设置寄存器AX DX CX来选择柱面 磁道 扇区 扇区数 AH 选择读扇区功能 DL 选择驱动器号 CH 选择气缸 DH 选择磁盘上的一侧 CL 选择步入正轨的部门
  • 如何在汇编中使用 ReadString?

    mov edx offset Prompt1 call WriteString mov ecx 32 mov edx offset String1 call ReadString 现在 我该如何访问String1 如何将其移入寄存器以便对其
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt
  • 在共享库中不使用 PLT 的情况下调用另一个目标文件中的函数?

    我有两个汇编代码 code1 s and code2 s我想从这两个构建一个可重定位 使用 fPIC 开关 共享库 I want code2 s调用一个函数 名为myfun1 其定义在code1 s 当我使用call myfun1 PLT
  • x86:寄存器操作为内存内容和内存地址?

    寄存器 gt 内存地址 gt 内存内容 内存地址 gt 内存内容 上面的模型正确吗 而且 如果是的话 你能建议我是否认为正确吗 movl eax ebx gt 它将 eax 的内存地址移动到 ebx 这也会导致内容移动 movl eax e
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使

随机推荐

  • Office 365 Sharepoint 将文件上传到文档库

    我正在尝试使用以下代码通过 Web 服务将文件添加到 Sharepoint Office365 上的文档库 public void SaveFileToSharePoint string fileName try var copyServi
  • 如何使用 cli 获取帐户的接近余额?

    是否有可能使用接近帐户余额靠近 cli https docs near org docs tools near cli Running near state
  • 使用 Ansible 在 Windows 上执行 .exe

    我们想要在带有 Ansible 1 8 2 的 Windows Server 2012 上部署应用程序 我已经搜索并找到了a list http docs ansible com list of windows modules htmlWi
  • 如何在视图外评估 Aurelia 插值表达式?

    在 Aurelia 中 假设我有一个包含插值表达式的字符串 Today at value date time 和一些代表绑定上下文的对象 value new Date 有没有办法在视图之外只获取该字符串和该对象 并获取结果格式化字符串 即
  • 如何修复错误消息:“chromedriver.exe”可执行文件可能具有错误的权限[重复]

    这个问题在这里已经有答案了 我正在安装 selenium 的网络驱动程序 但是我收到以下错误 PermissionError Traceback most recent call last usr local lib python3 6 d
  • 排除 Twitter 流中的回复 - tweepy

    我正在使用 tweepy 从 Twitter 的流 api 中提取推文 然后我用它来自动回复该用户 例如 如果我想从中提取实时推文然后回复唐纳德 特朗普 我可以使用 import tweepy from tweepy import Stre
  • 在 Apache Kafka 中,为什么消费者实例不能多于分区?

    我正在学习卡夫卡 阅读这里的介绍部分 https kafka apache org documentation html introduction https kafka apache org documentation html intr
  • Android EditText 以编程方式调整大小

    我有一个视图 其中有两个 LinearLayout 一个包含文本 EditText 和一个按钮 另一个仅包含文本和 EditText 我试图让第二个 EditText 在第二行 的宽 度与第一行的宽度相匹配 我尝试将其设为 TableLay
  • 将数据帧转换为 JSON 时删除空数组字段

    有没有什么方法可以通过不使用那些为空的字段来从 Spark 数据帧创建 json 假设我有一个数据框 name hit songs beatles help hey jude romeo eres mia juliet null 我想将其转
  • 解析 TSV 文件

    我需要解析 TSV 格式的文件 制表符分隔值 我使用正则表达式将文件分解为每一行 但我找不到令人满意的正则表达式来解析每一行 现在我已经提出了这个
  • C# 中对 volatile 变量的赋值

    我对 C 的理解 感谢 Jeff Richter 和 Jon Skeet 认为赋值是 原子的 不同的是 当我们混合读取和写入 递增 递减 时 因此我们需要在互锁上使用方法 如果只有读取和分配 这两个操作都是原子操作吗 public clas
  • 理解 HashMap

    好吧 这是我不明白的地方 如果您尝试使用以下方法检索对象get 方法并返回null 仍然有可能null可以存储为与您提供给的密钥关联的对象get 方法 您可以通过将对象的密钥传递给containsKey 地图的方法 这返回true如果密钥存
  • 如何使用 Gradle 将 Java 代码和 Junit 测试放在一起构建

    我有一个项目 其中主要源代码和该源代码的测试用例保存在同一个包 目录中 每个测试类都是其正在测试的类的名称 末尾附加 Test 因此 如果我有一个 Foo java 那么它旁边就会有一个 FooTest java 我的问题是 如何使用 Gr
  • webshim polyfill 画布在 IE7 模式下无法工作

    我在让 webshims 插件 canvas polyfill 工作时遇到问题 使用 IE7 模式在 IE9 中出现以下错误 SCRIPT438 Object doesn t support property or method fillR
  • 使用 awk / sed 查找并替换文件中的键值对到其他文件

    我有一个键值文件 名为key txt 有一个 分隔器 这是值的显示方式 server name server1 username someuser keyname 123key 我的第二个文件是一个脚本文件 文件中到处都有这些键 它以以下格
  • 用于非零基数组指针分配的 C++ gcc 扩展?

    我正在寻找 gcc 支持的 C 语言扩展来启用非从零开始的数组指针的分配 理想情况下我可以简单地写 include
  • 优化 Cython 中的字符串

    我试图向我们的小组展示 Cython 在增强 Python 性能方面的优点 我已经展示了几个基准 所有这些都通过以下方式实现加速 编译现有的 Python 代码 使用 cdef 静态类型变量 特别是在内循环中 然而 我们的大部分代码都进行字
  • pyvenv 安装错误的 pip 版本

    我正在创建一个 virtualenvpyvenv env但安装的 pip 版本已过时 我可以在虚拟环境中手动更新 pip 但我希望自动获得正确的版本 没有激活 venv gt pip V pip 7 1 2 from usr lib pyt
  • 查找所有应用程序文件夹并在 Inno Setup 中安装文件

    这是一个类似的问题找到应用程序的路径 并将文件复制到 Inno Setup 中的该目录 https stackoverflow com questions 46282559 我想将文件安装到 Inno Setup 中用户的 MATLAB 文
  • 如何解读uops.info?

    我查了一下说明在 uops info 上尝试找出 1 延迟是多少 以及 2 我可以执行多少个并发负载 我在解释结果时遇到困难 下面的屏幕截图 上面也有链接 What do the different variants of the inst