Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 将fpu切换到单精度_Performance_Assembly_Optimization_X86_X87 - Fatal编程技术网

Performance 将fpu切换到单精度

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精度和加速最坏

我曾经读到,在fpu切换到单精度模式前几年,在较旧的fpu上,除法和sqr的速度是正常模式下的两倍

(检查其来源)

还是这样吗,这样的切换可以加速一些循环,在循环中产生大量的浮点代码


第二个相关的问题是,在执行系统(winapi)调用时,我可以在代码中自由玩弄FPU精度吗?例如,与FPU舍入模式和系统端一样,api也会破坏我的设置吗?

我的理解是,精度对旧版x86 FPU速度的影响几乎以i486结束。但这是8087天以前的常见优化。

是的,Agner Fog的吞吐量/延迟数与降低x87精度和加速最坏情况完全一致

考虑到现代div/sqrt硬件的工作方式,使用基数-16或基数-1024除法器迭代计算结果的更多位也是有意义的,因此需要更少的正确位意味着您可以更快地停止。(及)

考虑到x87
fdiv
和SSE1
divss
在同一硬件上运行,
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没有太大区别

尼哈勒姆:

  • fdiv
    7-27个周期延迟=吞吐量(根本没有流水线),脚注中指出舍入因子或低精度给出的值较低

  • divsd
    /
    divpd
    7-22周期延迟=吞吐量

  • divss
    /
    divps
    7-14个周期延迟=吞吐量

因此,所有形式的最佳情况性能(7个周期占用的除法器)都是相同的,最坏情况越差,尾数位数可能越多

我们知道除法器HW是迭代的,必须持续更长的时间才能计算更多的位,因此将x87精度设置为24或53位有助于提高性能的可能性是100%,与使用
divss
的方法完全相同。它们共享相同的硬件执行单元。

IvyBridge最终完成了FP分配器的管道设计。与IvB相比,Haswell没有对div编号进行任何重大更改。以下是HSW编号:

  • fdiv
    10-24c延迟,8-18c吞吐量
  • divsd
    /
    divpd xmm
    :10-20c延迟,8-14c吞吐量
  • divss
    /
    divps xmm
    :10-13秒延迟,7秒吞吐量(固定延迟对调度器来说很好)
另请参见我收集Agner Fog最近英特尔CPU数据的地方,包括256位YMM向量。我没有提到x87,因为它基本上与高性能无关


通常您只需要使用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版本,SSE3
fisttp
),以避免将x87舍入模式设置为截断(接近0)然后在每次将FP值转换为