即使 RS 未完全满,是否也可能发生 RESOURCE_STALLS.RS 事件?

2023-12-10

的描述RESOURCE_STALLS.RSIntel Broadwell 的硬件性能事件如下:

此事件对由于缺少合格条目而导致的停顿周期进行计数 在保留站(RS)。这可能是由于 RS 溢出造成的,或者 由于 RS 阵列写入端口分配而导致 RS 释放 方案(每个 RS 条目有两个写入端口而不是四个。作为 结果,无法使用空条目,尽管 RS 并不是真正的 满的)。这对管道后端阻塞 uop 的周期进行计数 从前端交付。

这基本上说明了有两种情况会发生 RS 失速事件:

  • 当所有的eligibleRS 的条目被占用并且分配器没有停止。
  • 当因为只有两个写端口而发生“RS 释放”时,分配器不会停止。

在第一种情况下“有资格”是什么意思?这是否意味着并非所有条目都可以被各种微指令占用?因为我的理解是,在现代微架构中,任何条目都可以由任何类型的 uop 使用。另外,什么是 RS 阵列写入端口分配方案?即使并非所有条目都被占用,它如何导致 RS 停顿?这是否意味着 Haswell 中有四个写入端口,但现在 Broadwell 中只有两个?即使手册没有明确说明,这两种情况是否适用于 Skylake 或 Haswell?


我写了一个program可以用来探索英特尔处理器中 RS 的未记录限制,希望我最终能够回答这个问题。基本思想是在循环中分配和执行特定的微指令序列之前确保 RS 完全为空。这RESOURCE_STALLS.RS可用于确定该序列是否已达到 RS 本身的限制。例如,如果RESOURCE_STALLS.RS每次迭代为 1,则分配器必须停止一个周期才能为序列中的所有微指令分配 RS 条目。如果RESOURCE_STALLS.RS每次迭代比 1 小得多,那么它基本上不必停止,所以我们知道我们没有遇到任何 RS 限制。

我已经尝试过一系列依赖ADD指令、一系列相关 BSWAP 指令、一系列到同一位置的相关加载指令、一系列向后或向前无条件跳转指令以及一系列到同一位置的存储指令。下面两张图显示了序列的结果add不同目标RS占用的指令(微指令序列同时需要和占用的RS条目的最大数量)。每次迭代都会显示所有值。

下图显示RESOURCE_STALLS.RS当 RS 占用率为 50 时,每次迭代至少(或接近)每次迭代 1 个周期。虽然不明显可见,RESOURCE_STALLS.RS当 RS 占用率超过 43 时变得大于零,但只有当 RS 占用率超过 49 时才超过 1。换句话说,我只能同时使用 60 个(在 Haswell 中)RS 条目中最多 49 个,而不会出现 RS 停顿。在那之后,RESOURCE_STALLS.RS序列中每增加一个微指令,平均增加 1,这与分配器的突发行为以及每个指令的事实是一致的:ADDuop可以在每个周期完成(每个uop仅占用1个周期的RS条目)。cycles每增加一个 uop,平均增加 2.3。每个额外的 uop 都大于 1,因为 ROB 上还有额外的停顿,原因与adduop,但这些都可以,因为它们不会影响RESOURCE_STALLS.RS.

enter image description here

下图显示了变化cycles and RESOURCE_STALLS.RS每次迭代。它说明了执行时间和 RS 停顿之间的强相关性。

enter image description here

当目标RS占用率在44-49之间时,RESOURCE_STALLS.RS非常小,但仍然不是真正的零。我还注意到,不同微指令呈现给分配器的确切顺序会稍微影响可以达到的 RS 占用率。我认为这是Intel手册中提到的RS阵列写端口分配方案的效果。

那么其他 11 个 RS 条目(Haswell 的 RS 应该有 60 个条目)怎么样了?这RESOURCE_STALLS.ANY性能事件是回答问题的关键。我已经更新了用于执行这些实验的代码,以测试不同类型的负载:

  • 可以使用推测地址分派负载以实现 4 个周期的 L1D 命中延迟。这个案例被称为loadspec.
  • 无法使用推测地址分派的负载。它们在 Haswell 上的 L1D 命中延迟为 5 个周期。这个案例被称为loadnonspec.
  • 可以使用推测但不正确的地址分派负载。它们在 Haswell 上的 L1D 命中延迟为 9 个周期。这个案例被称为loadspecreplay.

我遵循相同的方法ADD说明,但这一次我们需要注意RESOURCE_STALLS.ANY代替RESOURCE_STALLS.RS(实际上并没有捕获由于负载而导致的 RS 失速)。下图显示了变化cycles and RESOURCE_STALLS.ANY每次迭代。第一个尖峰表示目标 RS 占用率已超过该类型 uop 的可用 RS 条目。我们可以清楚地看到,对于loadspec这种情况下,正好有 11 个用于加载微指令的 RS 条目!当目标 RS 占用率超过 11 时,RS 条目平均需要 3.75 个周期才能空闲到下一个加载 uop。这意味着微指令在完成时从 RS 中释放,而不是在它们被调度时。这也解释了 uop 重放的工作原理。峰值为loadspecreplay发生在 RS 占用 6 时。loadnonspec发生在 RS 占用 9 时。正如您稍后将看到的,这 11 个条目并非专用于负载。负载使用的 11 个条目中的一些可能位于负载使用的 49 个条目中ADD uops.

