现代 x86 成本模型

2024-04-04

我正在编写一个带有 x86 后端的 JIT 编译器,并一边学习 x86 汇编程序和机器代码。我大约 20 年前使用过 ARM 汇编器,对这些架构之间成本模型的差异感到惊讶。

具体来说,内存访问和分支在 ARM 上的成本很高,但等效的堆栈操作和跳转在 x86 上的成本却很低。我相信现代 x86 CPU 比 ARM 内核所做的动态优化要多得多,而且我发现很难预测它们的效果。

编写 x86 汇编程序时要牢记的良好成本模型是什么?哪些指令组合便宜,哪些组合昂贵?

例如,如果我的编译器始终生成用于加载整数或跳转到偏移量的长格式,即使整数很小或偏移量接近,我的编译器也会更简单,但这会影响性能吗?

我还没有做过任何浮点运算,但我想尽快开始。普通代码和浮动代码之间的交互有什么不明显的地方吗?

我知道有很多关于 x86 优化的参考文献(例如 Michael Abrash),但我有预感,几年前的任何东西都不适用于现代 x86 CPU,因为它们最近发生了很大的变化。我对么?


最好的参考是英特尔优化手册 http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html,它提供了有关所有最新英特尔内核的架构风险和指令延迟的相当详细的信息,以及大量的优化示例。

另一个很好的参考是Agner Fog 的优化资源 http://www.agner.org/optimize/,其优点还包括AMD核心。

请注意,特定成本模型本质上是特定于微架构的。不存在任何真正有效的“x86 成本模型”。在指令层面,Atom 的性能特征与 i7 有很大不同。

我还要指出的是,内存访问和分支在 x86 核心上实际上并不“便宜”——只是无序执行模型变得如此复杂,以至于它可以在许多简单的场景中成功隐藏它们的成本。

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

现代 x86 成本模型 的相关文章

  • LockBits 性能关键代码

    我有一个方法需要尽可能快 它使用不安全的内存指针 这是我第一次尝试这种类型的编码 所以我知道它可能会更快
  • PHP include():文件大小和性能

    一个没有经验的PHP问题 我有一个 PHP 脚本文件 我需要在不同页面的很多地方多次包含该文件 我可以选择将包含的文件分解为几个较小的文件 并根据需要包含这些文件 或者 我可以将它们全部保存在一个 PHP 文件中 我想知道在这种情况下使用较
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 单元测试(有时)会因为浮点不精确而失败

    我有课Vector代表 3 维空间中的一个点 这个向量有一个方法normalize self length 1 将矢量缩小 放大为length vec normalize length length 该方法的单元测试有时由于浮点数的不精确性
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么在 Javascript 中添加两位小数会产生错误的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 的数学有问题吗 https stackoverflow com questions 588004 is javascripts math broken 为什么 JS 搞砸了这个简
  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • cout 可以以某种方式改变变量吗?

    所以我有一个看起来像这样的函数 float function float x SomeValue return x SomeOtherValue 在某些时候 这个函数会溢出并返回一个非常大的负值 为了尝试准确追踪发生这种情况的位置 我添加了
  • 浮点舍入效果说明

    include
  • 在 O(n) 时间内运行的指数乘法算法?

    我正在读一本算法教科书 我被这个问题难住了 假设我们要计算值 x y 其中 x 和 y 为正数 分别具有 m 和 n 位的整数 解决该问题的一种方法是执行 y 1 乘以 x 你能给出一个仅使用 O n 乘法步骤的更有效的算法吗 这会是一个分
  • 浮点型、双精度型和十进制最大值与大小的关系[重复]

    这个问题在这里已经有答案了 我在 C 中遇到了这些数据类型的大小和最大值的令人困惑的模式 在使用 Marshal SizeOf 比较这些大小时 我发现了以下结果 Float 4 bytes Double 8 bytes Decimal 16
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 测试由于浮点限制而导致的舍入误差

    我最近了解到浮点的主要限制之一 事实上 某些数字无法以二进制正确表示 因此可能给出的答案对于您的目的来说不够准确 知道round 2 675 2 and round 2 665 2 两者相等2 67我尝试编写一些代码来给出具有此属性的数字列
  • 为什么 Chrome 审核建议我最小化 Cookie 大小?

    如何最小化请求的 cookie 大小 Chrome 似乎 警告我 我的 cookie 大小为 41B 这根本不是很多 但是它警告我有什么原因吗 这是一个 PHPSESSID cookie 我真的不知道如何最小化它 有任何想法吗 我的请求响应
  • 如何提高QNX6下Eclipse IDE的性能

    我们在 VMWare 环境中通过 QNX6 运行 Eclipse 速度非常慢 Eclipse 是这样启动的 usr qnx630 host qnx6 x86 usr qde eclipse eclipse data root workspa
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF

