【发布时间】:2020-02-09 11:30:33
【问题描述】:
我正在尝试使用 System.Numerics 来处理多个数组元素。 有没有更快的方法将结果向量 (accVector) 的元素相乘? 目前 accVector 需要转换为使用 LINQ 将元素相乘的数组。
private double VectorMultiplication(double[] array)
{
int vectorSize = Vector<double>.Count;
var accVector = Vector<double>.One;
int i;
for (i = 0; i <= array.Length - vectorSize; i += vectorSize)
{
var v = new Vector<double>(array, i);
accVector = Vector.Multiply(accVector, v);
}
var tempArray = new double[Vector<double>.Count];
accVector.CopyTo(tempArray);
var result = tempArray.Aggregate(1d, (p, d) => p * d);
for (; i < array.Length; i++)
{
result *= array[i];
}
return result;
}
【问题讨论】:
-
在最后一个 for 循环中
i从array.Length开始,因为您没有将i重置为零。你能解释一下这些乘法背后的逻辑吗? -
您通常希望 CPU 执行的操作是随机播放和垂直 SIMD 相乘,直到您减少到 1 个标量结果。与水平总和相同,但使用 mul 而不是 add:Fastest way to do horizontal float vector sum on x86。 IDK 如果 C# 甚至可以作为第一步从 256 缩小到 128,但 log2(N) shuffle / mul 步骤通常是您理想的结果,而不是 store -> N-1 标量乘法,尤其是没有一个 long依赖链。
标签: c# simd system.numerics