Exemplo n.º 1
0
        public static void ConvolutionBackwardFilter(DNNConvolutionBwdFilterAlgo algo, Cpu.ConvolutionDesc2d cd, CudaStorage workspace, Tensor x, Tensor dy, Tensor dw)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
            {
                var convDesc = GetConvDescriptor(cd, x.ElementType);

                using (var workspacePtr = new CudaDeviceVariable <byte>(workspace.DevicePtrAtElement(0), false, workspace.ByteLength))
                    using (var xPtr = GetDeviceVar(x))
                        using (var dyPtr = GetDeviceVar(dy))
                            using (var dwPtr = GetDeviceVar(dw))
                                using (var xDesc = GetDescriptor(x))
                                    using (var dyDesc = GetDescriptor(dy))
                                        using (var dwDesc = GetFilterDescriptor(dw))
                                        {
                                            dnn.Value.ConvolutionBackwardFilter(1,
                                                                                xDesc, xPtr,
                                                                                dyDesc, dyPtr,
                                                                                convDesc,
                                                                                (cudnnConvolutionBwdFilterAlgo)algo,
                                                                                workspacePtr,
                                                                                0,
                                                                                dwDesc, dwPtr);
                                        }
            }
        }
Exemplo n.º 2
0
        public static void PoolingBackward(DNNPoolingDesc desc, Tensor x, Tensor y, Tensor dx, Tensor dy)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
            {
                var poolingDesc = new PoolingDescriptor();
                poolingDesc.SetPoolingNdDescriptor((cudnnPoolingMode)desc.Mode, cudnnNanPropagation.PropagateNan, desc.WindowDims.Length,
                                                   desc.WindowDims, desc.Padding, desc.Strides);

                using (var xPtr = GetDeviceVar(x))
                    using (var yPtr = GetDeviceVar(y))
                        using (var dxPtr = GetDeviceVar(dx))
                            using (var dyPtr = GetDeviceVar(dy))
                                using (var xDesc = GetDescriptor(x))
                                    using (var yDesc = GetDescriptor(y))
                                        using (var dxDesc = GetDescriptor(dx))
                                            using (var dyDesc = GetDescriptor(dy))
                                            {
                                                // Note: ManagedCUDA argument names may be slightly misleading (src refers to 'y' here, and dest to 'x')
                                                dnn.Value.PoolingBackward(poolingDesc, 1,
                                                                          yDesc, yPtr,
                                                                          dyDesc, dyPtr,
                                                                          xDesc, xPtr,
                                                                          0,
                                                                          dxDesc, dxPtr);
                                            }
            }
        }
Exemplo n.º 3
0
        public static void ActivationBackward(Tensor x, Tensor y, Tensor dx, Tensor dy, DNNActivation activationType, double clippedReluCeiling)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
            {
                var activationDesc = new ActivationDescriptor();
                activationDesc.SetActivationDescriptor((cudnnActivationMode)activationType,
                                                       cudnnNanPropagation.PropagateNan,
                                                       clippedReluCeiling);

                using (var xPtr = GetDeviceVar(x))
                    using (var yPtr = GetDeviceVar(y))
                        using (var dxPtr = GetDeviceVar(dx))
                            using (var dyPtr = GetDeviceVar(dy))
                                using (var xDesc = GetDescriptor(x))
                                    using (var yDesc = GetDescriptor(y))
                                        using (var dxDesc = GetDescriptor(dx))
                                            using (var dyDesc = GetDescriptor(dy))
                                            {
                                                dnn.Value.ActivationBackward(activationDesc, 1,
                                                                             xDesc, xPtr,
                                                                             dxDesc, dxPtr,
                                                                             yDesc, yPtr,
                                                                             0,
                                                                             dyDesc, dyPtr);
                                            }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Convs the forward.
        /// </summary>
        /// <param name="algo">The algo.</param>
        /// <param name="cd">The cd.</param>
        /// <param name="workspace">The workspace.</param>
        /// <param name="x">The x.</param>
        /// <param name="w">The w.</param>
        /// <param name="y">The y.</param>
        public static void ConvForward(DNNConvolutionFwdAlgo algo, Cpu.ConvolutionDesc2d cd, CudaStorage workspace, NDArray x, NDArray w, NDArray y)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
            {
                var convDesc = GetConvDescriptor(cd, x.ElementType);

                using (var workspacePtr = new CudaDeviceVariable <byte>(workspace.DevicePtrAtElement(0), false, workspace.ByteLength))
                    using (var xPtr = GetDeviceVar(x))
                        using (var wPtr = GetDeviceVar(w))
                            using (var yPtr = GetDeviceVar(y))
                                using (var xDesc = GetDescriptor(x))
                                    using (var wDesc = GetFilterDescriptor(w))
                                        using (var yDesc = GetDescriptor(y))
                                        {
                                            dnn.Value.ConvolutionForward(1,
                                                                         xDesc, xPtr,
                                                                         wDesc, wPtr,
                                                                         convDesc,
                                                                         (cudnnConvolutionFwdAlgo)algo,
                                                                         workspacePtr,
                                                                         0,
                                                                         yDesc, yPtr);
                                        }
            }
        }
