repz ret:为什么这么麻烦?

2023-12-04

的问题repz ret已经在这里介绍了[1]以及其他来源[2, 3】 还算满意。然而,在阅读这两个来源时,我找到了以下问题的答案:

  1. 是什么actual定量比较中的惩罚ret or nop; ret?尤其是在后一种情况下——当大多数函数要么有 100 多个指令,要么被内联时,解码一条额外指令(而且是一条空指令!)真的相关吗?

  2. 为什么这个问题在 AMD K8 中从未得到解决,甚至进入了 K10?从什么时候开始记录一个基于行为的丑陋的解决方法stays当原因的每个细节都已知时,无证人更愿意实际解决问题?


分支预测错误
所有喧嚣的原因是分支错误预测的成本。
当分支出现时,CPU 会预测所采用的分支并将这些指令预加载到管道中。
如果预测错误,则需要清除管道并加载新指令。
这可能需要长达number_of_stages_in_pipeline周期加上从缓存加载数据所需的任何周期。每次错误预测通常有 14 到 25 个周期。

原因:处理器设计
K8 和 K10 遭受此问题的原因是 AMD 的出色优化。
AMD K8 和 K10 将预解码缓存中的指令并跟踪它们在 CPU L1 指令缓存中的长度。
为了做到这一点,它有额外的位。

对于每 128 位(16 字节)指令,存储有 76 位附加数据.

下表详细说明了这一点:

Data             Size       Notes
-------------------------------------------------------------------------
Instructions     128 bits   The data as read from memory
Parity bits      8 bits     One parity bit for every 16 bits
Pre-decode       56 bits    3 bits per byte (start, end, function) 
                            + 4 bit per 16 byte line
Branch selectors 16 bits    2 bits for each 2 bytes of instruction code

Total            204 bits   128 instructions, 76 metadata

由于所有这些数据都存储在 L1 指令缓存中,K8/10 cpu 在解码和分支预测上花费的工作量要少得多。这节省了硅。
而且由于 AMD 的晶体管预算不如英特尔,因此它需要更智能地工作。

但是,如果代码是 esp。紧跳和 ret 可能占用相同的两个字节槽,这意味着RET被预测为未采取(因为它后面的跳转是)。
通过使RET占据两个字节REP RET这种情况永远不会发生,并且 RET 总是会被预测为正常。

Intel 没有这个问题,但(过去)受到预测槽数量有限的影响,而 AMD 则没有。

nop ret
从来没有理由去做nop ret。这是两条指令,浪费了一个额外的周期来执行nopret可能仍然与跳跃“配对”。
如果你想对齐使用REP MOV相反或使用multibyte nop.

结束语
仅本地分支预测与指令一起存储在高速缓存中。
还有一个单独的全局分支预测表。

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

repz ret:为什么这么麻烦? 的相关文章

随机推荐

  • Grails 插件 bean 的重写方法

    Spring Security 插件提供了一个名为 springSecurityService 类型的 beangrails plugins springsecurity SpringSecurityService 我需要覆盖getCurr
  • 在php中为长时间运行的进程创建后台进程

    好吧 如果这是另一个问题的重复 请原谅我 但经过搜索后我还没有找到明确的答案 我基本上想做的是让我的 php Web 应用程序触发一些事件 例如电子邮件发送器或报告生成器 这些事件可能需要几分钟才能完成并立即将控制权返回到页面 我来自 NE
  • 如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

    我有一个在 IIS7 上提供服务的 Windows Server 2008 R2 我启用了 TLS 1 2 如下所示 但不幸的是 我的一位客户据说他们使用 TLS 1 2 时出现 SSL 连接错误 当我尝试使用 OpenSSL 检查时 TL
  • 从 fortran 而不是 C 调用 C++ 函数

    是否可以从 FORTRAN 调用 C 函数 例如 include
  • 线程实时记录

    我正在编写一个用于调整照片大小的简单脚本 我想要一个带有文本字段的小部件 其中在调整每个文件大小后会显示消息 usr bin python3 coding utf 8 import time sys from PyQt5 QtCore im
  • 如何在 Swift 中从自定义编码/解码的 json 中删除数据模型 nil 字段

    我正在尝试找到一种干净的方法来删除数据模型可选属性 如果它 nil当在 Swift 中自定义编码 解码我的数据模型时 我的用例 import Foundation public struct Message public let txnID
  • 如何从 PIG 中生成的包(其大小可能会有所不同)中提取第一个元组?

    我正在生成一个信息 包 其大小 包内元组的数量 可能会有所不同 由此 我想动态提取第一个元素 我该怎么做呢 使用DataFu UDF FirstTupleFromBag http datafu incubator apache org do
  • C++ 精度:字符串到双精度

    在对转换为双精度的字符串执行一些操作后 我遇到了双精度的精度问题 include
  • 访问 GridPane 节点时出现问题

    我希望你能帮助我做一个我想做的小项目 我正在尝试使用 JavaFX 的 GUI 创建视频游戏 但遇到了一些麻烦 这是我为练习而编写的代码 我不知道为什么这不起作用 public class Main extends Application
  • 预览期间找不到基于上传文件创建的 StreamedContent

    我在 jsf 页面上创建了一个文件上传对话框和一个图像库 每次上传图像后 图库应显示迄今为止上传的所有图像 图像将存储在后端 bean 中 并且应该由图库从后端 bean 动态获取 由于某种原因 图库显示上传的图像标签 但不显示引用图像 因
  • 选择每个类别的前 10 条记录

    我想在一个查询中返回每个部分的前 10 条记录 任何人都可以帮助如何做到这一点吗 部分是表中的列之一 数据库是 SQL Server 2005 我想返回按输入日期排列的前 10 名 部分分为业务部分 本地部分和特色部分 对于某个特定日期 我
  • codeigniter CSRF 错误:“不允许您请求的操作。”

    我在 codeigniter 的配置文件中启用了 csrf protection 选项 并使用 form open 函数来创建我的表单 但是当我提交表单时 出现以下错误 不允许您请求的操作 我已经完成了类似这个主题的答案 与我的问题最相关
  • Pandas 列中所有字数的总和

    我有一个包含字符串的 pandas 列 我想获得整列中所有单词的字数 在不循环每个值的情况下执行此操作的最佳方法是什么 df pd DataFrame a some words lots more words hi 当运行于df a 你应该
  • 使用 Java 创建具有相似名称的文件而不覆盖现有文件

    我想知道是否可以创建多个具有相似名称的文件 而不覆盖当前文件 例如 如果我有一个文件 xyz txt 下次我创建它时应该是 xyz 1 txt try File makefile new File output txt FileWriter
  • c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗?

    我似乎无法将参数传递给需要不同参数的函数 或传递给实现第一个类型的子集的其他 Generic 宏 define DEBUG PRINT x Generic x debug print options DEBUG PRINT CUSTOM T
  • ORACLE NLS_LANG

    如何设置和检查NLS LANG设置 我做到了 set NLS LANG DANISH DENMARK WE8ISO8859P2 在命令提示符下 但我不知道它是否正确 这取决于操作系统和命令解释器 Linux bash echo NLS LA
  • CSS:根据其 href 设置链接样式

    我的网站上有一个我想要设置样式的第三方链接 但它没有任何我可以定位的类或 ID 它唯一拥有的就是它独特的 href 值 是否可以根据其 href 值设置锚标记的样式 您可以使用 href css 选择器来设置样式a基于链接的标签 a hre
  • 如何使用 Python 获取 SVG 路径的高度、宽度和长度?

    我有一个 svg 其中有大量这样的路径
  • FCM 字段“数据”必须是 JSON 数组

    您好 我正在与邮差一起制作我的 json 对象 FCM 消息 但是当我尝试发送时 to fzvihT7dFUI APA91bFVhnWAxXVjlWiiHIs9ZUyL1DE2hZO6GpItJtReh3hcKF1kD6mLuQq9fNP9
  • repz ret:为什么这么麻烦?

    的问题repz ret已经在这里介绍了 1 以及其他来源 2 3 还算满意 然而 在阅读这两个来源时 我找到了以下问题的答案 是什么actual定量比较中的惩罚ret or nop ret 尤其是在后一种情况下 当大多数函数要么有 100