使用处理器的浮点指令集求和

时间:2015-04-30 16:05:49

标签: c#

在使用Intel Core-i5的Windows机器上,我想编写一个ac#程序,它以最高可能速度对一个double数组求和,这实际上意味着使用指令集内置FPU。

double[] arr = new double[] { 1.123, 2.234, 3.1234, .... };

处理器有一个内置命令,可以用一个命令汇总整个存储器阵列(“向量”)。 C#中有没有办法用这个内置的机器命令执行求和?(我的意思是,除了编写非托管汇编代码)

编辑:或者是否有图书馆电话会这样做?

2 个答案:

答案 0 :(得分:0)

没有。您无法在C#中直接使用SSE / AVX / ...指令。你可以写一些C ++代码并PInvoke它,但可能PInvoke成本会消除使用这些指令的所有好处。

从技术上讲,您可以执行不良内容并从C#调用这些说明(请参阅https://stackoverflow.com/a/29646856/613130),但它们错误事情,所以你不可能快速获得任何东西。

答案 1 :(得分:0)

是的,有几种方法可以做到这一点

double sum = arr.Sum();

使用Linq对数组求和。这是最简单的方法,但不是最快的方法。您询问了可以执行此操作的库调用,HPCsharp就是这样的库:nuget.org上提供了nuget软件包。最快的实现是

double sum = arr.SumSsePar();

使用SIMD / SSE指令从每个内核中获得最佳性能,并使用多个内核从处理器中获得最高性能。