Exemplo n.º 5
0
        public Tensor AddmmBatch(Tensor result, float beta, Tensor src, float alpha, Tensor m1, Tensor m2)
        {
            TSCudaContext context = CudaHelpers.TSContextForTensor(src);

            if (src.ElementType != m1.ElementType || src.ElementType != m2.ElementType || (result != null && result.ElementType != src.ElementType))
            {
                throw new InvalidOperationException("All tensors must have the same element type");
            }

            if (result != null && !(result.Storage is CudaStorage))
            {
                throw new ArgumentException("result must be a CUDA tensor", "result");
            }

            if (!(m1.Storage is CudaStorage))
            {
                throw new ArgumentException("m1 must be a CUDA tensor", "m1");
            }

            if (!(m2.Storage is CudaStorage))
            {
                throw new ArgumentException("m2 must be a CUDA tensor", "m2");
            }

            if (src.DimensionCount != 3)
            {
                throw new ArgumentException("src must be a matrix", "src");
            }

            if (m1.DimensionCount != 3)
            {
                throw new ArgumentException("m1 must be a matrix", "m1");
            }

            if (m2.DimensionCount != 3)
            {
                throw new ArgumentException("m2 must be a matrix", "m2");
            }

            if (src.Sizes[1] != m1.Sizes[1] || src.Sizes[2] != m2.Sizes[2] || m1.Sizes[2] != m2.Sizes[1])
            {
                throw new InvalidOperationException($"Size mismatch, srcSize0 = {src.Sizes[0]}, m1Size0 = {m1.Sizes[0]}, srcSize1 = {src.Sizes[1]}, m2Size1 = {m2.Sizes[1]}, m1Size1 = '{m1.Sizes[1]}', m2Size0 = '{m2.Sizes[0]}'");
            }

            Tensor writeTarget = TensorResultBuilder.GetWriteTarget(result, src, true, src.Sizes);

            if (writeTarget != src)
            {
                Ops.Copy(writeTarget, src);
            }

            CudaMatrixMulMM.GemmBatch(context, alpha, m1, m2, beta, writeTarget);


            return(writeTarget);
        }
Exemplo n.º 6
0
        public NDArray Addmm(NDArray result, float beta, NDArray src, float alpha, NDArray m1, NDArray m2)
        {
            var context = CudaHelpers.TSContextForTensor(src);

            if (src.ElementType != m1.ElementType || src.ElementType != m2.ElementType || (result != null && result.ElementType != src.ElementType))
            {
                throw new InvalidOperationException("All tensors must have the same element type");
            }
            if (result != null && !(result.Storage is CudaStorage))
            {
                throw new ArgumentException("result must be a CUDA tensor", "result");
            }
            if (!(m1.Storage is CudaStorage))
            {
                throw new ArgumentException("m1 must be a CUDA tensor", "m1");
            }
            if (!(m2.Storage is CudaStorage))
            {
                throw new ArgumentException("m2 must be a CUDA tensor", "m2");
            }

            if (src.DimensionCount != 2)
            {
                throw new ArgumentException("src must be a matrix", "src");
            }
            if (m1.DimensionCount != 2)
            {
                throw new ArgumentException("m1 must be a matrix", "m1");
            }
            if (m2.DimensionCount != 2)
            {
                throw new ArgumentException("m2 must be a matrix", "m2");
            }

            if (src.Shape[0] != m1.Shape[0] || src.Shape[1] != m2.Shape[1] || m1.Shape[1] != m2.Shape[0])
            {
                throw new InvalidOperationException("Size mismatch");
            }

            var writeTarget = TensorResultBuilder.GetWriteTarget(result, src, true, src.Shape);

            if (writeTarget != src)
            {
                Ops.Copy(writeTarget, src);
            }

            CudaMatrixMulMM.Gemm(context, alpha, m1, m2, beta, writeTarget);


            return(writeTarget);
        }
Exemplo n.º 7
0
 public static void ConvolutionBackwardBias(Cpu.ConvolutionDesc2d cd, Tensor dy, Tensor db)
 {
     using (var dnn = CudaHelpers.TSContextForTensor(dy).DNNForTensor(dy))
     {
         using (var dyPtr = GetDeviceVar(dy))
             using (var dbPtr = GetDeviceVar(db))
                 using (var dyDesc = GetDescriptor(dy))
                     using (var dbDesc = GetDescriptor(db))
                     {
                         dnn.Value.ConvolutionBackwardBias(1,
                                                           dyDesc, dyPtr,
                                                           0,
                                                           dbDesc, dbPtr);
                     }
     }
 }
