bogdb icon

Untitled

bogdb | PRO | 11/07/18 08:41:57 PM UTC | 0 ⭐ | 546 👁️ | Never ⏰ | []
C# |

2.16 KB

|

None

|

0 👍

/

0 👎

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