示例#1
0
        //[Test]
        public void TestCGSolver()
        {
            Stopwatch sw = new Stopwatch();

            float one  = 1.0f;
            float zero = 0.0f;

            _hiMatrixMN = new float[N * N];
            _hoVectorN  = new float[N];
            CreateDiagonalMatrix(_hiMatrixMN, N, 6);

            _hiVectorN  = new float[N];
            _hiVectorN2 = new float[N];
            FillBuffer(_hiVectorN2, 6);

            _diMatrixMN = _gpu.CopyToDevice(_hiMatrixMN);
            _diVectorN  = _gpu.Allocate(_hiVectorN);
            _diVectorN2 = _gpu.CopyToDevice(_hiVectorN2);

            _diPerRow   = _gpu.Allocate <int>(N);
            _diVectorP  = _gpu.Allocate <float>(N);
            _diVectorAX = _gpu.Allocate <float>(N);

            int nnz = _sparse.NNZ(N, N, _diMatrixMN, _diPerRow);

            _diCSRVals = _gpu.Allocate <float>(nnz);
            _diCSRCols = _gpu.Allocate <int>(nnz);
            _diCSRRows = _gpu.Allocate <int>(N + 1);

            _sparse.Dense2CSR(N, N, _diMatrixMN, _diPerRow, _diCSRVals, _diCSRRows, _diCSRCols);

            sw.Start();
            SolveResult result = _solver.CG(N, nnz, _diCSRVals, _diCSRRows, _diCSRCols, _diVectorN, _diVectorN2, _diVectorP, _diVectorAX, 0.01f, 1000);
            long        time   = sw.ElapsedMilliseconds;

            _sparse.CSRMV(N, N, nnz, ref one, _diCSRVals, _diCSRRows, _diCSRCols, _diVectorN, ref zero, _diVectorN2);

            _gpu.CopyFromDevice(_diVectorN2, _hoVectorN);

            float maxError = 0.0f;

            for (int i = 0; i < N; i++)
            {
                float error = Math.Abs(_hoVectorN[i] - _hiVectorN2[i]);

                if (error > maxError)
                {
                    maxError = error;
                }
            }

            Console.WriteLine("Time : {0} ms", time);
            Console.WriteLine("Iterate Count : {0}", result.IterateCount);
            Console.WriteLine("Residual : {0}", result.LastError);
            Console.WriteLine("max error : {0}", maxError);

            _gpu.FreeAll();
        }
        public void TestDENSE2CSR()
        {
            int[] cpunnzPerRow;
            int   cpuNNZ;

            CreateDenseMatrixCSR(_hiMatrixMN, M, N, out cpunnzPerRow, out cpuNNZ);
            CPUDense2CSR(_hiMatrixMN, M, N, cpuNNZ, out _hoCSRRowsCPU, out _hoCSRColsCPU, out _hoValsCPU);

            _gpu.CopyToDevice(_hiMatrixMN, _diMatrixMN);

            int nnz = _sparse.NNZ(M, N, _diMatrixMN, _diPerVector);

            _hoVals    = new double[nnz];
            _hoCSRRows = new int[M + 1];
            _hoCSRCols = new int[nnz];

            _diVals    = _gpu.Allocate(_hoVals);
            _diCSRRows = _gpu.Allocate(_hoCSRRows);
            _diCSRCols = _gpu.Allocate(_hoCSRCols);

            _sparse.Dense2CSR(M, N, _diMatrixMN, _diPerVector, _diVals, _diCSRRows, _diCSRCols);

            _gpu.CopyFromDevice(_diVals, _hoVals);
            _gpu.CopyFromDevice(_diCSRRows, _hoCSRRows);
            _gpu.CopyFromDevice(_diCSRCols, _hoCSRCols);

            _gpu.Free(_diVals);
            _gpu.Free(_diCSRRows);
            _gpu.Free(_diCSRCols);

            for (int i = 0; i < M + 1; i++)
            {
                Assert.AreEqual(_hoCSRRowsCPU[i], _hoCSRRows[i]);
            }

            for (int i = 0; i < nnz; i++)
            {
                Assert.AreEqual(_hoValsCPU[i], _hoVals[i]);
                Assert.AreEqual(_hoCSRColsCPU[i], _hoCSRCols[i]);
            }
        }
示例#3
0
        public void Test_SPARSE2_CSRMV()
        {
            int nnz;

            // No transpose
            ClearBuffer(hiMatrixMN);
            ClearBuffer(hiVectorXN);
            ClearBuffer(hiVectorYM);

            FillBufferSparse(hiMatrixMN);
            FillBuffer(hiVectorXN);
            FillBuffer(hiVectorYM);

            diMatrixA  = _gpu.CopyToDevice(hiMatrixMN);
            diVectorXN = _gpu.CopyToDevice(hiVectorXN);
            diVectorYM = _gpu.CopyToDevice(hiVectorYM);

            diNNZRows = _gpu.Allocate <int>(M);
            nnz       = _sparse.NNZ(M, N, diMatrixA, diNNZRows);
            diVals    = _gpu.Allocate <double>(nnz);
            diRows    = _gpu.Allocate <int>(M + 1);
            diCols    = _gpu.Allocate <int>(nnz);

            _sparse.Dense2CSR(M, N, diMatrixA, diNNZRows, diVals, diRows, diCols);

            _sparse.CSRMV(M, N, nnz, ref Alpha, diVals, diRows, diCols, diVectorXN, ref Beta, diVectorYM);

            _gpu.CopyFromDevice(diVectorYM, gpuResultM);

            for (int i = 0; i < M; i++)
            {
                double cpuResult = 0.0;
                for (int j = 0; j < N; j++)
                {
                    cpuResult += Alpha * hiMatrixMN[GetIndexColumnMajor(i, j, M)] * hiVectorXN[j];
                }

                cpuResult += Beta * hiVectorYM[i];

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

            _gpu.FreeAll();

            // Transpose
            ClearBuffer(hiMatrixMN);
            ClearBuffer(hiVectorXM);
            ClearBuffer(hiVectorYN);

            FillBufferSparse(hiMatrixMN);
            FillBuffer(hiVectorXM);
            FillBuffer(hiVectorYN);

            diMatrixA  = _gpu.CopyToDevice(hiMatrixMN);
            diVectorXM = _gpu.CopyToDevice(hiVectorXM);
            diVectorYN = _gpu.CopyToDevice(hiVectorYN);

            diNNZRows = _gpu.Allocate <int>(M);
            nnz       = _sparse.NNZ(M, N, diMatrixA, diNNZRows);
            diVals    = _gpu.Allocate <double>(nnz);
            diRows    = _gpu.Allocate <int>(M + 1);
            diCols    = _gpu.Allocate <int>(nnz);

            _sparse.Dense2CSR(M, N, diMatrixA, diNNZRows, diVals, diRows, diCols);

            _sparse.CSRMV(M, N, nnz, ref Alpha, diVals, diRows, diCols, diVectorXM, ref Beta, diVectorYN, SPARSE.cusparseOperation.Transpose);

            _gpu.CopyFromDevice(diVectorYN, gpuResultN);

            for (int j = 0; j < N; j++)
            {
                double cpuResult = 0.0;
                for (int i = 0; i < M; i++)
                {
                    cpuResult += Alpha * hiMatrixMN[GetIndexColumnMajor(i, j, M)] * hiVectorXM[i];
                }

                cpuResult += Beta * hiVectorYN[j];

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

            _gpu.FreeAll();
        }