LSD 能否从检测到的循环的下一次迭代中发出 uOP?

2023-11-27

我正在研究 Haswell 端口 0 上的分支单元的功能,从一个非常简单的循环开始:

BITS 64
GLOBAL _start

SECTION .text

_start:

 mov ecx, 10000000

.loop:

 dec ecx             ;|
  jz .end            ;| 1 uOP (call it D)

jmp .loop            ;| 1 uOP (call it J)

.end:
 mov eax, 60
 xor edi, edi
 syscall

Using perf我们看到循环以 1c/iter 运行

Performance counter stats for './main' (50 runs):

        10,001,055      uops_executed_port_port_6   ( +-  0.00% )
         9,999,973      uops_executed_port_port_0   ( +-  0.00% )
        10,015,414      cycles:u                    ( +-  0.02% )
                23      resource_stalls_rs          ( +- 64.05% )

我对这些结果的解释是:

  • D 和 J 都是并行调度的。
  • J 的吞吐量倒数为 1 个周期。
  • D 和 J 均得到最优调度。

然而,我们也可以看到 RS 永远不会充满。
它最多可以以 2 uOPs/c 的速率调度 uOP,但理论上可以得到 4 uOPs/c,从而在大约 30 c 内产生完整的 RS(对于大小为 60 个融合域条目的 RS)。

据我了解,应该很少有分支错误预测,并且 uOP 应该全部来自 LSD。
所以我看了一下FE:

     8,239,091      lsd_cycles_active ( +-  3.10% )
       989,320      idq_dsb_cycles    ( +- 23.47% )
     2,534,972      idq_mite_cycles   ( +- 15.43% )
         4,929      idq_ms_uops       ( +-  8.30% )

   0.007429733 seconds time elapsed   ( +-  1.79% )

which confirms that the FE is issuing from the LSD1.
However, the LSD never issues 4 uOPs/c:

     7,591,866      lsd_cycles_active ( +-  3.17% )
             0      lsd_cycles_4_uops 

My interpretation is that the LSD cannot issue uOPs from the next iteration2 thereby only sending D J pairs to the BE each cycle.
Is my interpretation correct?


源代码位于这个存储库.


1 There is a bit of variance, I think this is due to the high number of iterations that allows for some context switch.
2 This is sound quite complex to do in hardware with limited circuits depth.


