void run_solver(MatrixType const & A, VectorType const & b, SolverTag const & solver_tag, Preconditioner const & precond) { VectorType result = viennacl::linalg::solve(A, b, solver_tag, precond); std::cout << " * Solver iterations: " << solver_tag.iters() << std::endl; VectorType residual = viennacl::linalg::prod(A, result) - b; std::cout << " * Rel. Residual: " << viennacl::linalg::norm_2(residual) / viennacl::linalg::norm_2(b) << std::endl; }
void run_solver(MatrixType const & matrix, VectorType const & rhs, VectorType const & ref_result, SolverTag const & solver, PrecondTag const & precond) { VectorType result(rhs); VectorType residual(rhs); result = viennacl::linalg::solve(matrix, rhs, solver, precond); residual -= viennacl::linalg::prod(matrix, result); std::cout << " > Relative residual: " << viennacl::linalg::norm_2(residual) / viennacl::linalg::norm_2(rhs) << std::endl; std::cout << " > Iterations: " << solver.iters() << std::endl; result -= ref_result; std::cout << " > Relative deviation from result: " << viennacl::linalg::norm_2(result) / viennacl::linalg::norm_2(ref_result) << std::endl; }
void run_solver(MatrixType const & matrix, VectorType const & rhs, VectorType const & ref_result, SolverTag const & solver, PrecondTag const & precond, long ops) { Timer timer; VectorType result(rhs); VectorType residual(rhs); viennacl::backend::finish(); timer.start(); for (int runs=0; runs<BENCHMARK_RUNS; ++runs) { result = viennacl::linalg::solve(matrix, rhs, solver, precond); } viennacl::backend::finish(); double exec_time = timer.get(); std::cout << "Exec. time: " << exec_time << std::endl; std::cout << "Est. "; printOps(ops, exec_time / BENCHMARK_RUNS); residual -= viennacl::linalg::prod(matrix, result); std::cout << "Relative residual: " << viennacl::linalg::norm_2(residual) / viennacl::linalg::norm_2(rhs) << std::endl; std::cout << "Estimated rel. residual: " << solver.error() << std::endl; std::cout << "Iterations: " << solver.iters() << std::endl; result -= ref_result; std::cout << "Relative deviation from result: " << viennacl::linalg::norm_2(result) / viennacl::linalg::norm_2(ref_result) << std::endl; }