Sinus和Cosinus的装配看起来非常简单:
FSin FCOS
但这是否意味着它们是在一个时钟周期内计算出来的?
它们背后的计算似乎很复杂.
我们应该将其视为过于宽泛吗?异地资源请求也适用,因为直接答案在Agner Fog的指令表中.(12月23日更新了Broadwell和Skylake CPU :)另请参阅x86 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,找到您最喜欢的软件实现并对其进行基准测试.
看看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周期要求是"奇数":有些要高一些,有些则要低一些.