public static void AddFloat32_GetGradients(Tensor[] gradients, Tensor s, Tensor[] tensors) { for (int j = 0; j < gradients.Length; j++) { Tensor gradient = gradients[j]; //gradient.SetValue(0); long go = s.Shape.TotalSize / gradient.Shape.TotalSize * gradient.Shape.TotalSize; for (long i = 0; i < go; i += gradient.Shape.TotalSize) { if (go == 0) { VectorizationFloat.ElementWiseAssignAVX((float *)gradient.Base.Array, (float *)s.Base.Array + i, gradient.Shape.TotalSize); } else { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + i, (float *)gradient.Base.Array, (float *)gradient.Base.Array, gradient.Shape.TotalSize); } } if (go < s.Shape.TotalSize) { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + go, (float *)gradient.Base.Array, (float *)gradient.Base.Array, s.Shape.TotalSize - go); } } }
public unsafe void SetValue(float[,,] n) { for (int i = 0; i < this.Shape.N; i++) if (this.Shape[i] != n.GetLength(i)) { throw new Exception("The Matrix should have the same dimensions with the Variable!"); } fixed(float *ptr = n) { VectorizationFloat.ElementWiseAssignAVX((float *)this.Weights.Array, ptr, this.Shape.TotalSize); } }
public void Assigning() { int Size = 123; float[] v1 = new float[Size]; float[] v2 = new float[Size]; for (int i = 0; i < v1.Length; i++) { v1[i] = i; } VectorizationFloat.ElementWiseAssignAVX(v2, v1, v1.Length); Assert.IsTrue(ArrayEqual(v1, v2)); }
public static Tensor[] AddFloat32_GetGradients(Tensor s, Tensor[] tensors, bool generateseperately = false) { Tensor[] gradients = new Tensor[tensors.Length]; Dictionary <long, Tensor> dict = new Dictionary <long, Tensor>(); dict[s.Shape.TotalSize] = s; for (int j = 0; j < gradients.Length; j++) { Tensor a = tensors[j]; if (!generateseperately && dict.ContainsKey(a.Shape.TotalSize)) { gradients[j] = dict[a.Shape.TotalSize]; } else { Tensor gradient = new Tensor(a.Shape.Clone(), TensorConfig.Host_Float32); //gradient.SetValue(0); long go = s.Shape.TotalSize / gradient.Shape.TotalSize * gradient.Shape.TotalSize; for (long i = 0; i < go; i += gradient.Shape.TotalSize) { if (go == 0) { VectorizationFloat.ElementWiseAssignAVX((float *)gradient.Base.Array, (float *)s.Base.Array + i, gradient.Shape.TotalSize); } else { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + i, (float *)gradient.Base.Array, (float *)gradient.Base.Array, gradient.Shape.TotalSize); } } if (go < s.Shape.TotalSize) { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + go, (float *)gradient.Base.Array, (float *)gradient.Base.Array, s.Shape.TotalSize - go); } } } return(gradients); }
public static void SubtractFloat32_GetGradientA(Tensor gradienta, Tensor s, Tensor a) { long go = s.Shape.TotalSize / gradienta.Shape.TotalSize * gradienta.Shape.TotalSize; for (long i = 0; i < go; i += gradienta.Shape.TotalSize) { if (i == 0) { VectorizationFloat.ElementWiseAssignAVX((float *)gradienta.Base.Array, (float *)s.Base.Array + i, gradienta.Shape.TotalSize); } else { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + i, (float *)gradienta.Base.Array, (float *)gradienta.Base.Array, gradienta.Shape.TotalSize); } } if (go < s.Shape.TotalSize) { VectorizationFloat.ElementWiseAddAVX((float *)s.Base.Array + go, (float *)gradienta.Base.Array, (float *)gradienta.Base.Array, s.Shape.TotalSize - go); } }
public static void ExpandFloat32(Tensor res, Tensor v, Shape thisShape, Shape term0, Shape Multiplier) { float *ptrres = (float *)res.Base.Array; float *ptrv = (float *)v.Base.Array; if (Multiplier.N == 2 && Multiplier[1] == 1) { for (int i = 0; i < Multiplier[0]; i++) { float *me = ((float *)res.Base.Array) + i * term0.TotalSize; VectorizationFloat.ElementWiseAssignAVX(me, (float *)v.Base.Array, term0.TotalSize); } } else { Index iterator = new Index(res.Shape); for (int i = 0; i < iterator.N; i++) { iterator.Indices[i] = 0; } for (int h = 0; h < res.Shape.TotalSize; h++) { long indexs = 0; for (int i = iterator.N - 1; i >= 0; i--) { if (iterator.Indices[i] == res.Shape[i]) { iterator.Indices[i] = 0; iterator.Indices[i - 1]++; } indexs += (iterator.Indices[i] / Multiplier[i]) * v.Shape.Multiplied[i + 1]; } ptrres[h] = ptrv[indexs]; iterator.Indices[iterator.N - 1]++; } } }