CPU速度是否受从内存获取指令的速度的限制? [英] Is CPU speed limited by the speed of fetching instructions from memory?

查看:24
本文介绍了CPU速度是否受从内存获取指令的速度的限制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

编辑2

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

推荐答案

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

(我刚刚意识到您没有标记这个x86,尽管您确实使用了x86指令作为示例。我的所有示例都是x86,但对于任何其他体系结构,基本情况都是相同的。除了非x86 CPU不会使用解码微操作缓存之外,x86是唯一仍在通用的ISA,它很难解码,因此缓存解码结果是值得的。)


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

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

请参阅http://www.realworldtech.com/sandy-bridge/3/以获取有关英特尔沙桥(获取/预解码/解码/重命名+问题)中前端的详细信息,其中的框图如下所示,显示了英特尔沙桥与英特尔Nehalem和AMD Bulldozer的指令获取逻辑。(解码在下一页)。预解码阶段查找指令边界(即,在解码每条指令的实际内容之前对指令长度进行解码)。

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

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

您可以构建一些代码,以每周期16字节的速度进行解码,这可能高于主内存带宽。或者在AMD CPU上甚至更高。但通常情况下,解码瓶颈会限制您的不仅仅是纯取码带宽。


另请参阅Agner Fog's microarch guide,了解有关各种微体系结构中的前端以及为其优化ASM的更多信息。

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

这篇关于CPU速度是否受从内存获取指令的速度的限制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