数学函数在现代处理器上花费了多少周期

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

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

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

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

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

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

SIMD指令更好。

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

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

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

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

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

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

如果您有其他理由要求,您应该解释,以便可以集中回答。