循环中的所有微指令都是分支(每次迭代 2 个)。我认为 `lsd_cycles_4_uops 为零的原因是重命名器的限制。根据Intel优化手册第2.4.3.1节:

重命名器可以在每个周期分配两个分支,而不是一个 在先前的微架构中对每个周期进行分支。这个可以 消除执行中的一些泡沫。

这是桑迪桥微架构部分的一个小节。但据我所知,这适用于所有后来的微架构。最大重命名吞吐量为每个周期 4 uops。但最多两个微指令可以是分支。因此,在这个所有微指令都是分支的示例中,即使在循环的第一次迭代中,LSD 在任何给定周期也永远无法传送超过 2 个微指令。

因此,每个周期将在 RS 中分配 2 个分支微指令,并且每个周期都可以调度这两个分支微指令(一个谓词采用,一个不采用)。所以RS占用率不会增长。

此限制不会影响程序的性能。每个周期执行 2 个分支 uops,每个周期提供 3 个 IPC,这已经是最佳选择。

我试图找到一个可以捕获由于该限制而导致的分配器停顿的性能事件。事件RESOURCE_STALLS.ANY and UOPS_ISSUED.ANY (with cmask=1 and inv=1)在这种情况下似乎不相关。 @IwillnotexistIdonotexist 建议使用IDQ_UOPS_NOT_DELIVERED.CORE。我在下面展示了性能事件及其所有支持的变体的结果。我还提供了这些事件的正确含义,因为手册是错误的。T表示迭代次数。

IDQ_UOPS_NOT_DELIVERED.CORE:计算分配器未使用的插槽数。如果程序运行 C 个核心周期,则插槽总数为 4*C。测量值几乎等于2*T。由于周期数为T,所以时隙数为4*T,这意味着大约一半的发布时隙没有被利用。

IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE:计算从 IDQ 传送零微指令的周期数。测量值可以忽略不计。

IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE:计算从 IDQ 传送最多 1 个微指令的周期数。测量值可以忽略不计。

IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE:计算 IDQ 最多发送 2 个 uops 的周期数:测量值几乎等于 T。

IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE:统计IDQ最多发送3个uop的周期数:测量值几乎等于T。

因此,由于执行时间几乎等于T个核心周期,我们可以得出结论,在大多数周期中,分配器每个周期仅分配2个uop,这等于调度率。

请注意,Haswell 和 Skylake 中的 RS 持有未融合的微指令。因此每个条目可以容纳一个未融合的微指令。看脚注2。但这在这里并不重要,因为没有微融合。

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

LSD 能否从检测到的循环的下一次迭代中发出 uOP? 的相关文章

  • 当我打开在 Xcode 4 中创建的 Google 地图项目时,Xcode 5 会警告我的架构设置

    我刚刚更新到新发布的 Xcode 5 我正在开发一个使用 Google 地图 iOS SDK 的 iOS 应用程序 当我在 Xcode 4 中开发时 我改变了我的Architectures在我的项目设置中进行设置 按照 Google 的步骤
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s

随机推荐

  • AngularJS 组复选框验证

    我有一个复选框列表 其中至少有一个是必填的 我尝试通过 AngularJS 验证来实现这一点 但遇到了困难 下面是我的代码 Code goes here for js var app angular module App function
  • C++ 是否可以计算出整个向量? [复制]

    这个问题在这里已经有答案了 我需要计算一个向量 不仅仅是其中的一个元素 而是整个事物 例如 std cout 您可以定义一个实用函数 例如 template
  • 64 位 Windows 上 long 的位大小是多少?

    不久前 有人告诉我long在 64 位机器上不是 64 位 我应该始终使用int 这对我来说没有意义 我看过文档 例如苹果官方网站上的文档 说long为 64 位 CPU 编译时确实是 64 位 我查了一下 64 位 Windows 上的内
  • 在 Emacs 中,如何使用键盘选择完成列表?

    当我在迷你缓冲区中按 Tab 键完成并且 Emacs 在新缓冲区中显示完成列表时 如何在不使用鼠标的情况下切换到该缓冲区 I tried C x o 但这只是切换到第一个缓冲区 我从中进入了迷你缓冲区 我也尝试过C x b 但这给了我com
  • 如何使用 npm 脚本重命名文件

    我在用复制文件作为一个 npmscirpt copyfiles u 2 src app conf dev json dist config 但最后我想把文件重命名 如何将输入文件重命名为类似的名称conf json 我检查了文档 没有发现可
  • 带定时器的 Windows 服务

    我在 c net 中创建了一个带有计时器的 Windows 服务 当我在 Visual Studio 中调试 构建项目时它工作正常 但安装后它不执行其操作 这背后的原因可能是什么 代码 public partial class Servic
  • 添加包含数字列的分箱值的列

    我有一个包含几列的数据框 其中一列是排名 是 1 到 20 之间的整数 我想创建另一列 其中包含 bin 值 如 1 4 5 10 11 15 16 20 最有效的方法是什么 我的数据框看起来像这样 csv 格式 rank name inf
  • 了解 WebElement.findElement() 和 XPATH

    我想使用WebElement findElement 使用 XPATH 定位父节点内节点的 API span class child class 我以为这会让我归还 div 那是在父级内部 然而 它返回了我在整个 DOM 树中找到的第一个
  • Flask 文件上传限制

    我有一个用于多个文件上传的文件上传处理程序 并设置了 MAX CONTENT SIZE 文档提到当总文件大小超过限制时 Flask 会抛出 413 异常 因此我还使用自定义 413 页面编写了 413 错误处理程序 但是 在测试文件上传时
  • Gettext 或数据库翻译

    哪个更好 gettext 基于自定义MySQL 缓存的功能 Gettext 是一种内置功能 因此我认为它已针对性能进行了调整 使用 poedit 是一种痛苦 而且不可能向任何客户展示 自定义功能允许简单的翻译界面 但可能对 php db 使
  • 在 ReactJS 中删除一个项目

    我是 React 新手 制作了一个允许保存搜索的应用程序 这将拉取 JSON 但当前正在从静态数组中拉取data 我无法从搜索列表中删除搜索 这是 jsbin http jsbin com nobiqi edit js 输出 这是我的删除按
  • 使用来自多个模块的 python 日志记录写入文件和 RotatingFileHandler

    我正在使用以下模块来记录模块中的事件 我这样称呼它 module 1 from tools debug logger import debug logger self logger debug logger start logger mod
  • 升级 numpy 失败并出现“权限被拒绝”错误

    我下载了一个预编译的numpy二进制来自http www lfd uci edu gohlke pythonlibs numpy并尝试升级我当前的numpy在 Windows 7 上安装 pip install upgrade numpy
  • 让 Android 应用程序带有后退按钮

    我希望我的 Android 应用程序的用户在某个活动按回时离开我的应用程序 这可以做到吗 一个好方法是等待第二次回来 private boolean doubleBackToExitPressedOnce false Override pu
  • 具有重复键的 data.table 上的滚动联接

    我试图理解rolling joins in data table 最后给出了重现这一点的数据 给定给定时间机场交易的数据表 gt dt t id airport thisTime 1 1 a 5 1 2 3 a 5 1 3 2 a 6 2
  • Makefile.am 创建空目录

    使用自动工具 我需要在键入 make install 时创建一个空目录树 例如 etc myprg foo 现在 我通过指定空目标来做到这一点 如下所示 myprgdir sysconfdir myprg myprgfoodir sysco
  • jQuery ContextMenu 事件在 IOS 8.2 中不起作用

    我在 html 示例中使用 contextMenu 事件 当我长按 DIV 时它将被触发 但现在它不起作用 最新的 IOS 8 2 版本中有什么问题吗 这是示例代码
  • java中如何将包含逗号的数字字符串解析为整数?

    我越来越NumberFormatException当我尝试解析 265 858 时Integer parseInt 有什么方法可以将其解析为整数吗 这个逗号是小数点分隔符还是这两个数字 在第一种情况下 您必须提供Locale to Numb
  • 如何设置ListView项目的突出显示颜色?

    我必须为 ListView 项目制作另一种突出显示颜色 我对项目使用自定义适配器 并且我有以下代码 Layout
  • LSD 能否从检测到的循环的下一次迭代中发出 uOP?

    我正在研究 Haswell 端口 0 上的分支单元的功能 从一个非常简单的循环开始 BITS 64 GLOBAL start SECTION text start mov ecx 10000000 loop dec ecx jz end 1