public static class BatchOperationsVector {
public const int BATCHSIZE = 64;
private static readonly int STRIDE = Vector<double>.Count;
public static void Load(double[] a, double[] b) {
Array.Copy(b, a, BATCHSIZE);
}
public static void Add(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var va = new Vector<double>(a, i);
var vb = new Vector<double>(b, i);
(va + vb).CopyTo(a, i);
}
}
public static void Sub(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var va = new Vector<double>(a, i);
var vb = new Vector<double>(b, i);
(va - vb).CopyTo(a, i);
}
}
public static void Div(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var va = new Vector<double>(a, i);
var vb = new Vector<double>(b, i);
(va / vb).CopyTo(a, i);
}
}
public static void Mul(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var va = new Vector<double>(a, i);
var vb = new Vector<double>(b, i);
(va * vb).CopyTo(a, i);
}
}
public static void Neg(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var vb = new Vector<double>(b, i);
Vector.Negate(vb).CopyTo(a, i);
}
}
public static void Inv(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; i += STRIDE) {
var vb = new Vector<double>(b, i);
(Vector<double>.One / vb).CopyTo(a, i);
}
}
public static void Log(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; ++i)
a[i] = Math.Log(b[i]);
}
public static void Exp(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; ++i)
a[i] = Math.Exp(b[i]);
}
public static void Sin(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; ++i)
a[i] = Math.Sin(b[i]);
}
public static void Cos(double[] a, double[] b) {
for (int i = 0; i < BATCHSIZE; ++i)
a[i] = Math.Cos(b[i]);
}
}
Comments