public static class BatchOperationsVector { public const int BATCHSIZE = 64; private static readonly int STRIDE = Vector.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(a, i); var vb = new Vector(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(a, i); var vb = new Vector(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(a, i); var vb = new Vector(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(a, i); var vb = new Vector(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(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(b, i); (Vector.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]); } }