我们应该对 64 位 Delphi 编译器中的浮点支持有什么期望?
64 位编译器会使用 SSE 来实现浮点运算吗?
64 位编译器是否支持当前的 80 位浮点类型(扩展)?
这些问题密切相关,所以我将它们作为一个问题提出。
我们应该对 64 位 Delphi 编译器中的浮点支持有什么期望?
64 位编译器会使用 SSE 来实现浮点运算吗?
64 位编译器是否支持当前的 80 位浮点类型(扩展)?
这些问题密切相关,所以我将它们作为一个问题提出。
我在这个主题上发表了两篇文章(这里和那里),总结一下,是的,64 位编译器使用 SSE2(双精度),但它不使用 SSE(单精度)。一切都转换为双精度浮点数,并使用 SSE2 计算(编辑:但是有一个选项来控制它)
这意味着如果双精度浮点数上的数学很快,单精度上的数学很慢(单精度和双精度之间的大量冗余转换被抛出),“扩展”被别名为“双”,并且中间计算精度受到限制到双精度。
编辑:有一个未记录的(当时)指令控制 SSE 代码生成,{$EXCESSPRECISION OFF}激活 SSE 代码生成,从而使性能恢复到预期范围内。
根据 Marco van de Voort 在他对以下问题的回答:我应该如何为最终的 64 位编译器准备我的 32 位 Delphi 程序:
x87 FPU 在 x64 上已弃用,通常 SSE2 将用于菌落点。因此浮点及其异常处理的工作方式可能略有不同,并且扩展可能不是 80 位(而是 64 位,或者不太可能是 128 位)。这也与与需要不同 fpu 字的 C 代码接口时通常的舍入(copro 控制工作)更改有关。
PHis 评论了这个答案:
我不会说 x87 FPU 已被弃用,但微软确实决定尽最大努力做到这一点(而且他们似乎真的不喜欢 80 位 FP 值),尽管它在 Win64 上使用 FPU/80 位浮点数在技术上显然是可行的。
我刚刚发布了您其他问题的答案,但我想它实际上应该在这里:
显然,在产品发布之前,除了 Embarcadero 之外,没有人可以肯定地回答这个问题。
任何体面的 x64 编译器很可能会使用 SSE2 指令集作为基线,因此尝试使用 SSE 功能进行尽可能多的浮点计算,从而最大限度地减少 x87 FPU 的使用。但是,也应该说,没有技术原因会阻止在 x64 应用程序代码中使用 x87 FPU(尽管相反的谣言已经存在了一段时间;如果您想了解更多关于这一点的信息,请看看Agner Fog 的 Calling Convention Manual,特别是第 6.1 章“可以在 64 位 Windows 中使用浮点寄存器吗?”)。
编辑 1:Delphi XE2 Win64 确实不支持开箱即用的 80 位浮点计算(请参见此处的讨论(尽管它允许读取/写入此类值)。可以使用记录 + 类运算符,就像在此 TExtendedX87 类型中所做的那样 (尽管有一些注意事项)。
对于 double=extended 位:
阅读 ALlen Bauer 的 Twitter 帐户 Kylix_rd:
事后看来,因为虽然 SSE2 regs 是 128 位,但它们被用作两个 64 位双精度数。
在 Embarcadero 实际发布之前,我们无法确定 64 位 Delphi 编译器将如何实现浮点运算。在此之前的任何事情都只是猜测。但是一旦我们确定了,再做任何事情都为时已晚。
Allen Bauer 的推文似乎确实表明他们将使用 SSE2,并且扩展类型可能会减少到 64 位而不是 80 位。我认为这是一个坏主意,原因有很多。我已经在 QualityCentral 报告中写下了我的想法,Extended 应该在 64 位平台上保持 80 位类型
如果您不希望您的代码在迁移到 64 位 Delphi 时从 80 位精度下降到 64 位精度,请单击 QualityCentral 链接并为我的报告投票。选票越多,Embarcadero 就越有可能倾听。如果他们确实将 SSE2 用于 64 位浮点,这是有道理的,那么使用 FPU 添加 80 位浮点对于 Embarcadero 来说将是额外的工作。我怀疑他们会做这项工作,除非很多开发人员要求这样做。
如果您真的需要它,那么您可以使用 Philipp M. Schlüter 的TExtendedX87单元( SO上的 PhiS ),如本 Embarcadero 论坛帖子中所述。
@PhiS:当你用我的信息更新你的答案时,我会删除我的。