gpt4 book ai didi

c - 测量执行单条指令的时间

转载 作者:行者123 更新时间:2023-12-04 12:21:23 25 4
gpt4 key购买 nike

有没有办法使用 C 或汇编程序甚至 C# 来准确测量执行 ADD 指令所需的时间?

最佳答案

是的,有点,但它很重要,并且产生的结果几乎毫无意义,至少在最合理的现代处理器上是这样。

在相对较慢的处理器上(例如,从 Intel 系列中的原始 Pentium 开始,在大多数小型嵌入式处理器上仍然如此),您只需查看处理器的数据表,它就会(通常)告诉您有多少个时钟滴答期待。快速、简单、容易。

在现代台式机上(例如,Pentium Pro 或更高版本),生活几乎并不那么简单。这些 CPU 可以一次执行多条指令,并且只要它们之间没有任何依赖关系,就可以乱序执行它们。这意味着单个指令所用时间的整个概念几乎变得毫无意义。执行一条指令所花费的时间可以而且将取决于它周围的指令。

就是说,是的,如果您真的想要,您可以(通常——取决于处理器)测量一些东西,尽管它究竟意味着多少还存在相当大的疑问。即使得到像这样只是接近毫无意义而不是完全没有意义的结果也不是微不足道的。例如,在 Intel 或 AMD 芯片上,您可以使用 RDTSC 自行进行计时测量。不幸的是,这可能会按上述顺序乱序执行。要获得有意义的结果,您需要用不能乱序执行的指令(“序列化指令”)包围它。最常见的选择是 CPUID,因为它是为数不多的可用于“用户模式”(即 ring 3)程序的序列化指令之一。不过,这本身就增加了一点扭曲:正如 Intel 所记录的那样,处理器执行 CPUID 的前几次,可能比后续时间花费更长的时间。因此,他们建议您在使用它来序列化计时之前先执行它三次。因此,一般序列运行如下:

.align 16
CPUID
CPUID
CPUID
RDTSC
; sequence under test
Add eax, ebx
; end of sequence under test
CPUID
RDTSC

然后您将其与执行相同操作但删除被测序列的结果进行比较。当然,这会遗漏相当多的细节——至少您需要:

  1. 在每个 CPUID 之前正确设置寄存器
  2. 在第一个 RDTSC 之后将值保存在 EAX:EDX 中
  3. 从第一个 RDTSC 中减去第二个 RDTSC 的结果

另请注意我插入的“对齐”指令——指令对齐也会影响时序,尤其是在涉及循环的情况下。

关于c - 测量执行单条指令的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658699/

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