コード例 #1
0
        public void Test_BLAS2_TPMV()
        {
            ClearBuffer(hiMatrixANN);
            ClearBuffer(hiMatrixAPS);
            ClearBuffer(hiVectorXN);

            FillBuffer(hiVectorXN);

            diMatrixA  = _gpu.Allocate(hiMatrixAPS);
            diVectorXN = _gpu.Allocate(hiVectorXN);

            // Lower triangular banded matrix
            CreateBandedMatrix(hiMatrixANN, N, N, N - 1, 0);
            PackSymmetricMatrix(hiMatrixANN, hiMatrixAPS, N, cublasFillMode.Lower);
            _gpu.CopyToDevice(hiMatrixAPS, diMatrixA);

            // Test without transpose
            _gpu.CopyToDevice(hiVectorXN, diVectorXN);
            _blas.TPMV(N, diMatrixA, diVectorXN);
            _gpu.CopyFromDevice(diVectorXN, gpuResultN);

            for (int i = 0; i < N; i++)
            {
                double cpuResult = 0.0;

                for (int j = 0; j < N; j++)
                {
                    cpuResult += hiMatrixANN[GetIndexColumnMajor(i, j, N)] * hiVectorXN[j];
                }

                Assert.AreEqual(cpuResult, gpuResultN[i]);
            }

            // Test with transpose
            _gpu.CopyToDevice(hiVectorXN, diVectorXN);
            _blas.TPMV(N, diMatrixA, diVectorXN, cublasOperation.T);
            _gpu.CopyFromDevice(diVectorXN, gpuResultN);

            for (int j = 0; j < N; j++)
            {
                double cpuResult = 0.0;

                for (int i = 0; i < N; i++)
                {
                    cpuResult += hiMatrixANN[GetIndexColumnMajor(i, j, N)] * hiVectorXN[i];
                }

                Assert.AreEqual(cpuResult, gpuResultN[j]);
            }

            // Upper triangular banded matrix
            ClearBuffer(hiMatrixANN);
            CreateBandedMatrix(hiMatrixANN, N, N, 0, N - 1);
            PackSymmetricMatrix(hiMatrixANN, hiMatrixAPS, N, cublasFillMode.Upper);
            _gpu.CopyToDevice(hiMatrixAPS, diMatrixA);

            // Test without transpose
            _gpu.CopyToDevice(hiVectorXN, diVectorXN);
            _blas.TPMV(N, diMatrixA, diVectorXN, cublasOperation.N, cublasFillMode.Upper);
            _gpu.CopyFromDevice(diVectorXN, gpuResultN);

            for (int i = 0; i < N; i++)
            {
                double cpuResult = 0.0;

                for (int j = 0; j < N; j++)
                {
                    cpuResult += hiMatrixANN[GetIndexColumnMajor(i, j, N)] * hiVectorXN[j];
                }

                Assert.AreEqual(cpuResult, gpuResultN[i]);
            }

            // Test with transpose
            _gpu.CopyToDevice(hiVectorXN, diVectorXN);
            _blas.TPMV(N, diMatrixA, diVectorXN, cublasOperation.T, cublasFillMode.Upper);
            _gpu.CopyFromDevice(diVectorXN, gpuResultN);

            for (int j = 0; j < N; j++)
            {
                double cpuResult = 0.0;

                for (int i = 0; i < N; i++)
                {
                    cpuResult += hiMatrixANN[GetIndexColumnMajor(i, j, N)] * hiVectorXN[i];
                }

                Assert.AreEqual(cpuResult, gpuResultN[j]);
            }

            _gpu.FreeAll();
        }