From 6c0d3de3aacfaa095e9f05fd666e96522a6273fc Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Thu, 16 Aug 2018 23:07:04 +0200 Subject: [PATCH] Add GMRES test for CUDAWrappers::Vector --- tests/cuda/solver_03.cu | 85 +++++++++++++++++++++++++++++++++++++ tests/cuda/solver_03.output | 6 +++ 2 files changed, 91 insertions(+) create mode 100644 tests/cuda/solver_03.cu create mode 100644 tests/cuda/solver_03.output diff --git a/tests/cuda/solver_03.cu b/tests/cuda/solver_03.cu new file mode 100644 index 0000000000..89250f5110 --- /dev/null +++ b/tests/cuda/solver_03.cu @@ -0,0 +1,85 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2018 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + +// Check that dealii::SolverGMRES works with CUDAWrappers::SparseMatrix + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../testmatrix.h" +#include "../tests.h" + +void +test(Utilities::CUDA::Handle &cuda_handle) +{ + // Build the sparse matrix on the host + const unsigned int problem_size = 10; + unsigned int size = (problem_size - 1) * (problem_size - 1); + FDMatrix testproblem(problem_size, problem_size); + SparsityPattern structure(size, size, 5); + SparseMatrix A; + testproblem.five_point_structure(structure); + structure.compress(); + A.reinit(structure); + testproblem.five_point(A); + + // Solve on the host + PreconditionIdentity prec_no; + SolverControl control(100, 1.e-10); + SolverGMRES<> cg_host(control); + Vector sol_host(size); + Vector rhs_host(size); + for (unsigned int i = 0; i < size; ++i) + rhs_host[i] = static_cast(i); + cg_host.solve(A, sol_host, rhs_host, prec_no); + + // Solve on the device + CUDAWrappers::SparseMatrix A_dev(cuda_handle, A); + LinearAlgebra::CUDAWrappers::Vector sol_dev(size); + LinearAlgebra::CUDAWrappers::Vector rhs_dev(size); + LinearAlgebra::ReadWriteVector rw_vector(size); + for (unsigned int i = 0; i < size; ++i) + rw_vector[i] = static_cast(i); + rhs_dev.import(rw_vector, VectorOperation::insert); + SolverGMRES> cg_dev(control); + cg_dev.solve(A_dev, sol_dev, rhs_dev, prec_no); + + // Check the result + rw_vector.import(sol_dev, VectorOperation::insert); + for (unsigned int i = 0; i < size; ++i) + AssertThrow(std::fabs(rw_vector[i] - sol_host[i]) < 1e-8, + ExcInternalError()); +} + +int +main() +{ + initlog(); + deallog.depth_console(0); + + Utilities::CUDA::Handle cuda_handle; + test(cuda_handle); + + deallog << "OK" << std::endl; + + return 0; +} diff --git a/tests/cuda/solver_03.output b/tests/cuda/solver_03.output new file mode 100644 index 0000000000..b8e4a2e2fb --- /dev/null +++ b/tests/cuda/solver_03.output @@ -0,0 +1,6 @@ + +DEAL:GMRES::Starting value 416.989 +DEAL:GMRES::Convergence step 32 value 4.50651e-11 +DEAL:GMRES::Starting value 416.989 +DEAL:GMRES::Convergence step 32 value 4.50477e-11 +DEAL::OK -- 2.39.5