gpt4 book ai didi

assembly - 从 x86 中的寄存器加载值所花费的时间

转载 作者:行者123 更新时间:2023-12-05 08:16:36 24 4
gpt4 key购买 nike

我目前正在通过 Intel x86 Assembly 的艺术 一书学习 x86。在详细说明不同指令类和操作码如何工作的部分,它说一个字节的操作码编码为 iiirrmmm,其中三个 is表示指令类,rr表示4个主要寄存器,mmm可以是多个值,表示可选的2字节内存操作数,形式为AX[AX][AX+XXXX]等,例如101对应[XXXX+BX] 100对应[BX]等。开头还提到访问寄存器中的值所花费的时间是零时钟周期,因为它在芯片上实现。

然而,在解释一条指令完全工作所花费的时间时,为了计算出 CPU 计算内存操作数地址所花费的时间,它是这样说的:

enter image description here

会不会分别是1和0周期,因为书上一开始就明确提到,访问寄存器中的值是取0时钟周期?为什么说访问BX中的值需要1个周期?

最佳答案

非常非常重要的一点是,您要了解本书告诉您的任何有关代码执行速度的内容都是胡说八道。这本书很老了,15 年在处理器开发中是很多狗的生活。即使从您的屏幕截图中可见的内容在当时已经不再真实,但在今天它变得危险不真实。

Next, the CPU computes the address of the memory operand

不,不是真的。操作数地址计算是 AGU(“地址生成单元”)的工作。处理器核心上独立于主执行核心运行的独立电路。这就是为什么做额外的工作可能需要 0 个 cpu 周期,工作是并发完成的。这并不仅限于 AGU,现代处理器有 许多 可以同时完成作业的执行单元。

We will assume that clock cycles and memory cycles are equivalent

当时不真实,今天更不真实。内存总线比处理器内核慢数百倍。一个与距离相关的问题是,电信号传输的距离越远,就越难在不损坏的情况下将其传送到目的地。只有放慢速度才能解决这个问题。具有千兆赫兹时钟速率的现代处理器在高速缓存上投入了大量资金,这是一种额外的内存,用于在 RAM 中存储数据副本。一级缓存非常重要,它可以存储 32 KB 的数据和 32 KB 的指令,并且最靠近处理器核心。仍然需要 3 个 cpu 周期来读取。 L2 和 L3 更大,不可避免地离得更远,因此需要更多的周期。任何因为从 RAM 读取数据需要 150 个 CPU 周期而导致执行停顿的程序当然都是性能非常差的程序,无论它使用什么指令。

不适不止于此,这本书的整个前提在今天非常具有误导性。现代处理器实际上并不执行 x86 指令。它们具有相当于即时编译器的功能,即 Java 或 .NET 中使用的那种编译器。他们将 x86 指令翻译成“微操作”,CISC 指令被翻译成 RISC 指令。容易跨多个执行子单元乱序执行的那种。这到底是什么样子是一个保密得很好的 secret ,英特尔和 AMD 等公司将其视为知识产权,任何人都不应该知道任何事情。最重要的是,任何人都不应该依赖它,因为这会使他们难以改进其处理器设计。

这项创新的一个明显牺牲品是谈论一条指令占用一定数量的 CPU 周期不再有意义。我已经向您指出了 Agner Fog 的手册。它讨论了延迟,即解码指令并获得结果所花费的时间。以及吞吐量,受可同时执行的相同指令数量的影响。这些数字只是给你一个处理器需要多努力工作的提示,它们对于预测程序的实际执行时间完全没有用。添加缓存的状态、内存总线的速度、预取器猜测需要提前检索哪个内存位置的能力,以及分支预测器作为强随机化器猜测代码流的运气程度.只有分析器才能告诉您花了多长时间。

关于assembly - 从 x86 中的寄存器加载值所花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22887314/

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