在使用Intel Core-i5的Windows机器上,我想编写一个ac#程序,它以最高可能速度对一个double数组求和,这实际上意味着使用指令集内置FPU。
double[] arr = new double[] { 1.123, 2.234, 3.1234, .... };
处理器有一个内置命令,可以用一个命令汇总整个存储器阵列(“向量”)。 C#中有没有办法用这个内置的机器命令执行求和?(我的意思是,除了编写非托管汇编代码)
编辑:或者是否有图书馆电话会这样做?
答案 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指令从每个内核中获得最佳性能,并使用多个内核从处理器中获得最高性能。