.NET 框架的数学函数主要在双精度浮点数上运行,没有单精度(浮点数)重载。在高性能场景中处理单精度数据时,这会导致不必要的强制转换,并且计算精度高于所需精度的函数,因此在一定程度上会影响性能。
有什么办法可以避免这种额外的 CPU 开销?例如,是否有一个带有浮点重载的开源数学库,可以直接调用底层 FPU 指令?(我的理解是这需要 CLR 的支持)。实际上我不确定现代 CPU 是否有单精度指令。
这个问题的部分灵感来自这个关于优化 sigmoid 函数的问题:
.NET 框架的数学函数主要在双精度浮点数上运行,没有单精度(浮点数)重载。在高性能场景中处理单精度数据时,这会导致不必要的强制转换,并且计算精度高于所需精度的函数,因此在一定程度上会影响性能。
有什么办法可以避免这种额外的 CPU 开销?例如,是否有一个带有浮点重载的开源数学库,可以直接调用底层 FPU 指令?(我的理解是这需要 CLR 的支持)。实际上我不确定现代 CPU 是否有单精度指令。
这个问题的部分灵感来自这个关于优化 sigmoid 函数的问题:
据我所知,.NET Framework 不包含直接访问数学内在函数的 API。Mono 库确实包括对内在函数的工作支持,但我不确定它们的状态。
[编辑:本段是关于为什么您看不到float
参数重载的评论。] 一个问题是 CLI 评估堆栈(根据 ECMA-335)不区分float
和double
类型。一个有效的实现可以将所有东西都视为double
数学运算,但我想 CLR(微软的 CLI 实现)会尽可能地对单精度算术进行优化。
我认为内在函数(特别是 SIMD 扩展)的问题还没有得到解决(在已发布的产品中),这有点令人遗憾。我的局外人猜测是,对内在函数的支持需要对 VM 进行重大更改,这在 .NET Framework 发布周期的这一点上会带来不可接受的风险。垃圾收集器(我认为是异常处理机制)与寄存器分配器紧密耦合,并且支持内在函数为该区域添加了一个全新的变量。
是的,我们构建了一个高性能的前向缩放数学库,如果这就是您所需要的,它本身就使用单精度浮点计算。你是对的,如果实施得当,它们可以比使用双精度时快得多。
从 CenterSpace Software查看这个数学库。
保罗