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

时间:2015-12-29 03:49:00

标签: performance assembly x86

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

FSin
FCOS

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

他们背后的计算似乎很复杂。

2 个答案:

答案 0 :(得分:5)

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

解释为什么一条指令并不意味着一个周期要复杂得多,但只需说微编码的x87 FPU指令很慢就足够了。英特尔Haswell fsin:47-106c延迟。 71-100 uops。

添加/ sub / mul / div和sqrt都具有快速硬件支持。 Skylake可以使用4个单精度float元素的sqrt向量,每3个时钟的吞吐量为1,而Haswell每7个时钟。 (标量相同:sqrtpssqrtss在这些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相比:有些相当高,有些则相当低。