.NET中的单精度数学运算?

时间:2009-08-18 09:41:58

标签: .net math mathematical-optimization

.NET框架的Math函数主要在双精度浮点数上运行,没有单精度(浮点)重载。在高性能方案中处理单精度数据时,这会导致不必要的转换,并且计算的功能比所需的更精确,因此性能会受到一定程度的影响。

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

这个问题部分受到关于优化sigmoid函数的问题的启发:

Math optimization in C#

2 个答案:

答案 0 :(得分:3)

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

[编辑:本段是为什么你没有看到float参数的重载的评论。]一个问题是CLI评估堆栈(根据ECMA-335)不区分floatdouble类型。有效的实现可以将所有视为数学运算的double,但我认为CLR(Microsoft的CLI实现)可以在单精度算术中执行优化。

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

答案 1 :(得分:1)

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

从CenterSpace Software查看this数学库。