enter image description here

我还为存储开发了两个测试用例:一个达到存储缓冲区的限制,另一个达到 RS 的限制。上图显示了前一种情况。请注意,存储需要 RS 中的两个条目,因此目标 RS 占用率为奇数的情况与之前的偶数 RS 占用率相同(变化为零)。该图显示 RS 中最多可以同时有 44/2 = 22 个存储。 (我用来制作store graph的代码有一个bug,会导致实现的RS占用率比实际的要大。修复后,结果显示RS中最多可​​以同时有20个store。)存储地址或存储数据微指令占用的条目可以在一个周期内释放。 Intel 表示 Haswell 的存储缓冲区有 42 个条目,但我无法同时使用所有这些条目。我可能需要设计一个不同的实验来实现这一目标。

跳跃序列没有导致任何停顿。我认为这可以解释如下:跳转微指令释放它在一个周期内占用的RS条目,并且分配器在分配跳转微指令时不会以突发方式运行。也就是说,每个周期一个 RS 条目变得空闲,并且分配器将仅分配一个跳转 uop 而不会停止。因此,无论有多少个跳跃微指令,我们最终都不会停止。这与添加微指令相反,其中突发分配器行为使其停止,直到所需数量的 RS 条目变为空闲(4 个条目),即使添加微指令的延迟也是一个周期。尽快分配跳跃是有意义的,以便尽早检测到任何错误预测。因此,如果分配器看到跳转并且 RS 中有足够的空间供其使用,但其 4 uop 组中没有后续的 uop,那么它仍然会分配它。否则,它可能必须等待潜在的许多周期,这可能会显着延迟错误预测的检测。这可能会非常昂贵

是否有一条指令的uop可以同时占用RS的所有60个条目?是的,一个例子是BSWAP。它的两个微指令需要两个 RS 条目,我可以清楚地看到使用RESOURCE_STALLS.RS它的微指令可以同时使用 RS 的所有 60 个条目(假设我的计算对于 RS 占用率如何使用该指令增长是正确的)。这证明RS中确实有60个条目。但我们对它们的使用方式仍然知之甚少。

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

即使 RS 未完全满,是否也可能发生 RESOURCE_STALLS.RS 事件? 的相关文章

  • 使用循环计算 Python 字典中元素的有效方法

    我有一个值列表 我希望在循环期间计算每个类的元素数量 即 1 2 3 4 5 mylist 1 1 1 1 1 1 2 3 2 2 2 2 3 3 4 5 5 5 5 mydict dict for index in mylist mydi
  • 如果我将一个大函数声明为内联函数怎么办?

    我搜索了一些相关问题 例如C 中内联函数的好处 https stackoverflow com questions 145838 benefits of inline functions in c 但我还有疑问 如果内联函数只是为了 为编译
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 如何提高QNX6下Eclipse IDE的性能

    我们在 VMWare 环境中通过 QNX6 运行 Eclipse 速度非常慢 Eclipse 是这样启动的 usr qnx630 host qnx6 x86 usr qde eclipse eclipse data root workspa
  • 在 JavaScript 中嵌套“switch”案例:有速度优势吗?

    这里有新手问题 我有一个包含大量字符串的 开关 像这样按字母顺序拆分是否有速度优势 switch myString substring 0 1 case a switch myString case a string beginning w
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 在 Pandas 中创建许多新列的最 Pythonic 方法

    我有一个大数据框df 约 100 列和约 700 万行 我需要创建约 50 个新变量 列 它们是当前变量的简单转换 一种方法是与许多人一起 apply声明 我只是使用transform 作为简单转换的占位符 例如max或平方 df new
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

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

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何读取 GPU 负载?

    我正在编写一个程序 用于监控计算机的各种资源 例如CPU使用率等 我还想监控 GPU 使用情况 GPU 负载 而不是温度 using System using System Collections Generic using System
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • jQuery .getJSON 与 .post 哪一个更快?

    Using getJSON or post 我正在尝试通过仅用于 AJAX 请求的页面发送一些参数 并获取 JSON 或 html 片段中的一些结果 我想知道哪个更快 假设 HTML 文件只是纯布尔文本 true 或 false 正如其他人
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi

