public void Backward(CudnnPoolingDescriptor pooling, CudnnTensorDescriptor srcTensor, double[] srcData, CudnnTensorDescriptor srcDiffTensor, double[] srcDiffData,
                             CudnnTensorDescriptor destTensor, double[] destData, CudnnTensorDescriptor destDiffTensor, double[] destDiffData)
        {
            Contract.Requires(pooling != null);
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);
            Contract.Requires(srcDiffTensor != null);
            Contract.Requires(srcDiffData != null);
            Contract.Requires(destDiffTensor != null);
            Contract.Requires(destDiffData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, srcTensor, srcDiffTensor, destTensor, destDiffTensor);

            using (var srcDataGpu = new CudaDeviceVariable <double>(srcData.Length))
                using (var srcDiffDataGpu = new CudaDeviceVariable <double>(srcDiffData.Length))
                    using (var destDataGpu = new CudaDeviceVariable <double>(destData.Length))
                        using (var destDiffDataGpu = new CudaDeviceVariable <double>(destDiffData.Length))
                        {
                            srcDataGpu.CopyToDevice(srcData);
                            srcDiffDataGpu.CopyToDevice(srcDiffData);
                            destDataGpu.CopyToDevice(destData);

                            Invoke(() => CudnnNativeMethods.cudnnPoolingBackward(handle, pooling.Handle,
                                                                                 srcTensor.Handle, srcDataGpu.DevicePointer, srcDiffTensor.Handle, srcDiffDataGpu.DevicePointer,
                                                                                 destTensor.Handle, destDataGpu.DevicePointer, destDiffTensor.Handle, destDiffDataGpu.DevicePointer));
                            destDiffDataGpu.CopyToHost(destDiffData);
                        }
        }
예제 #2
0
        private void DisposeNative()
        {
            Contract.Ensures(this.Handle.Pointer == IntPtr.Zero);

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnDestroyConvolutionDescriptor(this.Handle));
            this.Handle.Pointer = IntPtr.Zero;
        }
예제 #3
0
        public void Backward(CudnnSoftmaxAlgorithm algorithm, CudnnSoftmaxMode mode,
                             CudnnTensorDescriptor srcTensor, float[] srcData, CudnnTensorDescriptor srcDiffTensor, float[] srcDiffData,
                             CudnnTensorDescriptor destDiffTensor, float[] destDiffData)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(srcDiffTensor != null);
            Contract.Requires(srcDiffData != null);
            Contract.Requires(destDiffTensor != null);
            Contract.Requires(destDiffData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Float, srcTensor, srcDiffTensor, destDiffTensor);

            using (var srcDataGpu = new CudaDeviceVariable <float>(srcData.Length))
                using (var srcDiffDataGpu = new CudaDeviceVariable <float>(srcDiffData.Length))
                    using (var destDiffDataGpu = new CudaDeviceVariable <float>(destDiffData.Length))
                    {
                        srcDataGpu.CopyToDevice(srcData);
                        srcDiffDataGpu.CopyToDevice(srcDiffData);

                        Invoke(() => CudnnNativeMethods.cudnnSoftmaxBackward(handle, algorithm, mode,
                                                                             srcTensor.Handle, srcDataGpu.DevicePointer, srcDiffTensor.Handle, srcDiffDataGpu.DevicePointer,
                                                                             destDiffTensor.Handle, destDiffDataGpu.DevicePointer));
                        destDiffDataGpu.CopyToHost(destDiffData);
                    }
        }
        public void BackwardData(CudnnFilterDescriptor filter, double[] filterData, CudnnTensorDescriptor diffTensor, double[] diffData, CudnnConvolutionDescriptor convolution, CudnnTensorDescriptor gradient, double[] gradientData, CudnnAccumulateResult accumulate)
        {
            Contract.Requires(filter != null);
            Contract.Requires(filterData != null);
            Contract.Requires(diffTensor != null);
            Contract.Requires(diffData != null);
            Contract.Requires(convolution != null);
            Contract.Requires(gradient != null);
            Contract.Requires(gradientData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, filter, diffTensor, gradient);

            using (var filterDataGpu = new CudaDeviceVariable <double>(filterData.Length))
                using (var diffDataGpu = new CudaDeviceVariable <double>(diffData.Length))
                    using (var gradientDataGpu = new CudaDeviceVariable <double>(gradientData.Length))
                    {
                        filterDataGpu.CopyToDevice(filterData);
                        diffDataGpu.CopyToDevice(diffData);

                        Invoke(() => CudnnNativeMethods.cudnnConvolutionBackwardData(handle, filter.Handle, filterDataGpu.DevicePointer, diffTensor.Handle, diffDataGpu.DevicePointer, convolution.Handle, gradient.Handle, gradientDataGpu.DevicePointer, accumulate));

                        gradientDataGpu.CopyToHost(gradientData);
                    }
        }
