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);
                }
        }
Exemple #2
0
        public void Cudnn_UseCase_ForwardConvolution_Float()
        {
            CudnnContext.DefaultType         = CudnnType.Float;
            CudnnContext.DefaultTensorFormat = CudnnTensorFormat.MajorRow;

            using (var context = CudnnContext.Create())
            {
                // Set some options and tensor dimensions
                int nInput           = 100;
                int filtersIn        = 10;
                int filtersOut       = 8;
                int heightIn         = 20;
                int widthIn          = 20;
                int heightFilter     = 5;
                int widthFilter      = 5;
                int paddingHeight    = 4;
                int paddingWeight    = 4;
                int verticalStride   = 1;
                int horizontalStride = 1;
                int upscalex         = 1;
                int upscaley         = 1;

                var distribution = new ContinuousUniform(0, 1);

                // Input Tensor Data
                Vector <float> xDataVector = Vector <float> .Build.Dense(nInput *filtersIn *heightIn *widthIn);

                xDataVector.MapInplace(x => (float)distribution.Sample(), Zeros.Include);

                // Filter Tensor Data
                Vector <float> filterData = Vector <float> .Build.Dense(filtersOut *filtersIn *heightFilter *widthFilter);

                filterData.MapInplace(x => (float)distribution.Sample(), Zeros.Include);

                // Descriptor for input
                var xTensor = CudnnContext.CreateTensor(new CudnnTensorDescriptorParameters(nInput, filtersIn, heightFilter, widthFilter));

                // Filter descriptor
                var filter = CudnnContext.CreateFilter(new CudnnFilterDescriptorParameters(filtersOut, filtersIn, heightFilter, widthFilter));

                // Convolution descriptor
                var convolution = CudnnContext.CreateConvolution(new CudnnConvolutionDescriptorParameters(CudnnConvolutionMode.CrossCorrelation, xTensor, filter, paddingHeight, paddingWeight, verticalStride, horizontalStride, upscalex, upscaley));
                var output      = convolution.GetOutputTensor(CudnnConvolutionPath.Forward);

                // Output tensor
                var     yTensor = CudnnContext.CreateTensor(new CudnnTensorDescriptorParameters(nInput, filtersOut, output.Height, output.Width));
                float[] yData   = new float[nInput * filtersOut * output.Height * output.Width];

                // Perform convolution
                context.Forward(xTensor, xDataVector.ToArray(), filter, filterData.ToArray(), convolution, yTensor, yData, CudnnAccumulateResult.DoNotAccumulate);

                // Clean up
                xTensor.Dispose();
                yTensor.Dispose();
                filter.Dispose();
                convolution.Dispose();
            }
        }
 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)));
     }
 }
        public void Cudnn_Descriptors_ConstructConvolutionWithSetupEx(CudnnConvolutionDescriptorParametersEx param)
        {
            using (var convolution = CudnnContext.CreateConvolution(param))
            {
                Assert.True(convolution.IsInitialized);

                var dimensions = convolution.GetOutputTensor(CudnnConvolutionPath.Forward);
                Assert.NotNull(dimensions);
            }
        }
Exemple #5
0
        public void Cudnn_UseCase_ForwardConvolution_Double()
        {
            CudnnContext.DefaultType         = CudnnType.Double;
            CudnnContext.DefaultTensorFormat = CudnnTensorFormat.MajorRow;

            using (var context = CudnnContext.Create())
            {
                // Set some options and tensor dimensions
                int nInput           = 100;
                int filtersIn        = 10;
                int filtersOut       = 8;
                int heightIn         = 20;
                int widthIn          = 20;
                int heightFilter     = 5;
                int widthFilter      = 5;
                int paddingHeight    = 4;
                int paddingWeight    = 4;
                int verticalStride   = 1;
                int horizontalStride = 1;
                int upscalex         = 1;
                int upscaley         = 1;

                // Input Tensor Data
                double[] xData = new double[nInput * filtersIn * heightIn * widthIn];
                ContinuousUniform.Samples(xData, 0, 1);

                // Filter Tensor Data
                double[] filterData = new double[filtersOut * filtersIn * heightFilter * widthFilter];
                ContinuousUniform.Samples(filterData, 0, 1);

                // Descriptor for input
                var xTensor = CudnnContext.CreateTensor(new CudnnTensorDescriptorParameters(nInput, filtersIn, heightFilter, widthFilter));

                // Filter descriptor
                var filter = CudnnContext.CreateFilter(new CudnnFilterDescriptorParameters(filtersOut, filtersIn, heightFilter, widthFilter));

                // Convolution descriptor
                var convolution = CudnnContext.CreateConvolution(new CudnnConvolutionDescriptorParameters(CudnnConvolutionMode.CrossCorrelation, xTensor, filter, paddingHeight, paddingWeight, verticalStride, horizontalStride, upscalex, upscaley));
                var output      = convolution.GetOutputTensor(CudnnConvolutionPath.Forward);

                // Output tensor
                var      yTensor = CudnnContext.CreateTensor(new CudnnTensorDescriptorParameters(nInput, filtersOut, output.Height, output.Width));
                double[] yData   = new double[nInput * filtersOut * output.Height * output.Width];

                // Perform convolution
                context.Forward(xTensor, xData, filter, filterData, convolution, yTensor, yData, CudnnAccumulateResult.DoNotAccumulate);

                // Clean up
                xTensor.Dispose();
                yTensor.Dispose();
                filter.Dispose();
                convolution.Dispose();
            }
        }
 public void Cudnn_Descriptors_Constructors()
 {
     using (var tensor = CudnnContext.CreateTensor())
         using (var convolution = CudnnContext.CreateConvolution())
             using (var pooling = CudnnContext.CreatePooling())
                 using (var filter = CudnnContext.CreateFilter())
                 {
                     Assert.False(tensor.IsInitialized);
                     Assert.False(convolution.IsInitialized);
                     Assert.False(pooling.IsInitialized);
                     Assert.False(filter.IsInitialized);
                 }
 }
        public void Cudnn_Descriptors_ConstructConvolutionWithSetup()
        {
            using (var filter = CudnnContext.CreateFilter(new CudnnFilterDescriptorParameters(CudnnType.Float, 10, 10, 2, 2)))
                using (var tensor = CudnnContext.CreateTensor(new CudnnTensorDescriptorParameters(CudnnType.Float, CudnnTensorFormat.MajorRow, 10, 10, 100, 100)))
                {
                    var param = new CudnnConvolutionDescriptorParameters(CudnnConvolutionMode.Convolution, tensor, filter, 1, 1, 3, 3, 1, 1);
                    using (var convolution = CudnnContext.CreateConvolution(param))
                    {
                        Assert.True(convolution.IsInitialized);

                        var dimensions = convolution.GetOutputTensor(CudnnConvolutionPath.Forward);
                        Assert.NotNull(dimensions);
                    }
                }
        }
 public void Lifecycle()
 {
     using (var context = CudnnContext.Create())
         using (var tensor = CudnnContext.CreateTensor())
             using (var convolution = CudnnContext.CreateConvolution())
                 using (var pooling = CudnnContext.CreatePooling())
                     using (var filter = CudnnContext.CreateFilter())
                     {
                         Assert.True(context.IsInitialized);
                         Assert.NotNull(tensor);
                         Assert.NotNull(convolution);
                         Assert.NotNull(pooling);
                         Assert.NotNull(filter);
                     }
 }
        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 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 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);
            }
        }
        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);
            }
        }