Exemplo n.º 8
0
 public static void AddTensor(Tensor src, Tensor result)
 {
     using (var dnn = CudaHelpers.TSContextForTensor(src).DNNForTensor(src))
     {
         using (var srcPtr = GetDeviceVar(src))
             using (var resultPtr = GetDeviceVar(result))
                 using (var srcDesc = GetDescriptor(src))
                     using (var resultDesc = GetDescriptor(result))
                     {
                         dnn.Value.AddTensor(1,
                                             srcDesc, srcPtr,
                                             1,
                                             resultDesc, resultPtr);
                     }
     }
 }
Exemplo n.º 9
0
 public static void SoftmaxForward(DNNSoftmaxAlgorithm algorithm, DNNSoftmaxMode mode, Tensor x, Tensor y)
 {
     using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
     {
         using (var xPtr = GetDeviceVar(x))
             using (var yPtr = GetDeviceVar(y))
                 using (var xDesc = GetDescriptor(x))
                     using (var yDesc = GetDescriptor(y))
                     {
                         dnn.Value.SoftmaxForward((cudnnSoftmaxAlgorithm)algorithm, (cudnnSoftmaxMode)mode, 1,
                                                  xDesc, xPtr,
                                                  0,
                                                  yDesc, yPtr);
                     }
     }
 }
Exemplo n.º 10
0
 public static void SoftmaxBackward(DNNSoftmaxAlgorithm algorithm, DNNSoftmaxMode mode, Tensor y, Tensor dx, Tensor dy)
 {
     using (var dnn = CudaHelpers.TSContextForTensor(y).DNNForTensor(y))
     {
         using (var yPtr = GetDeviceVar(y))
             using (var dxPtr = GetDeviceVar(dx))
                 using (var dyPtr = GetDeviceVar(dy))
                     using (var yDesc = GetDescriptor(y))
                         using (var dxDesc = GetDescriptor(dx))
                             using (var dyDesc = GetDescriptor(dy))
                             {
                                 dnn.Value.SoftmaxBackward((cudnnSoftmaxAlgorithm)algorithm, (cudnnSoftmaxMode)mode, 1,
                                                           yDesc, yPtr,
                                                           dyDesc, dyPtr,
                                                           0,
                                                           dxDesc, dxPtr);
                             }
     }
 }
Exemplo n.º 11
0
        public static void PoolingForward(DNNPoolingDesc desc, Tensor x, Tensor y)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(x).DNNForTensor(x))
            {
                var poolingDesc = new PoolingDescriptor();
                poolingDesc.SetPoolingNdDescriptor((cudnnPoolingMode)desc.Mode, cudnnNanPropagation.PropagateNan, desc.WindowDims.Length,
                                                   desc.WindowDims, desc.Padding, desc.Strides);

                using (var xPtr = GetDeviceVar(x))
                    using (var yPtr = GetDeviceVar(y))
                        using (var xDesc = GetDescriptor(x))
                            using (var yDesc = GetDescriptor(y))
                            {
                                dnn.Value.PoolingForward(poolingDesc, 1,
                                                         xDesc, xPtr,
                                                         0,
                                                         yDesc, yPtr);
                            }
            }
        }
Exemplo n.º 12
0
        public Tensor Dot(Tensor result, Tensor lhs, Tensor rhs)
        {
            var context = CudaHelpers.TSContextForTensor(lhs);

            if (lhs.DimensionCount == 1 && rhs.DimensionCount == 1)
            {
                return(CudaMatrixMulDot.Dot(context, result, lhs, rhs));
            }
            else if (lhs.DimensionCount == 2 && rhs.DimensionCount == 1)
            {
                return(CudaMatrixMulMV.Mul_M_V(context, result, lhs, rhs));
            }
            else if (lhs.DimensionCount == 2 && rhs.DimensionCount == 2)
            {
                return(CudaMatrixMulMM.Mul_M_M(context, result, lhs, rhs));
            }
            else
            {
                throw new NotSupportedException(string.Format("Multiplication of {0}D with {1}D tensor is not supported"));
            }
        }