随机推荐

  • 在托管 ASP 站点的 URL 中附加 www(即无 IIS 访问权限)

    我看到很多类似的问题都是用乱码写的 我不明白 使用 htaccess 将非 www URL 重定向到 www https stackoverflow com q 50931 153923 将不带 www 的 URL 重定向到 www htt
  • jQuery 从 DOM 中删除元素仍将报告保留为当前状态

    我有一个地址查找系统 用户输入邮政编码 如果邮政编码经过验证 则返回并显示地址列表 然后他们选择一个地址行 该列表消失 然后地址行进一步分成一些表单输入 我面临的问题是 当他们完成上述过程 然后清除邮政编码表单字段 点击查找地址按钮 地址列
  • 抛出异常时如何显示堆栈跟踪

    我希望有一种方法可以在引发异常时向用户报告堆栈跟踪 做这个的最好方式是什么 如果可能的话 我希望它是便携式的 我希望弹出信息 以便用户可以复制堆栈跟踪并在出现错误时通过电子邮件发送给我 安德鲁 格兰特的回答 https stackoverf
  • 如何锁定表...做事...使用 Spring Boot 解锁表?

    这个想法基本上是扩展some具有自定义功能的存储库 所以我得到了这个设置 它确实有效 MappedSuperclass abstract class MyBaseEntity Id GeneratedValue strategy Gener
  • PHP 中的 ' 和 " 有什么区别? [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 不同的引号 https stackoverflow com questions 1318028 php different quotes 简单的问题 php 中 和 有什么区别 什么时候应该使
  • 将密码重置邮件模板替换为自定义模板 laravel 5.3

    我为身份验证系统执行了 laravel 命令 php artisan make auth它为我的应用程序制作了身份验证系统 几乎一切都正常 现在 当我使用忘记的密码时 它会向我的邮件 ID 发送一个令牌 我看到模板包含 laravel 和一
  • 具有 2FA 的 Asp.Net Identity - 记住会话后不保留浏览器 cookie

    我正在使用带有 Asp Identity 和两因素身份验证的 MVC5 2 的最新示例代码 启用 2FA 后 当用户登录时 系统会提示输入代码 通过电话或电子邮件发送 并且他们可以选择 记住浏览器 这样他们就不会在该浏览器上再次要求输入代码
  • 在flex中以编程方式获取SIM号码

    我想以编程方式获取SIM号码 在flex中可以吗 在android开发人员指南中我看到了电话管理器类 同样我们在flex中有什么东西吗 提前致谢 看看这个 这确实是一个 hack 但却是您从 Flex Mobile 调用 Java API
  • 使用不带操作栏的选项菜单

    我正在使用它来隐藏 Android 应用程序中的操作 标题栏 this requestWindowFeature Window FEATURE NO TITLE 我用这个创建了我的选项菜单 MenuInflater inflater get
  • Android 每 4 秒运行一个任务

    您好 我需要每 4 秒调用一个方法 即使设备处于睡眠状态 我使用带有服务 Start stick 的警报管理器 服务名称为 TransactionService 当设备处于活动状态并且每 4 秒调用一次该方法时 代码运行良好 但是当屏幕锁定
  • Django+MongoDB 与 Node.js+MongoDB

    我已经建立并运行了一个带有使用 Python Django MySQL 构建的同步服务的网站 很长一段时间以来 我一直在关注 Node js 和 MongoDB 方面 我即将做出决定 将系统的一部分迁移到 MongoDB 该系统托管来自用户
  • 在回发期间保留 C# 对象

    我有一个 asp net 页面 其中包含 C 代码隐藏 它在 Page Load 方法中执行一些操作 例如查询数据库并进行一些其他调用以使用数据填充对象 然后我在页面上显示这些数据 这一切都很好 我设置了几个回发 以便当单击列表框中的值时
  • R中按字符串列名聚合

    我想按两列对 data frame 中的数据进行分组 然后对特定的第三列进行求和 例如 gt aggregate mpg gear cyl data mtcars FUN sum gear cyl mpg 1 3 4 21 5 2 4 4
  • GUI 开发人员如何处理可变像素密度?

    当今的显示器在尺寸和分辨率方面具有相当大的范围 例如 我的 34 5 厘米 19 5 厘米显示屏 对角线为 39 6 厘米或 15 6 英寸 具有 1366 768 像素 而对角线为 15 英寸的 MacBook Pro 第三代 具有 28
  • 使用 dplyr 将组汇总为区间

    H 我有一个像这样的数据框 d lt data frame v1 seq 0 9 9 0 1 v2 rnorm 100 v3 rnorm 100 gt head d v1 v2 v3 1 0 0 0 01431916 0 5005415 2
  • 如何使用 JodaTime 获取一年中的天数?

    我已尝试以下方法但无济于事 new Period Years ONE getDays new Period 1 0 0 000 getDays 我想要的答案显然是365 你想要的答案并不明显365 它是365 or 366 您在示例中没有考
  • Rancher - 如何公开我的服务?

    我有一个正在运行的 Rancher 设置 如下所示 主机 运行牧场主 https github com rancher rancher容器 在公共IP上 无法从 Internet 访问专用网络 10 1 1 0 24 中的节点 我的目标是使
  • bootstrap-vue 选择带有过滤器选项的组件?

    在带有 bootstrap vue 的 vue 项目中 我搜索选择组件的工作原理https bootstrap vue js org docs components form select https bootstrap vue js or
  • 在同一个“分配”对象上多次调用初始化程序是否安全?

    我可以构建一个UIImageView对象与myImageView UIImageView alloc initWithImage image 如果我想更改 UIImageView 上的图像 则影响显示的应用程序活动如下 我可以通过重新分配它
  • 现代 x86 成本模型

    我正在编写一个带有 x86 后端的 JIT 编译器 并一边学习 x86 汇编程序和机器代码 我大约 20 年前使用过 ARM 汇编器 对这些架构之间成本模型的差异感到惊讶 具体来说 内存访问和分支在 ARM 上的成本很高 但等效的堆栈操作和