[英]Summation of double using the processor's floating-point instruction set
在装有Intel Core-i5的Windows计算机上,我想编写ac#程序,该程序以最快的速度求和一个double数组,这实际上意味着使用内置FPU的指令集。
double[] arr = new double[] { 1.123, 2.234, 3.1234, .... };
处理器具有一个内置命令,该命令可以用一个命令汇总整个内存阵列(“向量”)。 C#中有没有办法使用此内置机器命令执行求和? (我的意思是,除了编写不受管理的汇编代码外)
编辑:还是有一个库调用将执行此操作?
不能。您不能直接使用C#中的SSE / AVX / ...指令。 您可以编写一些C ++代码并PInvoke,但是PInvoke的成本可能会消除使用这些指令的所有好处。
从技术上讲,您可以做不好的事情,并从C#调用这些指令(请参阅https://stackoverflow.com/a/29646856/613130 ),但是它们是很慢的事情 ,因此您可能不会很快获得任何东西。
是的,有几种方法可以做到这一点
double sum = arr.Sum();
它使用Linq对数组求和。 这是最简单的方法,但不是最快的方法。 您询问了可以执行此操作的库调用,HPCsharp就是这样的库:nuget.org上提供了nuget软件包。 最快的实现是
double sum = arr.SumSsePar();
它使用SIMD / SSE指令从每个内核中获得最佳性能,并使用多个内核从处理器中获得最高性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.