Sinus和Cosinus的装配看起来非常简单:
FSin
FCOS
但这是否意味着它们是在一个时钟周期内计算的?
他们背后的计算似乎很复杂。
答案 0 :(得分:5)
我们应该将其视为过于宽泛吗?异地资源请求也适用,因为直接答案在Agner Fog's instruction tables。 (12月23日更新了Broadwell和Skylake CPU :)另请参阅x86 wiki。
解释为什么一条指令并不意味着一个周期要复杂得多,但只需说微编码的x87 FPU指令很慢就足够了。英特尔Haswell fsin
:47-106c延迟。 71-100 uops。
添加/ sub / mul / div和sqrt都具有快速硬件支持。 Skylake可以使用4个单精度float
元素的sqrt向量,每3个时钟的吞吐量为1,而Haswell每7个时钟。 (标量相同:sqrtps
和sqrtss
在这些CPU上具有相同的性能。)延迟为11或12个时钟。
对于SSE Sine,找到您最喜欢的软件实现并对其进行基准测试。
答案 1 :(得分:5)
看看picasso,原来的英特尔浮点单元instruction timings for the 8087,这是一个独立的芯片,设计与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上,in 1980中没有执行任何指令,只有少数指令为2(如NOP和CBW)。
您可能会注意到,在该指令时序表中,FSIN和FCOS在8087和80287中不可用。编译器提供了运行时库,它们使用FPU函数的部分超越函数来计算它们。当指令首次在80387中引入时,它们需要122到771个周期才能执行。请注意,387周期要求是"奇数"与8087/80287相比:有些相当高,有些则相当低。