From 0e83d3759580a23d17dd9caec2cb03e0f855cd1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkjak@fjfi.cvut.cz> Date: Sun, 25 Jun 2017 15:40:08 +0200 Subject: [PATCH] Added getRowLengthFast method to matrices --- src/TNL/Matrices/CSR.h | 3 +++ src/TNL/Matrices/CSR_impl.h | 9 +++++++++ src/TNL/Matrices/ChunkedEllpack.h | 3 +++ src/TNL/Matrices/ChunkedEllpack_impl.h | 14 +++++++++++++- src/TNL/Matrices/Dense.h | 3 +++ src/TNL/Matrices/Dense_impl.h | 9 +++++++++ src/TNL/Matrices/Ellpack.h | 3 +++ src/TNL/Matrices/Ellpack_impl.h | 9 +++++++++ src/TNL/Matrices/Multidiagonal.h | 3 +++ src/TNL/Matrices/Multidiagonal_impl.h | 16 ++++++++++++++++ src/TNL/Matrices/SlicedEllpack.h | 3 +++ src/TNL/Matrices/SlicedEllpack_impl.h | 11 +++++++++++ src/TNL/Matrices/Tridiagonal.h | 3 +++ src/TNL/Matrices/Tridiagonal_impl.h | 9 +++++++++ 14 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/TNL/Matrices/CSR.h b/src/TNL/Matrices/CSR.h index f274200b22..97b046fba6 100644 --- a/src/TNL/Matrices/CSR.h +++ b/src/TNL/Matrices/CSR.h @@ -63,6 +63,9 @@ class CSR : public Sparse< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + template< typename Real2, typename Device2, typename Index2 > void setLike( const CSR< Real2, Device2, Index2 >& matrix ); diff --git a/src/TNL/Matrices/CSR_impl.h b/src/TNL/Matrices/CSR_impl.h index 3563fa789e..abc4e28231 100644 --- a/src/TNL/Matrices/CSR_impl.h +++ b/src/TNL/Matrices/CSR_impl.h @@ -117,6 +117,15 @@ template< typename Real, typename Device, typename Index > Index CSR< Real, Device, Index >::getRowLength( const IndexType row ) const +{ + return this->rowPointers.getElement( row + 1 ) - this->rowPointers.getElement( row ); +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index CSR< Real, Device, Index >::getRowLengthFast( const IndexType row ) const { return this->rowPointers[ row + 1 ] - this->rowPointers[ row ]; } diff --git a/src/TNL/Matrices/ChunkedEllpack.h b/src/TNL/Matrices/ChunkedEllpack.h index dace4893cc..c86081216e 100644 --- a/src/TNL/Matrices/ChunkedEllpack.h +++ b/src/TNL/Matrices/ChunkedEllpack.h @@ -92,6 +92,9 @@ class ChunkedEllpack : public Sparse< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + template< typename Real2, typename Device2, typename Index2 > void setLike( const ChunkedEllpack< Real2, Device2, Index2 >& matrix ); diff --git a/src/TNL/Matrices/ChunkedEllpack_impl.h b/src/TNL/Matrices/ChunkedEllpack_impl.h index 3840384b90..bd94540b79 100644 --- a/src/TNL/Matrices/ChunkedEllpack_impl.h +++ b/src/TNL/Matrices/ChunkedEllpack_impl.h @@ -262,9 +262,21 @@ template< typename Real, typename Index > Index ChunkedEllpack< Real, Device, Index >::getRowLength( const IndexType row ) const { - const IndexType& sliceIndex = rowToSliceMapping[ row ]; + const IndexType& sliceIndex = rowToSliceMapping.getElement( row ); TNL_ASSERT( sliceIndex < this->rows, ); const IndexType& chunkSize = slices.getElement( sliceIndex ).chunkSize; + return rowPointers.getElement( row + 1 ) - rowPointers.getElement( row ); +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index ChunkedEllpack< Real, Device, Index >::getRowLengthFast( const IndexType row ) const +{ + const IndexType& sliceIndex = rowToSliceMapping[ row ]; + TNL_ASSERT( sliceIndex < this->rows, ); + const IndexType& chunkSize = slices[ sliceIndex ].chunkSize; return rowPointers[ row + 1 ] - rowPointers[ row ]; } diff --git a/src/TNL/Matrices/Dense.h b/src/TNL/Matrices/Dense.h index bd5daa284d..5d94b5bda6 100644 --- a/src/TNL/Matrices/Dense.h +++ b/src/TNL/Matrices/Dense.h @@ -66,6 +66,9 @@ class Dense : public Matrix< Real, Device, Index > */ IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + IndexType getMaxRowLength() const; IndexType getNumberOfMatrixElements() const; diff --git a/src/TNL/Matrices/Dense_impl.h b/src/TNL/Matrices/Dense_impl.h index 55282e8d62..08f66239c3 100644 --- a/src/TNL/Matrices/Dense_impl.h +++ b/src/TNL/Matrices/Dense_impl.h @@ -99,6 +99,15 @@ Index Dense< Real, Device, Index >::getRowLength( const IndexType row ) const return this->getColumns(); } +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index Dense< Real, Device, Index >::getRowLengthFast( const IndexType row ) const +{ + return this->getColumns(); +} + template< typename Real, typename Device, typename Index > diff --git a/src/TNL/Matrices/Ellpack.h b/src/TNL/Matrices/Ellpack.h index 65f06a550e..4e1b92b949 100644 --- a/src/TNL/Matrices/Ellpack.h +++ b/src/TNL/Matrices/Ellpack.h @@ -56,6 +56,9 @@ class Ellpack : public Sparse< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + template< typename Real2, typename Device2, typename Index2 > void setLike( const Ellpack< Real2, Device2, Index2 >& matrix ); diff --git a/src/TNL/Matrices/Ellpack_impl.h b/src/TNL/Matrices/Ellpack_impl.h index 9f12aee4c9..ca23f4168d 100644 --- a/src/TNL/Matrices/Ellpack_impl.h +++ b/src/TNL/Matrices/Ellpack_impl.h @@ -113,6 +113,15 @@ Index Ellpack< Real, Device, Index >::getRowLength( const IndexType row ) const return this->rowLengths; } +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index Ellpack< Real, Device, Index >::getRowLengthFast( const IndexType row ) const +{ + return this->rowLengths; +} + template< typename Real, typename Device, typename Index > diff --git a/src/TNL/Matrices/Multidiagonal.h b/src/TNL/Matrices/Multidiagonal.h index 058c05217e..884e804ec3 100644 --- a/src/TNL/Matrices/Multidiagonal.h +++ b/src/TNL/Matrices/Multidiagonal.h @@ -53,6 +53,9 @@ class Multidiagonal : public Matrix< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + IndexType getMaxRowLength() const; template< typename Vector > diff --git a/src/TNL/Matrices/Multidiagonal_impl.h b/src/TNL/Matrices/Multidiagonal_impl.h index 91588a515e..ea8c4050db 100644 --- a/src/TNL/Matrices/Multidiagonal_impl.h +++ b/src/TNL/Matrices/Multidiagonal_impl.h @@ -105,6 +105,22 @@ Index Multidiagonal< Real, Device, Index >::getRowLength( const IndexType row ) return rowLength; } +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index Multidiagonal< Real, Device, Index >::getRowLengthFast( const IndexType row ) const +{ + IndexType rowLength( 0 ); + for( IndexType i = 0; i < diagonalsShift.getSize(); i++ ) + { + const IndexType column = row + diagonalsShift[ i ]; + if( column >= 0 && column < this->getColumns() ) + rowLength++; + } + return rowLength; +} + template< typename Real, typename Device, typename Index > diff --git a/src/TNL/Matrices/SlicedEllpack.h b/src/TNL/Matrices/SlicedEllpack.h index ef1d542bf3..2bd6e762d7 100644 --- a/src/TNL/Matrices/SlicedEllpack.h +++ b/src/TNL/Matrices/SlicedEllpack.h @@ -84,6 +84,9 @@ class SlicedEllpack : public Sparse< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + template< typename Real2, typename Device2, typename Index2 > void setLike( const SlicedEllpack< Real2, Device2, Index2, SliceSize >& matrix ); diff --git a/src/TNL/Matrices/SlicedEllpack_impl.h b/src/TNL/Matrices/SlicedEllpack_impl.h index 0f22e69b9c..bcbed7d986 100644 --- a/src/TNL/Matrices/SlicedEllpack_impl.h +++ b/src/TNL/Matrices/SlicedEllpack_impl.h @@ -108,6 +108,17 @@ Index SlicedEllpack< Real, Device, Index, SliceSize >::getRowLength( const Index return this->sliceCompressedRowLengths.getElement( slice ); } +template< typename Real, + typename Device, + typename Index, + int SliceSize > +__cuda_callable__ +Index SlicedEllpack< Real, Device, Index, SliceSize >::getRowLengthFast( const IndexType row ) const +{ + const IndexType slice = row / SliceSize; + return this->sliceCompressedRowLengths[ slice ]; +} + template< typename Real, typename Device, typename Index, diff --git a/src/TNL/Matrices/Tridiagonal.h b/src/TNL/Matrices/Tridiagonal.h index 396ea25192..5ebd526231 100644 --- a/src/TNL/Matrices/Tridiagonal.h +++ b/src/TNL/Matrices/Tridiagonal.h @@ -54,6 +54,9 @@ class Tridiagonal : public Matrix< Real, Device, Index > IndexType getRowLength( const IndexType row ) const; + __cuda_callable__ + IndexType getRowLengthFast( const IndexType row ) const; + IndexType getMaxRowLength() const; template< typename Real2, typename Device2, typename Index2 > diff --git a/src/TNL/Matrices/Tridiagonal_impl.h b/src/TNL/Matrices/Tridiagonal_impl.h index c1239627da..fb070c7f09 100644 --- a/src/TNL/Matrices/Tridiagonal_impl.h +++ b/src/TNL/Matrices/Tridiagonal_impl.h @@ -98,6 +98,15 @@ template< typename Real, typename Device, typename Index > Index Tridiagonal< Real, Device, Index >::getRowLength( const IndexType row ) const +{ + return this->getRowLengthFast( row ); +} + +template< typename Real, + typename Device, + typename Index > +__cuda_callable__ +Index Tridiagonal< Real, Device, Index >::getRowLengthFast( const IndexType row ) const { const IndexType diagonalLength = min( this->getRows(), this->getColumns() ); if( row == 0 ) -- GitLab