double[]我编写了一个函数来使用 SIMD 将数组的所有元素相加(System.Numerics.Vector,性能比 na\xc3\xafve 方法差。
在我的电脑上Vector<double>.Count是 4,这意味着我可以创建一个包含 4 个值的累加器,并运行数组,按组将元素相加。
例如,一个 10 元素数组,带有 4 元素累加器和 2 个剩余元素,我会得到
\n// | loop | remainder\nacc[0] = vector[0] + vector[4] + vector[8]\nacc[1] = vector[1] + vector[5] + vector[9]\nacc[2] = vector[2] + vector[6] \nacc[3] = vector[3] + vector[7] \nRun Code Online (Sandbox Code Playgroud)\n和结果sum = acc[0]+acc[1]+acc[2]+acc[3]
下面的代码产生了正确的结果,但与仅将值相加的循环相比,速度不高
\npublic static double SumSimd(this Span<double> a)\n{\n var n = System.Numerics.Vector<double>.Count;\n var count = a.Length;\n // divide array into n=4 element groups\n …Run Code Online (Sandbox Code Playgroud)