汇编操作的时间

time of an assembler operation

本文关键字:时间 操作 汇编      更新时间:2023-10-16

为什么相同的汇编操作(例如多)在程序的不同部分会消耗不同的时间?

注:我使用c++和反汇编器

这个问题非常模糊,但通常在现代CPU上,您不能期望操作具有恒定的执行时间,因为很多因素会影响这一点,包括但不限于:

  • 分支预测失败
  • <
  • 缓存未命中/gh>
  • 流水线

同一种操作在现代处理器上的性能差异很大有各种各样的原因。

  • 数据缓存失败:如果您的操作访问内存,它可能会进入一个位置的缓存,并在其他位置生成缓存缺失。缓存丢失可能在一百个周期的顺序,而简单的操作通常在几个周期内执行,所以这将使它慢得多。

  • 管道摊位:现代cpu通常是流水线的,因此每个周期可以调度一条(或多条)指令,但是它们通常需要多个周期才能获得结果。您的操作可能依赖于另一个操作的结果,而该操作在调度操作时尚未准备好,因此CPU必须等待,直到生成结果的操作完成。

  • 指令缓存失败:指令流也被缓存,所以你可能会发现cpu每次遇到一个位置都会产生缓存缺失的情况(不太可能发生任何会占用大量运行时的事情,指令缓存不是那么小)。

  • 说明:另一种管道失速。CPU将尝试预测条件跳转的方向,并推测执行该执行路径中的代码。如果它是错误的,它必须放弃这种推测执行的结果,并开始另一条道路。这可能显示在分析器中其他路径的第一行。

  • 资源争用:操作可能不依赖于不可用的结果,但所需的执行单元可能仍然被另一条指令占用(有些指令在所有处理器上没有完全流水线,或者可能是因为某种超线程或推土机共享FPU)。同样,CPU可能不得不停止运行,直到单元空闲为止。

  • 页面错误:应该是相当明显的。基本上就是打了兴奋剂的Cache Miss。如果访问的内存必须从磁盘重新加载,这将花费数十万个周期

  • :这样的例子不胜枚举,但上述几点是最有可能对我的选择产生影响的。

我想你问的是对相同操作数应用的完全相同的指令。

一个可能对性能产生巨大影响的原因是操作数是否在CPU缓存中随时可用,或者是否必须从主RAM中获取。

这只是一个例子;还有许多其他潜在的原因。在现代cpu中,通常很难通过查看代码来计算给定指令需要多少个周期。

    例如,在分析器中,我看到"mulps %xmm11, %xmm5"。我猜是寄存器中的数据

xmmXX是SSE指令。mulps是精确单倍数,它取决于您是否将SSE乘法与普通标量乘法进行比较。在这种情况下是可以理解的。

我们真的需要更多的信息来更好地回答asm和你的分析器的数据。

如果只是这条指令是慢的?或者是一个指令块,可能是从未对齐的内存加载,或者你得到缓存丢失,管道危险和大量其他可能性。