예제 #5
0
        public void Cudnn_Descriptors_ConstructTensorWithMajorRow()
        {
            var param = new CudnnTensorDescriptorParameters(CudnnType.Float, CudnnTensorFormat.MajorRow, 10, 5, 2, 4);

            using (var tensor = CudnnContext.CreateTensor(param))
                using (var tensor2 = CudnnContext.CreateTensor())
                {
                    Assert.True(tensor.IsInitialized);
                    Assert.False(tensor2.IsInitialized);

                    CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetTensor4dDescriptor(tensor2.Handle, CudnnTensorFormat.MajorRow, CudnnType.Float, 10, 5, 2, 4));


                    CudnnType dataType = default(CudnnType);
                    int       n1 = 0, c1 = 0, h1 = 0, w1 = 0;
                    int       nStride1 = 0, cStride1 = 0, hStride1 = 0, wStride1 = 0;
                    CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetTensor4dDescriptor(tensor.Handle, out dataType, out n1, out c1, out h1, out w1, out nStride1, out cStride1, out hStride1, out wStride1));

                    int n2 = 0, c2 = 0, h2 = 0, w2 = 0;
                    int nStride2 = 0, cStride2 = 0, hStride2 = 0, wStride2 = 0;
                    CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetTensor4dDescriptor(tensor2.Handle, out dataType, out n2, out c2, out h2, out w2, out nStride2, out cStride2, out hStride2, out wStride2));

                    Assert.Equal(n2, n1);
                    Assert.Equal(c2, c1);
                    Assert.Equal(h2, h1);
                    Assert.Equal(w2, w1);

                    Assert.Equal(nStride2, nStride1);
                    Assert.Equal(cStride2, cStride1);
                    Assert.Equal(hStride2, hStride1);
                    Assert.Equal(wStride2, wStride1);
                }
        }
예제 #6
0
        public void Cudnn_NativeApi_HandleLifecycle()
        {
            CudnnHandle handle = default(CudnnHandle);

            Success(() => CudnnNativeMethods.cudnnCreate(out handle));
            Assert.NotNull(handle);
            Success(() => CudnnNativeMethods.cudnnDestroy(handle));
        }
예제 #7
0
 public void Cudnn_Descriptors_ConstructTensorWithInterleaved_Current()
 {
     using (var tensor = CudnnContext.CreateTensor())
     {
         Assert.False(tensor.IsInitialized);
         Assert.Throws <NotSupportedException>(
             () => CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetTensor4dDescriptor(tensor.Handle, CudnnTensorFormat.Interleaved, CudnnType.Double, 10, 5, 2, 4)));
     }
 }
예제 #8
0
        public static CudnnConvolutionDescriptor CreateConvolution()
        {
            CudnnConvolutionDescriptorHandle handle = default(CudnnConvolutionDescriptorHandle);

            Invoke(() => CudnnNativeMethods.cudnnCreateConvolutionDescriptor(out handle));
            Contract.Assume(handle.Pointer != IntPtr.Zero);

            return(new CudnnConvolutionDescriptor(handle));
        }
        public void BackwardBias(CudnnTensorDescriptor srcTensor, CudaDeviceVariable <double> srcData, CudnnTensorDescriptor destTensor, CudaDeviceVariable <double> destData, CudnnAccumulateResult accumulate)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, srcTensor, destTensor);

            Invoke(() => CudnnNativeMethods.cudnnConvolutionBackwardBias(handle, srcTensor.Handle, srcData.DevicePointer, destTensor.Handle, destData.DevicePointer, accumulate));
        }