Exemplo n.º 13
0
        public NDArray Dot(NDArray result, NDArray lhs, NDArray rhs)
        {
            var context = CudaHelpers.TSContextForTensor(lhs);

            if (lhs.DimensionCount == 1 && rhs.DimensionCount == 1)
            {
                return(CudaMatrixMulDot.Dot(context, result, lhs, rhs));
            }
            else if (lhs.DimensionCount == 2 && (rhs.DimensionCount == 1 || rhs.PossibleVector))
            {
                return(CudaMatrixMulMV.Mul_M_V(context, result, lhs, rhs.Ravel()).Reshape(lhs.Shape[0], 1));
            }
            else if (lhs.DimensionCount == 2 && rhs.DimensionCount == 2)
            {
                return(CudaMatrixMulMM.Mul_M_M(context, result, lhs, rhs));
            }
            else
            {
                throw new NotSupportedException(string.Format("Multiplication of {0}D with {1}D tensor is not supported"));
            }
        }
Exemplo n.º 14
0
        /// <summary>
        /// Convolutions the backward data.
        /// </summary>
        /// <param name="algo">The algo.</param>
        /// <param name="cd">The cd.</param>
        /// <param name="workspace">The workspace.</param>
        /// <param name="w">The w.</param>
        /// <param name="dy">The dy.</param>
        /// <param name="dx">The dx.</param>
        public static void ConvolutionBackwardData(DNNConvolutionBwdDataAlgo algo, Cpu.ConvolutionDesc2d cd, CudaStorage workspace, NDArray w, NDArray dy, NDArray dx)
        {
            using (var dnn = CudaHelpers.TSContextForTensor(w).DNNForTensor(w))
            {
                var convDesc = GetConvDescriptor(cd, w.ElementType);

                using (var workspacePtr = new CudaDeviceVariable <byte>(workspace.DevicePtrAtElement(0), false, workspace.ByteLength))
                    using (var wPtr = GetDeviceVar(w))
                        using (var dxPtr = GetDeviceVar(dx))
                            using (var dyPtr = GetDeviceVar(dy))
                                using (var wDesc = GetFilterDescriptor(w))
                                    using (var dxDesc = GetDescriptor(dx))
                                        using (var dyDesc = GetDescriptor(dy))
                                        {
                                            dnn.Value.ConvolutionBackwardData(1,
                                                                              wDesc, wPtr,
                                                                              dyDesc, dyPtr,
                                                                              convDesc,
                                                                              (cudnnConvolutionBwdDataAlgo)algo,
                                                                              workspacePtr, 0f,
                                                                              dxDesc, dxPtr);
                                        }
            }
        }
Exemplo n.º 15
0
        public static Tensor Addmm(Tensor result, float beta, Tensor src, float alpha, Tensor m1, Tensor m2)
        {
            try
            {
                TSCudaContext context = CudaHelpers.TSContextForTensor(src);
                if (src.ElementType != m1.ElementType || src.ElementType != m2.ElementType || (result != null && result.ElementType != src.ElementType))
                {
                    throw new InvalidOperationException("All tensors must have the same element type");
                }

                if (result != null && !(result.Storage is CudaStorage))
                {
                    throw new ArgumentException("result must be a CUDA tensor", nameof(result));
                }

                if (!(m1.Storage is CudaStorage))
                {
                    throw new ArgumentException("m1 must be a CUDA tensor", nameof(m1));
                }

                if (!(m2.Storage is CudaStorage))
                {
                    throw new ArgumentException("m2 must be a CUDA tensor", nameof(m2));
                }

                if (src.DimensionCount != 2)
                {
                    throw new ArgumentException("src must be a matrix", nameof(src));
                }

                if (m1.DimensionCount != 2)
                {
                    throw new ArgumentException("m1 must be a matrix", nameof(m1));
                }

                if (m2.DimensionCount != 2)
                {
                    throw new ArgumentException("m2 must be a matrix", nameof(m2));
                }

                if (src.Sizes[0] != m1.Sizes[0] || src.Sizes[1] != m2.Sizes[1] || m1.Sizes[1] != m2.Sizes[0])
                {
                    throw new InvalidOperationException($"Size mismatch, srcSize0 = {src.Sizes[0]}, m1Size0 = {m1.Sizes[0]}, srcSize1 = {src.Sizes[1]}, m2Size1 = {m2.Sizes[1]}, m1Size1 = '{m1.Sizes[1]}', m2Size0 = '{m2.Sizes[0]}'");
                }

                Tensor writeTarget = TensorResultBuilder.GetWriteTarget(result, src, false, src.Sizes);

                if (writeTarget != src)
                {
                    Ops.Copy(writeTarget, src);
                }

                CudaMatrixMulMM.Gemm(context, alpha, m1, m2, beta, writeTarget);


                return(writeTarget);
            }
            catch (Exception err)
            {
                Logger.WriteLine($"Exception in Addmm: '{err.Message}'");
                Logger.WriteLine($"Call stack: '{err.StackTrace}'");

                throw;
            }
        }