c# - 如何在 C# 中处理非规范化 float ?

标签 c# .net performance intel sse

只需阅读此 fascinating article关于使用非规范化 float (非常接近 0 的 float )的 Intel CPU 可能会导致 20x-200x 的减速。

SSE 有一个选项可以将它们四舍五入为 0,从而在遇到此类浮点值时恢复性能。

C# 应用程序如何处理这个问题?是否有启用/禁用 _MM_FLUSH_ZERO 的选项?

最佳答案

没有这样的选项。

C# 应用程序中的 FPU 控制字在启动时由 CLR 初始化。更改它不是框架提供的选项。即使您尝试通过调用 _control87_2() 来更改它那么它不会持续很长时间;任何异常都会导致控制字被 CLR 内部的异常处理实现再次重置。这是为了处理 FPU 控制字的另一个方面而编写的,它允许揭露浮点异常。这也将对任何其他不希望全局状态像这样更改的托管代码不利。

当您在虚拟机中运行代码时,无法直接控制硬件是一种隐含的限制。也不是说这在 native 代码中很容易做到,当库也期望 FPU 具有默认初始化时,它们往往会行为不端。特别是异常屏蔽标志的问题,用 Borland 工具创建的 DLL 有打开异常的诀窍,使其他不是为处理此类异常而编写的代码失败。一个极难解决的问题,FPU 控制字是您能想象到的最糟糕的全局变量。

这确实给你带来了负担,不要让你的浮点计算像这样乱七八糟。使用非正规化计算几乎总是会产生无意义的结果,如果不是从极小的值开始,那么至少从快速丢失有效数字开始。将小于 2.2E-308 的值截断为 0 由您决定。是的,不太实用。也许一个程序交付无意义的结果比正常情况慢一点是可以的:)

关于c# - 如何在 C# 中处理非规范化 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915543/

相关文章:

c# - Windows XP下Visual Studio 2013远程调试过程

C# Entity Framework SaveChanges() 不工作

Java 在效率方面等同于 C# 的 Action Type。 Java 8 还是 Pre-Java 8?

c# - 项目引用解决方案 .net 4.5 和 .net 3.5

.net - CPU架构独立的P/Invoke : Can the DllName or path be "dynamic"?

asp.net - 具有 2.0 应用程序池的子应用程序在具有 4.0 应用程序池的站点下运行

java - Grails 应用程序速度非常慢

javascript - socket.io 自定义事件的确认

performance - Git - 在克隆之前/之后过滤

.net - 如何管理多个 Cdn 文件及其 CdnFallBackExpression?