gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:28:17 27 4
gpt4 key购买 nike

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

问题是,由于首先要从内存中获取指令,CPU如何比内存运行得更快? CPU通常会花费大量时间等待内存中的指令吗?

编辑:
要运行程序,我们需要将其编译为包含机器代码的文件。然后,我们将该文件加载到内存中,然后逐条执行一条指令。 CPU需要知道要运行的指令,然后从内存中获取那条信息。我不是在问要处理数据,而是要从内存中读取指令的过程。对不起,如果我不够清楚。

编辑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)甚至还可以缓存已经解码的指令,以消除解码瓶颈。

请参阅http://www.realworldtech.com/sandy-bridge/3/,以获取有关英特尔Sandybridge中前端的相当详细的内容(获取/预解码/解码/重命名+问题),并带有如下所示的框图,其中显示了英特尔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's microarch guide,以获取有关各种微体系结构中前端的更多信息,并为它们优化asm。

另请参见标签Wiki中的其他CPU性能链接。

关于performance - CPU速度是否受从内存中获取指令的速度限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45819146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com