【问题标题】:Single Precision Math Operations in .NET?.NET 中的单精度数学运算?
【发布时间】:2010-11-20 13:02:01
【问题描述】:

.NET 框架的数学函数主要在双精度浮点数上运行,没有单精度 (float) 重载。在高性能场景中处理单精度数据时,这会导致不必要的强制转换,并且计算的函数的精度也高于所需的精度,因此在一定程度上会影响性能。

有什么办法可以避免这种额外的 CPU 开销?例如。是否有一个带有浮点重载的开源数学库,可以直接调用底层 FPU 指令? (我的理解是这需要 CLR 的支持)。实际上我不确定现代 CPU 是否有单精度指令。

这个问题的部分灵感来自这个关于优化 sigmoid 函数的问题:

Math optimization in C#

【问题讨论】:

    标签: .net math mathematical-optimization


    【解决方案1】:

    据我所知,.NET Framework 不包含可直接访问数学内在函数的 API。 Mono 库确实包括对内在函数的工作支持,但我不确定它们的状态。

    [编辑:本段是关于为什么您看不到 float 参数过载的评论。] 一个问题是 CLI 评估堆栈(根据 ECMA-335)无法区分 floatdouble类型。一个有效的实现可以将 everything 视为数学运算的double,但我认为 CLR(Microsoft 的 CLI 实现)会尽可能地对单精度算术进行优化。

    我认为内在函数(特别是 SIMD 扩展)的问题尚未[在已发布的产品中] 得到解决,这有点令人遗憾。我的局外人猜测是,对内在函数的支持需要对 VM 进行重大更改,这在 .NET Framework 发布周期的此时会造成不可接受的风险。垃圾收集器(我认为是异常处理机制)与寄存器分配器紧密耦合,支持内在函数为该区域添加了一个全新的变量。

    【讨论】:

    • 当您提到内部函数时,这与外部函数相同吗? - 这就是数学函数的实现方式,而不是语言中定义的内在函数。 AFAIK CLR 可以很容易地扩展以实现例如public static extern double Sin(float a) 除了双精度版本。
    • 你说的是用原生代码实现它吗?为单个浮点操作执行此操作的 P/Invoke 开销将完全抵消尝试避免使用 Sin(double) 对性能的影响。内部函数声明为 extern,但不是 P/Invoke - 它们的本机代码由 JIT 本身在内部处理,以使其尽可能高效。
    • 因此,如果您的算法能够使单个 P/Invoke 执行许多浮点操作,那么也许可以获得一些性能。
    【解决方案2】:

    是的,我们构建了一个高性能的前向缩放数学库,如果您只需要它,它就可以在本地使用单精度浮点计算。你是对的,如果实施得当,它们可以比使用双精度时快得多。

    查看 CenterSpace Software 的 this 数学库。

    保罗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2020-04-29
      • 1970-01-01
      • 2016-11-06
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多