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

6
.NET框架的Math函数大部分都是基于双精度浮点数运算,没有单精度(float)重载。在高性能场景下使用单精度数据时,这会导致不必要的强制转换,并且计算函数的精度比所需的更高,从而影响性能。是否有任何方法可以避免一些额外的CPU开销?例如,是否有一个开源的数学库,具有直接调用底层FPU指令的float重载?(我的理解是,这需要CLR的支持)。实际上,我不确定现代CPU是否甚至具有单精度指令。这个问题部分地启发了这个有关优化sigmoid函数的问题:Math optimization in C#
2个回答

3
据我所知,.NET Framework没有包含直接访问数学内在函数的API。Mono库确实包括内在函数的工作支持,但我不确定它们的状态如何。
[编辑:这段文字是关于为什么您看不到float参数重载的评论。]一个问题是CLI评估堆栈(每个ECMA-335)不区分floatdouble类型。有效的实现可以将所有内容都视为用于数学运算的double,但我想CLR(Microsoft对CLI的实现)会执行单精度算术的优化。
我认为有点不幸的是,内在函数的问题(特别是SIMD扩展)还没有在发布的产品中得到解决。我的外行猜测是,在.NET Framework发布周期的这个时候,支持内在函数需要对VM进行重大修改,这会带来无法接受的风险。垃圾收集器(以及我认为异常处理机制)与寄存器分配器紧密耦合,并且支持内在函数会向该领域添加一个根本性的新变量。

当你提到内置函数时,这是否与外部函数相同? - 这是数学函数的实现方式,而不是语言中定义的内置函数。据我所知,CLR可以轻松扩展以实现例如public static extern double Sin(float a)的版本,除了双精度版本。 - redcalx
1
你是在说要用本机代码实现吗?这样做对于一个单浮点数操作的P/Invoke开销将完全抵消试图避免使用Sin(double)的性能影响。内部函数声明为"extern",但不是P/Invoke - 它们的本机代码由JIT本身处理,以使它们尽可能高效。 - Sam Harwell
也许如果你的算法可以使单个P/Invoke执行多个浮点运算,那么可能会获得一些性能提升。 - Fantius

1

是的,我们构建了一个高性能的前向缩放数学库,如果您只需要使用单精度浮点计算,它可以本地使用。而且,如果实现正确,它们可以比使用双精度更快。

请查看CenterSpace Software的this数学库。

保罗


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接