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

pyt*_*nic 3 c math assembly gcc x86-64

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

Eri*_*hil 11

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

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

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

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

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

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


Han*_*ant 9

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

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

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

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

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

SIMD指令更好.

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