Performance 将fpu切换到单精度
我曾经读到,在fpu切换到单精度模式前几年,在较旧的fpu上,除法和sqr的速度是正常模式下的两倍 (检查其来源) 还是这样吗,这样的切换可以加速一些循环,在循环中产生大量的浮点代码Performance 将fpu切换到单精度,performance,assembly,optimization,x86,x87,Performance,Assembly,Optimization,X86,X87,我曾经读到,在fpu切换到单精度模式前几年,在较旧的fpu上,除法和sqr的速度是正常模式下的两倍 (检查其来源) 还是这样吗,这样的切换可以加速一些循环,在循环中产生大量的浮点代码 第二个相关的问题是,在执行系统(winapi)调用时,我可以在代码中自由玩弄FPU精度吗?例如,与FPU舍入模式和系统端一样,api也会破坏我的设置吗?我的理解是,精度对旧版x86 FPU速度的影响几乎以i486结束。但这是8087天以前的常见优化。是的,Agner Fog的吞吐量/延迟数与降低x87精度和加速最坏
第二个相关的问题是,在执行系统(winapi)调用时,我可以在代码中自由玩弄FPU精度吗?例如,与FPU舍入模式和系统端一样,api也会破坏我的设置吗?我的理解是,精度对旧版x86 FPU速度的影响几乎以i486结束。但这是8087天以前的常见优化。是的,Agner Fog的吞吐量/延迟数与降低x87精度和加速最坏情况完全一致 考虑到现代div/sqrt硬件的工作方式,使用基数-16或基数-1024除法器迭代计算结果的更多位也是有意义的,因此需要更少的正确位意味着您可以更快地停止。(及) 考虑到x87
fdiv
和SSE1divss
在同一硬件上运行,divss
具有相同的最佳情况(舍入除数)但更好的最坏情况,这也是有意义的。x87精度位控制硬件除法器的方式可能与divss
或divsd
完全相同
以下详细信息
是的,x87的总宽度可以限制为64位或32位(
double
或float
),低于标准的80位是的,这确实略微加快了fsqrt
和fdiv
最坏情况下的速度,使其与相同精度的标量SSE/SSE2的速度大致相同(sqrtss
=标量单次/sqrtsd
=标量双次)。没有别的东西跑得更快或更慢
它不会使x87比SSE快,因此在这一点上,它主要是一个CPU历史奇观。
显然,DirectX(过去)确实将x87精度设置为24位尾数(float
),而MSVC的CRT启动则将其设置为53位尾数(double
)。看布鲁斯·道森的。但微软的历史怪诞是个例外;其他工具链/操作系统不会与x87混为一谈
不要提及Sandybridge或更新版本的CPU的x87精度。这可能意味着它不再有用,或者(我认为)阿格纳认为它不值得一提。他的SnB和更新的表格没有任何脚注,所以我认为这就是解释。据我所知,SnB的分频器与NHM没有太大区别
尼哈勒姆:
7-27个周期延迟=吞吐量(根本没有流水线),脚注中指出舍入因子或低精度给出的值较低fdiv
/divsd
7-22周期延迟=吞吐量divpd
/divss
7-14个周期延迟=吞吐量divps
divss
的方法完全相同。它们共享相同的硬件执行单元。
IvyBridge最终完成了FP分配器的管道设计。与IvB相比,Haswell没有对div编号进行任何重大更改。以下是HSW编号:
10-24c延迟,8-18c吞吐量fdiv
/divsd
:10-20c延迟,8-14c吞吐量divpd xmm
/divss
:10-13秒延迟,7秒吞吐量(固定延迟对调度器来说很好)divps xmm
通常您只需要使用SSE1,因为它通常更快(由于采用了平面寄存器集和2操作数指令而不是堆栈,因此在
fxch
和fld
寄存器拷贝上没有花费前端带宽)。在某些情况下使用SIMD的机会(通常4倍浮点sqrt的结果与1相同)使其与将x87 FPU设置为32位相比取得了巨大的胜利
大多数SSE数学指令的吞吐量和延迟与x87指令相似,但x87的开销更大
如果您需要制作一个32位二进制文件,该文件与旧CPU兼容,甚至不需要SSE1,是的,如果fdiv
和fsqrt
性能对代码很重要,您可以将x87精度降低到24位。(也可能加速一些微代码x87指令,如fsin
和fyl2x
,IDK。)
或者,如果将精度降低到float
过于剧烈,那么您将在XMM regs中查看SSE2的double
数学。它是x86-64的基准,因此,如果出于某种原因必须生成32位二进制文件,那么同样值得考虑。没有它的最新CPU是Athlon XP。(如果您不计算像“当前测地线”这样的东西。)
与fpu舍入模式和系统端相同,api是否也会破坏我的设置 好了,没有什么能让取整模式改变。这将是一个很大的区别,对性能没有帮助 如果有人能够证明这样做是合理的,那么有人会为了C的性能而这样做,C使用
(int)float
,而不使用带截断指令的SSE convert(或者对于x87版本,SSE3fisttp
),以避免将x87舍入模式设置为截断(接近0)然后在每次将FP值转换为