C# 的 Math 类仅以 double 计算根和幂。如果我将基于 float 的平方根和幂函数添加到我的 Math2 类中,各种事情可能会更快一些(今天是放松的一天,我发现优化很放松)。
所以 - 快速平方根和幂函数,我不必担心许可问题,请问。或将我带到那里的链接。
最佳答案
我认为任何软件方法都无法与硬件指令竞争平方根,这是不言而喻的。唯一的困难是 .NET 不能像 C 代码的内联汇编器时代那样让我们直接控制硬件。
让我们首先讨论一个通用的 x86 硬件前景。
浮点 x86 指令 FSQRT 确实具有三种精度:单精度、 double 和扩展精度(80 位 FP 寄存器的 native 精度),并且单精度与 double 的时序缩短了 25-40% .参见 here用于 32 位 x86 指令。
这听起来像是一个巨大的机会,但只有十几个时钟。除非您能够仔细管理从函数调用到返回值的代码,否则这种节约很容易在开销中丢失。托管 C++ 听起来(正如 Marcelo Cantos 所建议的那样)是比 C# 更实用的基础。
注意:FSQRT 的时序与 FDIV 的时序相同,在英特尔架构中与 FDIV 共享一个执行单元,因此具有共同的延迟。
在 SSE SIMD 指令的方向上可能存在用于专用 C# 代码的更好机会,其中硬件允许并行完成最多 4 个单精度平方根。 JIT 编译器对此的支持已经缺失多年,但这里有一些当前开发的线索。
英特尔已经介入(2010 年 12 月 15 日),看到 .NET Framework 4 没有对 SIMD 做任何事情:
[Intel Performance Libraries allow... SIMD instructions in C#]
甚至在此之前,Mono 项目就在 Mono 2.2 中添加了对 SIMD 的 JIT 支持:
最近在这里提出了从 MS C# 调用 Mono 的 SIMD 支持的可能性:
[Calling mono c# code from Microsoft .net ? -- Stackoverflow]
一个较早的问题也解决了(虽然没有表现出太多爱意!)如何安装 Mono 的 SIMD 支持:
关于c# - 计算平方根和幂的快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5345552/