Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
        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]++;
                }
            }
        }