c# - 计算平方根和幂的快速方法?

标签 c# math exponent

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 支持:

[Mono: Release Note Mono 2.2]

最近在这里提出了从 MS C# 调用 Mono 的 SIMD 支持的可能性:

[Calling mono c# code from Microsoft .net ? -- Stackoverflow]

一个较早的问题也解决了(虽然没有表现出太多爱意!)如何安装 Mono 的 SIMD 支持:

[how to enable Mono.Simd -- Stackoverflow]

关于c# - 计算平方根和幂的快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5345552/

相关文章:

c# - 如何在我的 XAML 代码中设置默认的 ComboBox 选择?

c# - 后台 worker 从不同的类更新(最好通过事件)

algorithm - 快速计算幂(例如 2^11)

python - 我的素数程序中的指数抛出内存错误,我该如何解决?

c# - log4net 按 threadcontext 属性过滤(.NET Core)

javascript - 拖放 - JQuery 插件

algorithm - 为什么我的数字在 Collat​​z 序列中只停留在 2?

c++ - 轨道相机(C++,GLM)

c++ - 如何在 c++ 中对 double 或 float 的尾数和指数部分进行(快速)操作?

c# - 使用Web API和javascript在asp.net中将excel文件从服务器下载到本地计算机