数学函数在现代处理器上占用多少周期

时间:2012-09-08 19:06:46

标签: c math gcc assembly x86-64

我们知道现代处理器直接在处理器上执行cosinesin等指令,因为它们具有操作码。我的问题是这些指令通常需要多长时间。他们是否需要恒定时间或依赖输入参数?

2 个答案:

答案 0 :(得分:11)

时间因处理器型号而异。时间通常从数十个CPU周期到一百或更多。

(许多指令消耗的时间因环境而异,因为指令使用处理器中的各种资源[调度程序,执行单元,重命名寄存器等],因此指令延迟其他工作的时间取决于其他什么在处理器中正在进行。例如,如果某些代码几乎完全加载并存储指令,那么非常偶然的正弦指令可能根本不会减慢其执行速度。但是,需要几十个CPU周期的指令通常由它们主导。执行单元中的时间,它是进行实际数值计算的部分。)

执行时间可能因输入参数而异。三角函数的大参数必须以2π模数减少,这本身就是一个复杂的问题。

在Mac OS X数学库中,我们通常使用汇编语言编写自己的实现,原因有多种,包括速度,符合标准,适用于应用程序二进制接口以及其他功能。

如果您只是好奇,那么“数十到数百个处理器周期”可能是一个很好的答案,特别是在没有指定特定处理器模型的情况下。基本上,时间足够长,你不应该没有充分的理由使用这些操作。 (例如,我已经看到代码获得π为4·arctan(1)。不要这样做。)

如果您有其他理由要求,您应该进行解释,以便能够集中解答。

答案 1 :(得分:9)

谈论现代处理器的“指令周期”很久以前就变得困难了。如今处理器包含多个执行核心,它们的操作可以重叠并且可以无序执行。

英特尔处理器手册第4卷附录C给出了基本考虑因素的一个很好的例子。它通过延迟和吞吐量来分解指令时序。延迟是执行核心完成微操作所需的周期数。吞吐量是让执行单元再次接受相同指令所需的周期数。吞吐量通常比延迟更低,包括在表中包含小数值。具有多个相同类型的执行单元的副作用。类型很重要,可以告诉您指令是否可以重叠。

也许你在这里得到了基本的信息:它很大程度上取决于你对时间感兴趣的代码周围的其他指令。那些其他指令可能与昂贵的指令同时执行。在这一点上,他们有效地采取了0个周期。或者他们可能没有,因为执行单元忙于先前的指令而停止管道。编写代码优化器的程序员关心的细节很多。

手册中的一些示例数据,选择表中最现代的核心:

  • FMUL,延迟= 7,吞吐量= 2,FP_MUL执行单元
  • FDIV,延迟= 6,吞吐量= 5,未指定单位
  • FSQRT,等待时间= 38,吞吐量= 43,FP_DIV例程单位
  • FSIN,延迟= 160-180,吞吐量= 130,未指定单位

更好地发挥SIMD指令的作用。

唯一有意义的事情是度量,而不是假设。