예제 #10
0
        public CudnnConvolutionTensorDim GetOutputTensor(CudnnConvolutionPath path)
        {
            Contract.Ensures(Contract.Result <CudnnConvolutionTensorDim>() != null);

            ThrowIfNotInitialized();

            int n = 0, c = 0, h = 0, w = 0;

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetOutputTensor4dDim(this.Handle, path, out n, out c, out h, out w));

            return(new CudnnConvolutionTensorDim(path, n, c, h, w));
        }
예제 #11
0
        public void Forward(CudnnActivationMode mode, CudnnTensorDescriptor srcTensor, CudaDeviceVariable <double> srcData, CudnnTensorDescriptor destTensor, CudaDeviceVariable <double> destData)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, srcTensor, destTensor);

            Invoke(() => CudnnNativeMethods.cudnnActivationForward(handle, mode, srcTensor.Handle, srcData.DevicePointer, destTensor.Handle, destData.DevicePointer));
        }
예제 #12
0
        public void Cudnn_NativeApi_TensorLifecycle()
        {
            CudnnHandle handle = default(CudnnHandle);

            Success(() => CudnnNativeMethods.cudnnCreate(out handle));

            CudnnTensorDescriptorHandle tensorDescriptor = default(CudnnTensorDescriptorHandle);

            Success(() => CudnnNativeMethods.cudnnCreateTensor4dDescriptor(out tensorDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroyTensor4dDescriptor(tensorDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroy(handle));
        }
예제 #13
0
        public void Cudnn_NativeApi_PoolingLifecycle()
        {
            CudnnHandle handle = default(CudnnHandle);

            Success(() => CudnnNativeMethods.cudnnCreate(out handle));

            CudnnPoolingDescriptorHandle poolingDescriptor = default(CudnnPoolingDescriptorHandle);

            Success(() => CudnnNativeMethods.cudnnCreatePoolingDescriptor(out poolingDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroyPoolingDescriptor(poolingDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroy(handle));
        }
예제 #14
0
        public void Cudnn_NativeApi_ConvolutionLifecycle()
        {
            CudnnHandle handle = default(CudnnHandle);

            Success(() => CudnnNativeMethods.cudnnCreate(out handle));

            CudnnConvolutionDescriptorHandle convolutionDescriptor = default(CudnnConvolutionDescriptorHandle);

            Success(() => CudnnNativeMethods.cudnnCreateConvolutionDescriptor(out convolutionDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroyConvolutionDescriptor(convolutionDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroy(handle));
        }
예제 #15
0
        public void Cudnn_NativeApi_FilterLifecycle()
        {
            CudnnHandle handle = default(CudnnHandle);

            Success(() => CudnnNativeMethods.cudnnCreate(out handle));

            CudnnFilterDescriptorHandle filterDescriptor = default(CudnnFilterDescriptorHandle);

            Success(() => CudnnNativeMethods.cudnnCreateFilterDescriptor(out filterDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroyFilterDescriptor(filterDescriptor));
            Success(() => CudnnNativeMethods.cudnnDestroy(handle));
        }
        public void Forward(CudnnPoolingDescriptor pooling, CudnnTensorDescriptor srcTensor, CudaDeviceVariable <float> srcData, CudnnTensorDescriptor destTensor, CudaDeviceVariable <float> destData)
        {
            Contract.Requires(pooling != null);
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Float, srcTensor, destTensor);

            Invoke(() => CudnnNativeMethods.cudnnPoolingForward(handle, pooling.Handle, srcTensor.Handle, srcData.DevicePointer, destTensor.Handle, destData.DevicePointer));
        }
예제 #17
0
        public static CudnnContext Create(CudaStream stream = null)
        {
            CudnnHandle handle = default(CudnnHandle);

            Invoke(() => CudnnNativeMethods.cudnnCreate(out handle));
            Contract.Assume(handle.Pointer != IntPtr.Zero);

            if (stream != null)
            {
                Invoke(() => CudnnNativeMethods.cudnnSetStream(handle, stream.Stream));
            }
            return(new CudnnContext(handle, stream));
        }
예제 #18
0
 private void DisposeNative()
 {
     try
     {
         if (this.handle.Pointer != IntPtr.Zero)
         {
             Invoke(() => CudnnNativeMethods.cudnnDestroy(handle));
         }
     }
     finally
     {
         this.handle.Pointer = IntPtr.Zero;
     }
 }
예제 #19
0
        public void Forward(CudnnSoftmaxAlgorithm algorithm, CudnnSoftmaxMode mode,
                            CudnnTensorDescriptor srcTensor, CudaDeviceVariable <float> srcData, CudnnTensorDescriptor destTensor, CudaDeviceVariable <float> destData)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Float, srcTensor, destTensor);

            Invoke(() => CudnnNativeMethods.cudnnSoftmaxForward(handle, algorithm, mode,
                                                                srcTensor.Handle, srcData.DevicePointer, destTensor.Handle, destData.DevicePointer));
        }
        public void SetParameters(CudnnTensorDescriptorParameters param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetTensor4dDescriptorEx(
                                    this.Handle, param.Type,
                                    param.Num, param.Channels, param.Height, param.Width,
                                    param.NumStride, param.ChannelsStride, param.HeightStride, param.WidthStride));

            this.descriptorParams = param;
        }
        public void SetParameters(CudnnFilterDescriptorParameters param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            Contract.EndContractBlock();

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetFilterDescriptor(
                                    this.Handle, param.Type,
                                    param.Output, param.Input, param.Height, param.Width));

            this.descriptorParams = param;
        }
        public void BackwardFilter(CudnnTensorDescriptor srcTensor, CudaDeviceVariable <double> srcData, CudnnTensorDescriptor diffTensor, CudaDeviceVariable <double> diffData, CudnnConvolutionDescriptor convolution, CudnnFilterDescriptor gradient, CudaDeviceVariable <double> gradientData, CudnnAccumulateResult accumulate)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(diffTensor != null);
            Contract.Requires(diffData != null);
            Contract.Requires(convolution != null);
            Contract.Requires(gradient != null);
            Contract.Requires(gradientData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, srcTensor, diffTensor, gradient);

            Invoke(() => CudnnNativeMethods.cudnnConvolutionBackwardFilter(handle, srcTensor.Handle, srcData.DevicePointer, diffTensor.Handle, diffData.DevicePointer, convolution.Handle, gradient.Handle, gradientData.DevicePointer, accumulate));
        }
        public void Forward(CudnnTensorDescriptor srcTensor, CudaDeviceVariable <float> srcData, CudnnFilterDescriptor filter, CudaDeviceVariable <float> filterData, CudnnConvolutionDescriptor convolution, CudnnTensorDescriptor destTensor, CudaDeviceVariable <float> destData, CudnnAccumulateResult accumulate)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(filter != null);
            Contract.Requires(filterData != null);
            Contract.Requires(convolution != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Float, srcTensor, destTensor, filter);

            Invoke(() => CudnnNativeMethods.cudnnConvolutionForward(handle, srcTensor.Handle, srcData.DevicePointer, filter.Handle, filterData.DevicePointer, convolution.Handle, destTensor.Handle, destData.DevicePointer, accumulate));
        }