随机推荐

  • 从空格分隔的文件中删除文件头匹配的列

    我有一个以空格分隔的输入文本文件 我想使用 sed 或 awk 删除列标题为 size 的列 输入文件 id quantity colour shape size colour shape size colour shape size 1
  • Bash:删除名称末尾的数字。

    我有这样的文件 外星人头骨 2224154 jpg 雪鸟 红色 箭头 雷鸟 蓝色 天使 43264 jpg 死亡空间 album 1053 jpg 如何在 bash 中删除 jpg 之前的 ID 字符串 id 始终由前面的单词 分隔 谢谢
  • 以编程方式启用/禁用硬件设备[重复]

    这个问题在这里已经有答案了 可能的重复 NET 如何禁用系统设备 Win32 API 函数以编程方式启用 禁用设备 在 C 中 有没有办法以编程方式禁用和重新启用设备 我正在寻找与您进入设备管理器并右键单击设备并禁用或启用它时发生的功能基本
  • python 按值列出而不是按引用列出[重复]

    这个问题在这里已经有答案了 让我们举个例子 a help copyright credits license b a b append XYZ b help copyright credits license XYZ a help copy
  • 我的 WordPress 网站上的 footer.php 文件出现问题

    我使用了调试 收到以下错误 PHP Fatal error Uncaught TypeError ceil Argument 1 num must be of type int float string Give in var www ht
  • 是否可以让任何数据流块类型发送多个中间结果作为单个输入的结果?

    是否可以得到TransformManyBlocks 在创建中间结果时将其发送到下一步 而不是等待整个结果IEnumerable
  • Scala 将多行字符串转换为 BigInt

    我正在尝试使用以下代码从字符串中解析 100 个 50 位数字 val input 37107287533902102798797998220837590246510135740250 463769376774900097126481248
  • 谷歌 reCaptcha IE8

    Internet Explorer 8 支持 Google reCaptcha v2 吗 如果没有 是否有任何合适的 Internet Explorer 8 兼容验证码 我发现 reCaptcha 代码尝试使用 getContext 方法的
  • 在应用程序之间发送套接字c#

    我想知道是否有一种方法 您有一个 net 应用程序名称 appA 它接收 tcp 套接字连接 然后根据某些规则将套接字连接发送到另一个 net 应用程序名为 appB 我知道这违反了很多安全和良好实践 但如果可能的话会很有趣 Proxy 一
  • 动态 LiveTile - 添加背景图像?

    在我的 Windows Phone 7 应用程序中使用动态磁贴 效果非常好 我现在正在尝试创建动态动态图块 但无法显示背景图像 当使用下面的代码时 我只得到一个黑色的瓷砖 显示我添加的文本 但不显示背景图像 图像 构建操作 设置为 内容 有
  • WPF 背景两种色调

    我正在尝试做一些如此简单的事情 但无法取得任何成果 我一直在网上搜寻 试图找到一个清晰的示例或少量信息 但我找到的每一篇文章都显示了完全相同的简单示例 我想要做的就是为列表框项目设置一个背景 该背景是两种色调 但它们之间没有渐变混合 到目前
  • Pandas 合并两个具有不同列的数据框

    我肯定在这里错过了一些简单的东西 尝试合并 pandas 中几乎具有相同列名的两个数据框 但右侧数据框有一些左侧没有的列 反之亦然 gt df may id quantity attr 1 attr 2 0 1 20 0 1 1 2 23
  • 如何重定向 cron 脚本的完整输出

    我每天 18 35 运行一个简单的 cronjob 05 18 job sh 2 gt 1 gt gt job log 所以 job sh 的输出应该写入 job log 中 在job sh中 有一些echo命令和一些python脚本被执行
  • 如何使用正则表达式验证 JTable 的第一列?

    我正在编写一个程序 我必须验证第一列是否是 IP 地址 到目前为止 我只弄清楚如何找到如何过滤行 但在将数据写入文件之前必须检查该列 有人可以帮助我吗 您可以使用InputVerifier验证表格单元格的输入 这样你就不必验证一切after
  • 重新协商速率限制

    有谁知道在哪里以及如何设置此限制 这是关于 SSL TLS 连接的 如果您使用 OpenSSL 并且希望在一定字节数后进行重新协商 您可以使用BIO set ssl renegotiate bytes 如果您希望它在经过一定时间间隔后发生
  • Kotlin 转换双精度?至双倍

    我使用 Mapbox 开发地图应用程序 我正在使用的方法使用 Point Double Double 需要获取类型不匹配 找到双倍 双倍 val lat locationComponent lastKnownLocation latitud
  • 如何动态创建选项卡

    这是 C 中的 我基本上需要从 textbox Text 制作 TabPages 例如 textBox1 Text test TabPage textBox1 Text new TabPage 这就是我想要做的 我知道这不会直接工作 但这应
  • 带复选框的自定义列表视图 - 滚动时检查状态互换

    我使用带有复选框的自定义列表视图 滚动列表视图时 选中状态会互换如何控制互换并将其设置为默认值 即我选择的选中项目 代码供你参考 public View getView int position View convertView ViewG
  • 将时区名称转换为时间 ID:s

    我发现 iOS 框架不理解正确的时区名称 例如 东部标准时间 如果您输入 NSLog EST NSTimeZone timeZoneWithName Eastern Standard Time 你得到 美国东部时间 空 相反 您必须使用时间
  • 即使 RS 未完全满,是否也可能发生 RESOURCE_STALLS.RS 事件?

    的描述RESOURCE STALLS RSIntel Broadwell 的硬件性能事件如下 此事件对由于缺少合格条目而导致的停顿周期进行计数 在保留站 RS 这可能是由于 RS 溢出造成的 或者 由于 RS 阵列写入端口分配而导致 RS