//[Test] public void TestBiCGSTABSolver() { 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); // For temporary memory. float[] r0 = _gpu.Allocate <float>(N); float[] r = _gpu.Allocate <float>(N); float[] v = _gpu.Allocate <float>(N); float[] s = _gpu.Allocate <float>(N); float[] t = _gpu.Allocate <float>(N); _sparse.Dense2CSR(N, N, _diMatrixMN, _diPerRow, _diCSRVals, _diCSRRows, _diCSRCols); sw.Start(); SolveResult result = _solver.BiCGSTAB(N, nnz, _diCSRVals, _diCSRRows, _diCSRCols, _diVectorN, _diVectorN2, _diVectorAX, r0, r, v, _diVectorP, s, t, 0.00001f, 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(); }