예제 #24
0
        public void SetParameters(CudnnConvolutionDescriptorParameters param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetConvolutionDescriptor(
                                    this.Handle, param.Tensor.Handle, param.Filter.Handle,
                                    param.HeightPadding, param.WidthPadding,
                                    param.HeightStride, param.WidthStride,
                                    param.HeightUpscale, param.WidthUpscale,
                                    param.Mode));

            initialized = true;
        }
예제 #25
0
        public void ContextWithStream()
        {
            using (var cuda = new CudaContext())
                using (var stream = new CudaStream(CUStreamFlags.Default))
                {
                    using (var context = CudnnContext.Create(stream))
                    {
                        Assert.True(context.IsInitialized);

                        var streamId = default(CUstream);
                        CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetStream(context.Handle, out streamId));

                        Assert.Equal(stream.Stream, streamId);
                    }
                }
        }
        public void SetParameters(CudnnPoolingDescriptorParameters param)
        {
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            Contract.EndContractBlock();

            CudnnContext.Invoke(() => CudnnNativeMethods.cudnnSetPoolingDescriptor(
                                    this.Handle, param.Mode,
                                    param.Height, param.Width,
                                    param.HeightStride, param.WidthStride));

            this.descriptorParams = param;
        }
예제 #27
0
        public void Cudnn_Descriptors_ConstructFilterWithSetup(CudnnFilterDescriptorParameters param)
        {
            using (var filter = CudnnContext.CreateFilter(param))
            {
                Assert.True(filter.IsInitialized);

                CudnnType dataType = default(CudnnType);
                int       k = 0, c = 0, h = 0, w = 0;
                CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetFilterDescriptor(filter.Handle, out dataType, out k, out c, out h, out w));

                Assert.Equal(filter.Parameters.Type, dataType);
                Assert.Equal(filter.Parameters.Output, k);
                Assert.Equal(filter.Parameters.Input, c);
                Assert.Equal(filter.Parameters.Height, h);
                Assert.Equal(filter.Parameters.Width, w);
            }
        }
        public void BackwardBias(CudnnTensorDescriptor srcTensor, double[] srcData, CudnnTensorDescriptor destTensor, double[] destData, CudnnAccumulateResult accumulate)
        {
            Contract.Requires(srcTensor != null);
            Contract.Requires(srcData != null);
            Contract.Requires(destTensor != null);
            Contract.Requires(destData != null);

            ThrowIfNotInitialized();
            CheckIfCompatible(CudnnType.Double, srcTensor, destTensor);

            using (var srcDataGpu = new CudaDeviceVariable <double>(srcData.Length))
                using (var destDataGpu = new CudaDeviceVariable <double>(destData.Length))
                {
                    srcDataGpu.CopyToDevice(srcData);

                    Invoke(() => CudnnNativeMethods.cudnnConvolutionBackwardBias(handle, srcTensor.Handle, srcDataGpu.DevicePointer, destTensor.Handle, destDataGpu.DevicePointer, accumulate));
                    destDataGpu.CopyToHost(destData);
                }
        }
