diff --git a/src/Benchmarks/SpMV/spmv.h b/src/Benchmarks/SpMV/spmv.h index 6bfee5ffef7702219493d124d72da5d15fc8c54b..7e3928e09c210cf3e46e6389dd1670e07a9afbd8 100644 --- a/src/Benchmarks/SpMV/spmv.h +++ b/src/Benchmarks/SpMV/spmv.h @@ -25,6 +25,11 @@ #include <TNL/Matrices/BiEllpack.h> #include <TNL/Matrices/MatrixReader.h> + +#include <TNL/Matrices/SparseMatrix.h> +#include <TNL/Containers/Segments/CSR.h> +#include <TNL/Containers/Segments/Ellpack.h> +#include <TNL/Containers/Segments/SlicedEllpack.h> using namespace TNL::Matrices; #include "cusparseCSRMatrix.h" @@ -36,6 +41,22 @@ namespace Benchmarks { template< typename Real, typename Device, typename Index > using SlicedEllpackAlias = Matrices::SlicedEllpack< Real, Device, Index >; +// Segments based sparse matrix aliases +template< typename Real, typename Device, typename Index > +using SparseMatrix_CSR = Matrices::SparseMatrix< Real, Containers::Segments::CSR, Device, Index >; + +template< typename Device, typename Index > +using EllpackSegments = Containers::Segments::Ellpack< Device, Index >; + +template< typename Real, typename Device, typename Index > +using SparseMatrix_Ellpack = Matrices::SparseMatrix< Real, EllpackSegments, Device, Index >; + +template< typename Device, typename Index > +using SlicedEllpackSegments = Containers::Segments::SlicedEllpack< Device, Index >; + +template< typename Real, typename Device, typename Index > +using SparseMatrix_SlicedEllpack = Matrices::SparseMatrix< Real, SlicedEllpackSegments, Device, Index >; + // Get the name (with extension) of input matrix file std::string getMatrixFileName( const String& InputFileName ) { @@ -85,7 +106,7 @@ void printMatrixInfo( const Matrix& matrix, template< typename Real, template< typename, typename, typename > class Matrix, template< typename, typename, typename, typename > class Vector = Containers::Vector > -bool +void benchmarkSpMV( Benchmark& benchmark, const String& inputFileName, bool verboseMR ) @@ -98,19 +119,10 @@ benchmarkSpMV( Benchmark& benchmark, CSR_DeviceMatrix CSRdeviceMatrix; // Read the matrix for CSR, to set up cuSPARSE - try - { - if( ! MatrixReader< CSR_HostMatrix >::readMtxFile( inputFileName, CSRhostMatrix, verboseMR ) ) - { - throw std::bad_alloc(); - return false; - } - } - catch( std::bad_alloc& e ) - { - e.what(); - return false; - } + if( ! MatrixReader< CSR_HostMatrix >::readMtxFile( inputFileName, CSRhostMatrix, verboseMR ) ) + { + throw std::bad_alloc(); + } #ifdef HAVE_CUDA // cuSPARSE handle setup @@ -140,19 +152,10 @@ benchmarkSpMV( Benchmark& benchmark, CudaVector deviceVector, deviceVector2; // Load the format - try - { - if( ! MatrixReader< HostMatrix >::readMtxFile( inputFileName, hostMatrix, verboseMR ) ) - { - throw std::bad_alloc(); - return false; - } - } - catch( std::bad_alloc& e ) - { - e.what(); - return false; - } + if( ! MatrixReader< HostMatrix >::readMtxFile( inputFileName, hostMatrix, verboseMR ) ) + { + throw std::bad_alloc(); + } // Setup MetaData here (not in tnl-benchmark-spmv.h, as done in Benchmarks/BLAS), @@ -244,7 +247,7 @@ benchmarkSpMV( Benchmark& benchmark, resultcuSPARSEDeviceVector2 = deviceVector2; - // Difference between GPU (curent format) and GPU-cuSPARSE results + // Difference between GPU (current format) and GPU-cuSPARSE results //Real cuSparseDifferenceAbsMax = resultDeviceVector2.differenceAbsMax( resultcuSPARSEDeviceVector2 ); Real cuSparseDifferenceAbsMax = max( abs( resultDeviceVector2 - resultcuSPARSEDeviceVector2 ) ); //Real cuSparseDifferenceLpNorm = resultDeviceVector2.differenceLpNorm( resultcuSPARSEDeviceVector2, 1 ); @@ -279,26 +282,33 @@ benchmarkSpMV( Benchmark& benchmark, #endif std::cout << std::endl; - return true; } template< typename Real = double, typename Index = int > -bool +void benchmarkSpmvSynthetic( Benchmark& benchmark, const String& inputFileName, bool verboseMR ) { - bool result = true; - result |= benchmarkSpMV< Real, Matrices::CSR >( benchmark, inputFileName, verboseMR ); - result |= benchmarkSpMV< Real, Matrices::Ellpack >( benchmark, inputFileName, verboseMR ); - result |= benchmarkSpMV< Real, SlicedEllpackAlias >( benchmark, inputFileName, verboseMR ); - result |= benchmarkSpMV< Real, Matrices::ChunkedEllpack >( benchmark, inputFileName, verboseMR ); + benchmarkSpMV< Real, Matrices::CSR >( benchmark, inputFileName, verboseMR ); + benchmarkSpMV< Real, Matrices::Ellpack >( benchmark, inputFileName, verboseMR ); + benchmarkSpMV< Real, SlicedEllpackAlias >( benchmark, inputFileName, verboseMR ); + benchmarkSpMV< Real, Matrices::ChunkedEllpack >( benchmark, inputFileName, verboseMR ); + + //// + // Segments based sparse matrices + std::cerr << "*********************************" << std::endl; + benchmarkSpMV< Real, SparseMatrix_CSR >( benchmark, inputFileName, verboseMR ); + std::cerr << "*********************************" << std::endl; + benchmarkSpMV< Real, SparseMatrix_Ellpack >( benchmark, inputFileName, verboseMR ); + std::cerr << "*********************************" << std::endl; + benchmarkSpMV< Real, SparseMatrix_SlicedEllpack >( benchmark, inputFileName, verboseMR ); + std::cerr << "*********************************" << std::endl; // AdEllpack is broken -// result |= benchmarkSpMV< Real, Matrices::AdEllpack >( benchmark, inputFileName, verboseMR ); - result |= benchmarkSpMV< Real, Matrices::BiEllpack >( benchmark, inputFileName, verboseMR ); - return result; + // benchmarkSpMV< Real, Matrices::AdEllpack >( benchmark, inputFileName, verboseMR ); + benchmarkSpMV< Real, Matrices::BiEllpack >( benchmark, inputFileName, verboseMR ); } } // namespace Benchmarks diff --git a/src/Benchmarks/SpMV/tnl-benchmark-spmv.h b/src/Benchmarks/SpMV/tnl-benchmark-spmv.h index 77c079c4c562408a63182ca910c9ebfc5d68e111..65416f0432085f744ee66a80efb497242ef0db81 100644 --- a/src/Benchmarks/SpMV/tnl-benchmark-spmv.h +++ b/src/Benchmarks/SpMV/tnl-benchmark-spmv.h @@ -96,11 +96,11 @@ main( int argc, char* argv[] ) // * The guide on what parameters to use prints twice. // FIXME: When ./tnl-benchmark-spmv-dbg is called with '--help': // * The guide on what parameter to use print once. - // But then it CRASHES due to segfault: -// The program attempts to get unknown parameter openmp-enabled -// Aborting the program. -// terminate called after throwing an instance of 'int' -// [1] 17156 abort (core dumped) ~/tnl-dev/Debug/bin/./tnl-benchmark-spmv-dbg --help + // But then it CRASHES due to segfault: + // The program attempts to get unknown parameter openmp-enabled + // Aborting the program. + // terminate called after throwing an instance of 'int' + // [1] 17156 abort (core dumped) ~/tnl-dev/Debug/bin/./tnl-benchmark-spmv-dbg --help if( ! parseCommandLine( argc, argv, conf_desc, parameters ) ) { conf_desc.printUsage( argv[ 0 ] );