35 #ifndef _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
36 #define _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
90 template<
typename MT1
93 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
101 typedef IntrinsicTrait<typename MT1::ElementType> IT;
102 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
103 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
105 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
106 const bool lhsAligned ( (~lhs).isAligned() );
107 const bool rhsAligned ( (~rhs).isAligned() );
109 const int threads ( omp_get_num_threads() );
110 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
111 const size_t equalShare ( (~lhs).
rows() / threads + addon );
112 const size_t rest ( equalShare & ( IT::size - 1UL ) );
113 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
115 #pragma omp for schedule(dynamic,1) nowait
116 for(
int i=0UL; i<threads; ++i )
118 const size_t row( i*rowsPerThread );
123 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
125 if( vectorizable && lhsAligned && rhsAligned ) {
126 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
127 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
129 else if( vectorizable && lhsAligned ) {
130 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
131 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
133 else if( vectorizable && rhsAligned ) {
134 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
135 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
138 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
139 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
163 template<
typename MT1
166 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
174 typedef IntrinsicTrait<typename MT1::ElementType> IT;
175 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
176 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
178 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
179 const bool lhsAligned ( (~lhs).isAligned() );
180 const bool rhsAligned ( (~rhs).isAligned() );
182 const int threads ( omp_get_num_threads() );
183 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
184 const size_t equalShare ( (~lhs).
columns() / threads + addon );
185 const size_t rest ( equalShare & ( IT::size - 1UL ) );
186 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
188 #pragma omp for schedule(dynamic,1) nowait
189 for(
int i=0UL; i<threads; ++i )
191 const size_t column( i*colsPerThread );
196 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
198 if( vectorizable && lhsAligned && rhsAligned ) {
199 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
200 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
202 else if( vectorizable && lhsAligned ) {
203 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
204 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
206 else if( vectorizable && rhsAligned ) {
207 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
208 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
211 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
212 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
236 template<
typename MT1
239 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
247 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
249 const int threads ( omp_get_num_threads() );
250 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
251 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
253 #pragma omp for schedule(dynamic,1) nowait
254 for(
int i=0UL; i<threads; ++i )
256 const size_t row( i*rowsPerThread );
261 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
262 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
263 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
286 template<
typename MT1
289 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
297 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
299 const int threads ( omp_get_num_threads() );
300 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
301 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
303 #pragma omp for schedule(dynamic,1) nowait
304 for(
int i=0UL; i<threads; ++i )
306 const size_t column( i*colsPerThread );
311 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
312 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
313 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
338 template<
typename MT1
342 inline typename DisableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
343 smpAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
374 template<
typename MT1
378 inline typename EnableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
379 smpAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
395 #pragma omp parallel shared( lhs, rhs )
396 smpAssign_backend( ~lhs, ~rhs );
429 template<
typename MT1
432 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
440 typedef IntrinsicTrait<typename MT1::ElementType> IT;
441 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
442 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
444 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
445 const bool lhsAligned ( (~lhs).isAligned() );
446 const bool rhsAligned ( (~rhs).isAligned() );
448 const int threads ( omp_get_num_threads() );
449 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
450 const size_t equalShare ( (~lhs).
rows() / threads + addon );
451 const size_t rest ( equalShare & ( IT::size - 1UL ) );
452 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
454 #pragma omp for schedule(dynamic,1) nowait
455 for(
int i=0UL; i<threads; ++i )
457 const size_t row( i*rowsPerThread );
462 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
464 if( vectorizable && lhsAligned && rhsAligned ) {
465 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
468 else if( vectorizable && lhsAligned ) {
469 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
472 else if( vectorizable && rhsAligned ) {
473 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
477 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
503 template<
typename MT1
506 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
514 typedef IntrinsicTrait<typename MT1::ElementType> IT;
515 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
516 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
518 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
519 const bool lhsAligned ( (~lhs).isAligned() );
520 const bool rhsAligned ( (~rhs).isAligned() );
522 const int threads ( omp_get_num_threads() );
523 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
524 const size_t equalShare ( (~lhs).
columns() / threads + addon );
525 const size_t rest ( equalShare & ( IT::size - 1UL ) );
526 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
528 #pragma omp for schedule(dynamic,1) nowait
529 for(
int i=0UL; i<threads; ++i )
531 const size_t column( i*colsPerThread );
536 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
538 if( vectorizable && lhsAligned && rhsAligned ) {
539 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
542 else if( vectorizable && lhsAligned ) {
543 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
546 else if( vectorizable && rhsAligned ) {
547 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
551 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
577 template<
typename MT1
580 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
588 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
590 const int threads ( omp_get_num_threads() );
591 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
592 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
594 #pragma omp for schedule(dynamic,1) nowait
595 for(
int i=0UL; i<threads; ++i )
597 const size_t row( i*rowsPerThread );
602 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
603 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
628 template<
typename MT1
631 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
639 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
641 const int threads ( omp_get_num_threads() );
642 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
643 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
645 #pragma omp for schedule(dynamic,1) nowait
646 for(
int i=0UL; i<threads; ++i )
648 const size_t column( i*colsPerThread );
653 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
654 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
680 template<
typename MT1
684 inline typename DisableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
685 smpAddAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
716 template<
typename MT1
720 inline typename EnableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
721 smpAddAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
737 #pragma omp parallel shared( lhs, rhs )
738 smpAddAssign_backend( ~lhs, ~rhs );
771 template<
typename MT1
774 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
782 typedef IntrinsicTrait<typename MT1::ElementType> IT;
783 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
784 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
786 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
787 const bool lhsAligned ( (~lhs).isAligned() );
788 const bool rhsAligned ( (~rhs).isAligned() );
790 const int threads ( omp_get_num_threads() );
791 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
792 const size_t equalShare ( (~lhs).
rows() / threads + addon );
793 const size_t rest ( equalShare & ( IT::size - 1UL ) );
794 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
796 #pragma omp for schedule(dynamic,1) nowait
797 for(
int i=0UL; i<threads; ++i )
799 const size_t row( i*rowsPerThread );
804 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
806 if( vectorizable && lhsAligned && rhsAligned ) {
807 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
810 else if( vectorizable && lhsAligned ) {
811 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
814 else if( vectorizable && rhsAligned ) {
815 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
819 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
845 template<
typename MT1
848 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
856 typedef IntrinsicTrait<typename MT1::ElementType> IT;
857 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
858 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
860 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
861 const bool lhsAligned ( (~lhs).isAligned() );
862 const bool rhsAligned ( (~rhs).isAligned() );
864 const int threads ( omp_get_num_threads() );
865 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
866 const size_t equalShare ( (~lhs).
columns() / threads + addon );
867 const size_t rest ( equalShare & ( IT::size - 1UL ) );
868 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
870 #pragma omp for schedule(dynamic,1) nowait
871 for(
int i=0UL; i<threads; ++i )
873 const size_t column( i*colsPerThread );
878 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
880 if( vectorizable && lhsAligned && rhsAligned ) {
881 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
884 else if( vectorizable && lhsAligned ) {
885 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
888 else if( vectorizable && rhsAligned ) {
889 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
893 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
919 template<
typename MT1
922 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
930 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
932 const int threads ( omp_get_num_threads() );
933 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
934 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
936 #pragma omp for schedule(dynamic,1) nowait
937 for(
int i=0UL; i<threads; ++i )
939 const size_t row( i*rowsPerThread );
944 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
945 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
970 template<
typename MT1
973 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
981 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
983 const int threads ( omp_get_num_threads() );
984 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
985 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
987 #pragma omp for schedule(dynamic,1) nowait
988 for(
int i=0UL; i<threads; ++i )
990 const size_t column( i*colsPerThread );
995 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
996 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
1022 template<
typename MT1
1026 inline typename DisableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
1027 smpSubAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
1058 template<
typename MT1
1062 inline typename EnableIf< And< IsSMPAssignable<MT1>, IsSMPAssignable<MT2> > >::Type
1063 smpSubAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
1079 #pragma omp parallel shared( lhs, rhs )
1080 smpSubAssign_backend( ~lhs, ~rhs );
1112 template<
typename MT1
1116 inline void smpMultAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
Header file for mathematical functions.
void smpSubAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:152
void smpMultAssign(DenseVector< VT1, TF1 > &lhs, const Vector< VT2, TF2 > &rhs)
Default implementation of the SMP multiplication assignment of a vector to a dense vector...
Definition: DenseVector.h:179
Header file for the IsSame and IsStrictlySame type traits.
DisableIf< Or< IsComputation< MT >, IsTransExpr< MT > >, typename ColumnExprTrait< MT >::Type >::Type column(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific column of the given matrix.
Definition: Column.h:103
Header file for the And class template.
Header file for the intrinsic trait.
Header file for the SparseMatrix base class.
Header file for the matrix storage order types.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SMP_ASSIGNABLE(T)
Constraint on the data type.In case the given data type T is SMP-assignable (can be assigned by multi...
Definition: SMPAssignable.h:118
void smpAddAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP addition assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:122
Header file for the DisableIf class template.
Header file for the complete DenseSubmatrix implementation.
System settings for the shared-memory parallelization.
Header file for the IsSMPAssignable type trait.
Header file for the DenseMatrix base class.
void assign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the assignment of a matrix to a matrix.
Definition: Matrix.h:271
Header file for the serial section implementation.
Header file for the parallel section implementation.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2406
void multAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the multiplication assignment of a matrix to a matrix.
Definition: Matrix.h:361
Header file for the EnableIf class template.
#define BLAZE_PARALLEL_SECTION
Section for the debugging of the shared-memory parallelization.During the shared-memory parallel (SMP...
Definition: ParallelSection.h:245
void smpAssign(DenseMatrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:92
DisableIf< Or< IsComputation< MT >, IsTransExpr< MT > >, typename RowExprTrait< MT >::Type >::Type row(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific row of the given matrix.
Definition: Row.h:103
bool isSerialSectionActive()
Returns whether a serial section is active or not.
Definition: SerialSection.h:212
Header file for the SubmatrixExprTrait class template.
Header file for run time assertion macros.
void addAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the addition assignment of a matrix to a matrix.
Definition: Matrix.h:301
Header file for the complete SparseSubmatrix implementation.
void subAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the subtraction assignment of a matrix to matrix.
Definition: Matrix.h:331
bool isParallelSectionActive()
Returns whether a parallel section is active or not.
Definition: ParallelSection.h:212
#define BLAZE_OPENMP_PARALLEL_MODE
Compilation switch for the OpenMP parallelization.This compilation switch enables/disables the OpenMP...
Definition: SMP.h:67
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:157
size_t columns(const Matrix< MT, SO > &m)
Returns the current number of columns of the matrix.
Definition: Matrix.h:170
#define BLAZE_STATIC_ASSERT(expr)
Compile time assertion macro.In case of an invalid compile time expression, a compilation error is cr...
Definition: StaticAssert.h:143
size_t rows(const Matrix< MT, SO > &m)
Returns the current number of rows of the matrix.
Definition: Matrix.h:154
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
Constraint on the data type.
Header file for the FunctionTrace class.