CPU的速度是否受到从内存中获取指令的速度的限制?

2023-11-26

在学习汇编时,我意识到我应该将经常访问的数据放入寄存器而不是内存中,因为内存要慢得多。

问题是,既然指令首先是从内存中获取的,那么CPU如何能够比内存运行得更快呢? CPU通常会花费大量时间等待内存中的指令吗?

EDIT: 要运行程序,我们需要将其编译为包含机器代码的文件。然后我们将该文件加载到内存中,并运行一条又一条指令。 CPU 需要知道要运行什么指令,并且该信息是从内存中获取的。我不是在问操作数据,而是在问从内存中读取指令的过程。抱歉,如果我不够清楚。

EDIT 2:

例子:xor eax, eax编译为31c0在我的电脑上。我知道这个指令本身很快。但要清除eax,CPU需要读取31c0首先从记忆中。如果访问内存很慢,那么读取应该花费很多时间,并且在这段时间内CPU只是停顿?


与指令执行并行的代码获取是如此重要,甚至 8086 也做到了(在有限的范围内,具有非常小的预取缓冲区和低带宽)。即便如此,取码带宽实际上是 8086 的主要瓶颈。

(我刚刚意识到你没有标记这个 x86,尽管你确实使用了 x86 指令作为示例。我的所有示例都是 x86,但对于任何其他体系结构来说,基础知识几乎都是相同的。除了非 x86 CPU 不会不使用解码的 uop 缓存,x86 是唯一仍然普遍使用的 ISA,它很难解码,因此值得缓存解码结果。)


在现代 CPU 中,取码很少成为瓶颈,因为caches预取隐藏了延迟,并且与数据所需的带宽相比,带宽要求通常较低。 (但是,代码占用量非常大的臃肿代码可能会因指令缓存未命中而导致速度减慢,从而导致前端停顿。)

L1I 缓存与 L1D 缓存分开,CPU 每个周期获取/解码至少 16 字节的 x86 代码块。具有解码 uop 缓存的 CPU(Intel Sandybridge 系列和 AMD Ryzen)甚至可以缓存已解码的指令以消除解码瓶颈。

See http://www.realworldtech.com/sandy-bridge/3/有关 Intel Sandybridge 中前端的相当详细的文章(获取/预解码/解码/重命名+问题),以及像这样的框图,显示了 Intel Sandybridge 与 Intel Nehalem 和 AMD Bulldozer 的指令获取逻辑。 (解码在下一页)。 “预解码”阶段找到指令边界(即在解码每条指令实际是什么之前解码指令长度)。

David Kanter's SnB writeup

L1I 缓存未命中会导致向统一 L2 发出请求。现代 x86 CPU 还具有共享 L3 缓存(在多个内核之间共享)。

硬件预取将即将需要的代码引入 L2 和 L1I,就像将数据预取到 L2 和 L1D 中一样。大多数情况下,这隐藏了 DRAM > 200 个周期的延迟,通常仅在跳转到“冷”功能时失败。当运行一长串没有采取分支的代码时,它几乎总是可以领先于解码/执行,除非其他东西(如数据加载/存储)耗尽了所有内存带宽。

您可以构建一些以每个周期 16 字节进行解码的代码,这可能高于主内存带宽。或者在 AMD CPU 上甚至更高。但通常解码瓶颈会比纯粹的代码获取带宽限制更多。


也可以看看Agner Fog 的微架构指南了解有关各种微架构中的前端以及针对它们优化 asm 的更多信息。

另请参阅以下中的其他 CPU 性能链接x86标签维基。

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

CPU的速度是否受到从内存中获取指令的速度的限制? 的相关文章

  • 我的 Bitset 的大小是多少?

    我想存储System currentTimeInMillis以尽可能小的空间存储在内存中 因为我必须将数百万个它们存储在内存中 我把它转换为binaryString这给了我41 bits 这是我的程序 public class BitSet
  • 如何从 Hudson CI API 获得更好的性能?

    我正在尝试为自己编写一个与 Hudson 构建服务器集成的小工具 我目前遇到的障碍是性能 我想做一件简单的事情 比如列出所有作业和上次成功构建的时间 hudson API 提供了此信息 但我要么必须查询所有内容depth 2或者单独查询每个
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 为什么 pow(int, int) 这么慢?

    我一直在做一些项目欧拉练习来提高我的 C 知识 我写了以下函数 int a 0 b 0 c 0 for a 1 a lt SUMTOTAL a for b a 1 b lt SUMTOTAL a b c SUMTOTAL a b if c
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • 您可以从 MethodInfo 对象获取 Func (或类似的)吗?

    我意识到 一般来说 使用反射会对性能产生影响 实际上 我本人根本不喜欢反思 这纯粹是学术问题 假设存在一些如下所示的类 public class MyClass public string GetName return My Name 请耐
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • 非阻塞方法中的饥饿

    一段时间以来 我一直在阅读有关非阻塞方法的内容 这是一段所谓的无锁计数器的代码 public class CasCounter private SimulatedCAS value public int getValue return va
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • 找到对应的未经V8优化的JS代码源

    我尝试优化 node js 应用程序的性能 因此我正在分析 V8 的 JIT 编译器的行为 当通过运行应用程序时node trace deopt trace opt code comments print optcode 输出包含许多重复出
  • jQuery mousemove 性能 - 节流事件?

    我们面临着与 mousemove 连接的 jQuery 事件传播性能问题 我们有一个屏幕填充画布 需要跟踪用户是否在其上拖动鼠标 因此我们在该对象上添加了一个鼠标移动侦听器 如下所示 ourCanvas on mousemove funct
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一

随机推荐