在多少个时钟脉冲计算窦?

ar2*_*015 -2 performance x86 assembly

Sinus和Cosinus的装配看起来非常简单:

FSin
FCOS
Run Code Online (Sandbox Code Playgroud)

但这是否意味着它们是在一个时钟周期内计算出来的?

它们背后的计算似乎很复杂.

Pet*_*des 5

我们应该将其视为过于宽泛吗?异地资源请求也适用,因为直接答案在Agner Fog的指令表中.(12月23日更新了Broadwell和Skylake CPU :)另请参阅 wiki.

解释为什么一条指令并不意味着一个周期要复杂得多,但可以说微编码的x87 FPU指令很慢.Intel Haswell fsin:47-106c延迟.71-100微博.

添加/ sub/mul/div和sqrt都具有快速硬件支持.Skylake可以使用4个单精度float元素的sqrt向量,每3个时钟的吞吐量为1,而Haswell每7个时钟.(标量相同:sqrtps并且sqrtss在这些CPU上具有相同的性能.)延迟为11或12个时钟.

对于SSE Sine,找到您最喜欢的软件实现并对其进行基准测试.


wal*_*lyk 5

看看8087指令时序,这是1980年推出的原装英特尔浮点单元,它是一个独立的芯片,设计与8088或8086配对,售价为90至300美元!

即使FABS是单指令,它也可能需要10到17个时钟周期才能完成,这是其指令集中最快的指令之一:只有FCLEX(清除异常)在2到8个周期内更快(不想法为什么会有这样的变化 - 这对我来说当然没有意义).

最慢的单个FPU指令是900到1100个周期的FYL2X(Y*log 2 X).标准8086的时钟频率为5 MHz,因此该指令执行时间可能长达0.22毫秒.从那时起,FPU速度大大提高!在8086上,没有指令在2个周期内执行,只有少数是2个(如NOP和CBW).

您可能会注意到,在该指令时序表中,8087和80287中没有FSIN和FCOS.编译器提供了运行时库,它们使用FPU函数的部分超越函数来计算它们.当指令首次在80387中引入时,它们需要122到771个周期才能执行.请注意,与8087/80287相比,387周期要求是"奇数":有些要高一些,有些则要低一些.

  • 也许FCLEX执行时间取决于是否有任何必须实际清除的待处理异常?有趣的历史观点; 我甚至没有考虑过从这个角度回答.这确实使Skylake的每3个时钟周期内的四个单精度sqrt结果令人印象深刻!(或每4-7个时钟一个80bit x87 FSQRT). (2认同)