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/29638730/

相关文章:

c# - 属性,只是元数据还是需要的?

c# - 有关如何链接、编译等以及它们如何组合在一起的书籍?

.net - 来自 Windows 批处理脚本的文件/文件夹选择器对话框

java - 设置/返回数组的首选方式

c# - Gridview 不保留 c# 和 ASP.Net 中的旧值

c# - 在调试中禁用应用程序洞察

.net - 使用 Fluent Validation Library for .Net 验证单个属性

.net - 分层架构中的 ASP.NET 和 Entity Framework - 仅将 Entity Framework 用于 ORM

java - 确定点的象限

css - 合并两个 css 文件会提高网页性能吗?