小编JAl*_*lex的帖子

使用 SIMD (System.Numerics) 编写向量和函数并使其比 for 循环更快

double[]我编写了一个函数来使用 SIMD 将数组的所有元素相加(System.Numerics.Vector,性能比 na\xc3\xafve 方法差。

\n

在我的电脑上Vector<double>.Count是 4,这意味着我可以创建一个包含 4 个值的累加器,并运行数组,按组将元素相加。

\n

例如,一个 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] \n
Run Code Online (Sandbox Code Playgroud)\n

和结果sum = acc[0]+acc[1]+acc[2]+acc[3]

\n

下面的代码产生了正确的结果,但与仅将值相加的循环相比,速度不高

\n
public 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)

c# arrays performance simd avx

5
推荐指数
2
解决办法
2734
查看次数

标签 统计

arrays ×1

avx ×1

c# ×1

performance ×1

simd ×1