From d23a9fa51477af858b683f109906275e20c8eaae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkovsky@mmg.fjfi.cvut.cz> Date: Sat, 11 Jan 2020 22:52:37 +0100 Subject: [PATCH] Update GMRES variants in LinearSolvers benchmark --- .../tnl-benchmark-linear-solvers.h | 90 ++++++++----------- 1 file changed, 39 insertions(+), 51 deletions(-) diff --git a/src/Benchmarks/LinearSolvers/tnl-benchmark-linear-solvers.h b/src/Benchmarks/LinearSolvers/tnl-benchmark-linear-solvers.h index 0701b647a4..6db3410642 100644 --- a/src/Benchmarks/LinearSolvers/tnl-benchmark-linear-solvers.h +++ b/src/Benchmarks/LinearSolvers/tnl-benchmark-linear-solvers.h @@ -68,12 +68,19 @@ using CommunicatorType = Communicators::NoDistrCommunicator; static const std::set< std::string > valid_solvers = { "gmres", - "cwygmres", "tfqmr", "bicgstab", "bicgstab-ell", }; +static const std::set< std::string > valid_gmres_variants = { + "CGS", + "CGSR", + "MGS", + "MGSR", + "CWY", +}; + static const std::set< std::string > valid_preconditioners = { "jacobi", "ilu0", @@ -85,19 +92,19 @@ parse_comma_list( const Config::ParameterContainer& parameters, const char* parameter, const std::set< std::string >& options ) { - const String solvers = parameters.getParameter< String >( parameter ); + const String param = parameters.getParameter< String >( parameter ); - if( solvers == "all" ) + if( param == "all" ) return options; - std::stringstream ss( solvers.getString() ); + std::stringstream ss( param.getString() ); std::string s; std::set< std::string > set; while( std::getline( ss, s, ',' ) ) { if( ! options.count( s ) ) throw std::logic_error( std::string("Invalid value in the comma-separated list for the parameter '") - + parameter + "': '" + s + "'. The list contains: '" + solvers.getString() + "'." ); + + parameter + "': '" + s + "'. The list contains: '" + param.getString() + "'." ); set.insert( s ); @@ -138,6 +145,7 @@ benchmarkIterativeSolvers( Benchmark& benchmark, const int ell_max = 2; const std::set< std::string > solvers = parse_comma_list( parameters, "solvers", valid_solvers ); + const std::set< std::string > gmresVariants = parse_comma_list( parameters, "gmres-variants", valid_gmres_variants ); const std::set< std::string > preconditioners = parse_comma_list( parameters, "preconditioners", valid_preconditioners ); const bool with_preconditioner_update = parameters.getParameter< bool >( "with-preconditioner-update" ); @@ -151,21 +159,14 @@ benchmarkIterativeSolvers( Benchmark& benchmark, } if( solvers.count( "gmres" ) ) { - benchmark.setOperation("GMRES (Jacobi)"); - parameters.template setParameter< String >( "gmres-variant", "MGSR" ); - benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif - } - - if( solvers.count( "cwygmres" ) ) { - benchmark.setOperation("CWYGMRES (Jacobi)"); - parameters.template setParameter< String >( "gmres-variant", "CWY" ); - benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif + for( auto variant : gmresVariants ) { + benchmark.setOperation(variant + "-GMRES (Jacobi)"); + parameters.template setParameter< String >( "gmres-variant", variant.c_str() ); + benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, matrixPointer, x0, b ); + #ifdef HAVE_CUDA + benchmarkSolver< GMRES, Diagonal >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); + #endif + } } if( solvers.count( "tfqmr" ) ) { @@ -208,21 +209,14 @@ benchmarkIterativeSolvers( Benchmark& benchmark, } if( solvers.count( "gmres" ) ) { - benchmark.setOperation("GMRES (ILU0)"); - parameters.template setParameter< String >( "gmres-variant", "MGSR" ); - benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif - } - - if( solvers.count( "cwygmres" ) ) { - benchmark.setOperation("CWYGMRES (ILU0)"); - parameters.template setParameter< String >( "gmres-variant", "CWY" ); - benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif + for( auto variant : gmresVariants ) { + benchmark.setOperation(variant + "-GMRES (ILU0)"); + parameters.template setParameter< String >( "gmres-variant", variant.c_str() ); + benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, matrixPointer, x0, b ); + #ifdef HAVE_CUDA + benchmarkSolver< GMRES, ILU0 >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); + #endif + } } if( solvers.count( "tfqmr" ) ) { @@ -264,21 +258,14 @@ benchmarkIterativeSolvers( Benchmark& benchmark, } if( solvers.count( "gmres" ) ) { - benchmark.setOperation("GMRES (ILUT)"); - parameters.template setParameter< String >( "gmres-variant", "MGSR" ); - benchmarkSolver< GMRES, ILUT >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, ILUT >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif - } - - if( solvers.count( "cwygmres" ) ) { - benchmark.setOperation("CWYGMRES (ILUT)"); - parameters.template setParameter< String >( "gmres-variant", "CWY" ); - benchmarkSolver< GMRES, ILUT >( benchmark, parameters, matrixPointer, x0, b ); - #ifdef HAVE_CUDA - benchmarkSolver< GMRES, ILUT >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); - #endif + for( auto variant : gmresVariants ) { + benchmark.setOperation(variant + "-GMRES (ILUT)"); + parameters.template setParameter< String >( "gmres-variant", variant.c_str() ); + benchmarkSolver< GMRES, ILUT >( benchmark, parameters, matrixPointer, x0, b ); + #ifdef HAVE_CUDA + benchmarkSolver< GMRES, ILUT >( benchmark, parameters, cudaMatrixPointer, cuda_x0, cuda_b ); + #endif + } } if( solvers.count( "tfqmr" ) ) { @@ -495,7 +482,8 @@ configSetup( Config::ConfigDescription& config ) config.addEntry< int >( "verbose", "Verbose mode.", 1 ); config.addEntry< bool >( "reorder-dofs", "Reorder matrix entries corresponding to the same DOF together.", false ); config.addEntry< bool >( "with-direct", "Includes the 3rd party direct solvers in the benchmark.", false ); - config.addEntry< String >( "solvers", "Comma-separated list of solvers to run benchmarks for. Options: gmres, cwygmres, tfqmr, bicgstab, bicgstab-ell.", "all" ); + config.addEntry< String >( "solvers", "Comma-separated list of solvers to run benchmarks for. Options: gmres, tfqmr, bicgstab, bicgstab-ell.", "all" ); + config.addEntry< String >( "gmres-variants", "Comma-separated list of GMRES variants to run benchmarks for. Options: CGS, CGSR, MGS, MGSR, CWY.", "all" ); config.addEntry< String >( "preconditioners", "Comma-separated list of preconditioners to run benchmarks for. Options: jacobi, ilu0, ilut.", "all" ); config.addEntry< bool >( "with-preconditioner-update", "Run benchmark for the preconditioner update.", true ); config.addEntry< String >( "devices", "Run benchmarks on these devices.", "all" ); -- GitLab