예제 #29
0
        public void Cudnn_Descriptors_ConstructPoolingWithSetup(CudnnPoolingDescriptorParameters param)
        {
            using (var pooling = CudnnContext.CreatePooling(param))
            {
                Assert.True(pooling.IsInitialized);

                CudnnPoolingMode mode = default(CudnnPoolingMode);
                int windowHeight = 0, windowWidth = 0;
                int verticalStride = 0, horizontalStride = 0;

                CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetPoolingDescriptor(pooling.Handle, out mode, out windowHeight, out windowWidth, out verticalStride, out horizontalStride));

                Assert.Equal(pooling.Parameters.Mode, mode);
                Assert.Equal(pooling.Parameters.Height, windowHeight);
                Assert.Equal(pooling.Parameters.Width, windowWidth);
                Assert.Equal(pooling.Parameters.HeightStride, verticalStride);
                Assert.Equal(pooling.Parameters.WidthStride, horizontalStride);
            }
        }
예제 #30
0
        public void Cudnn_Descriptors_ConstructTensorWithSetup(CudnnTensorDescriptorParameters param)
        {
            using (var tensor = CudnnContext.CreateTensor(param))
            {
                Assert.True(tensor.IsInitialized);

                CudnnType dataType = default(CudnnType);
                int       n = 0, c = 0, h = 0, w = 0;
                int       nStride = 0, cStride = 0, hStride = 0, wStride = 0;
                CudnnContext.Invoke(() => CudnnNativeMethods.cudnnGetTensor4dDescriptor(tensor.Handle, out dataType, out n, out c, out h, out w, out nStride, out cStride, out hStride, out wStride));

                Assert.Equal(tensor.Parameters.Num, n);
                Assert.Equal(tensor.Parameters.Channels, c);
                Assert.Equal(tensor.Parameters.Height, h);
                Assert.Equal(tensor.Parameters.Width, w);

                Assert.Equal(tensor.Parameters.NumStride, nStride);
                Assert.Equal(tensor.Parameters.ChannelsStride, cStride);
                Assert.Equal(tensor.Parameters.HeightStride, hStride);
                Assert.Equal(tensor.Parameters.WidthStride, wStride);
            }
        }