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);
                }
        }
        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);
            }
        }
        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);
            }
        }
        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);
            }
        }