我们现在想做一些简单的批量运算,比如累乘得积,累加求和
public class NormalCalc
{
public static double Multiply(double[] nums)
{
double result = 1.0d;
for (int i = 0; i < nums.Length; i++)
{
result *= nums[i];
}
return result;
}
public static double AddTotal(double[] nums)
{
double result = 0.0d;
for (int i = 0; i < nums.Length; i++)
{
result += nums[i];
}
return result;
}
}
这种批量运算不正是指令集的优势么,那就试试吧
C#中可以使用Vector类来做宽位运算,我这里有avx2指令集,也就是256位,double是64位的,那就有4个,如果做int运算自然就有8个
在这里就是4个4个放到一个Vector里一起做乘法运算,最后把4拷贝到数组中互乘,再把多余的乘完就好了,乘法嘛,用1作为种子
public unsafe static double Multiply(double[] nums)
{
int vectorSize = Vector<double>.Count;
var accVector = Vector<double>.One;
int i;
var array = nums;
double result = 1.0d;
fixed (double* p = array)
{
for (i = 0; i <= array.Length - vectorSize; i += vectorSize)
{
//var v = new Vector<double>(array, i);
var v = Unsafe.Read<Vector<double>>(p + i);
accVector = Vector.Multiply(accVector, v);
}
}
var tempArray = new double[Vector<double>.Count];
accVector.CopyTo(tempArray);
for (int j = 0; j < tempArray.Length; j++)
{
result = result * tempArray[j]