35 #ifndef _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
36 #define _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
93 template<
typename MT1
96 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
104 typedef IntrinsicTrait<typename MT1::ElementType> IT;
105 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
106 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
108 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
109 const bool lhsAligned ( (~lhs).isAligned() );
110 const bool rhsAligned ( (~rhs).isAligned() );
112 const int threads ( omp_get_num_threads() );
113 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
114 const size_t equalShare ( (~lhs).
rows() / threads + addon );
115 const size_t rest ( equalShare & (
IT::size - 1UL ) );
116 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
118 #pragma omp for schedule(dynamic,1) nowait
119 for(
int i=0UL; i<threads; ++i )
121 const size_t row( i*rowsPerThread );
126 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
128 if( vectorizable && lhsAligned && rhsAligned ) {
129 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
130 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
132 else if( vectorizable && lhsAligned ) {
133 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
134 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
136 else if( vectorizable && rhsAligned ) {
137 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
138 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
141 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
142 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
166 template<
typename MT1
169 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
177 typedef IntrinsicTrait<typename MT1::ElementType> IT;
178 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
179 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
181 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
182 const bool lhsAligned ( (~lhs).isAligned() );
183 const bool rhsAligned ( (~rhs).isAligned() );
185 const int threads ( omp_get_num_threads() );
186 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
187 const size_t equalShare ( (~lhs).
columns() / threads + addon );
188 const size_t rest ( equalShare & (
IT::size - 1UL ) );
189 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
191 #pragma omp for schedule(dynamic,1) nowait
192 for(
int i=0UL; i<threads; ++i )
194 const size_t column( i*colsPerThread );
201 if( vectorizable && lhsAligned && rhsAligned ) {
202 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
203 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
205 else if( vectorizable && lhsAligned ) {
206 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
207 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
209 else if( vectorizable && rhsAligned ) {
210 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
211 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
214 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
215 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
239 template<
typename MT1
242 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
250 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
252 const int threads ( omp_get_num_threads() );
253 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
254 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
256 #pragma omp for schedule(dynamic,1) nowait
257 for(
int i=0UL; i<threads; ++i )
259 const size_t row( i*rowsPerThread );
264 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
265 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
266 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
289 template<
typename MT1
292 void smpAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
300 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
302 const int threads ( omp_get_num_threads() );
303 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
304 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
306 #pragma omp for schedule(dynamic,1) nowait
307 for(
int i=0UL; i<threads; ++i )
309 const size_t column( i*colsPerThread );
315 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
316 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
341 template<
typename MT1
345 inline typename EnableIf< And< IsDenseMatrix<MT1>
346 , Or< Not< IsSMPAssignable<MT1> >
347 , Not< IsSMPAssignable<MT2> > > > >::Type
348 smpAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
379 template<
typename MT1
383 inline typename EnableIf< And< IsDenseMatrix<MT1>
384 , IsSMPAssignable<MT1>
385 , IsSMPAssignable<MT2> > >::Type
386 smpAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
402 #pragma omp parallel shared( lhs, rhs )
403 smpAssign_backend( ~lhs, ~rhs );
436 template<
typename MT1
439 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
447 typedef IntrinsicTrait<typename MT1::ElementType> IT;
448 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
449 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
451 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
452 const bool lhsAligned ( (~lhs).isAligned() );
453 const bool rhsAligned ( (~rhs).isAligned() );
455 const int threads ( omp_get_num_threads() );
456 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
457 const size_t equalShare ( (~lhs).
rows() / threads + addon );
458 const size_t rest ( equalShare & (
IT::size - 1UL ) );
459 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
461 #pragma omp for schedule(dynamic,1) nowait
462 for(
int i=0UL; i<threads; ++i )
464 const size_t row( i*rowsPerThread );
469 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
471 if( vectorizable && lhsAligned && rhsAligned ) {
472 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
475 else if( vectorizable && lhsAligned ) {
476 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
479 else if( vectorizable && rhsAligned ) {
480 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
484 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
510 template<
typename MT1
513 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
521 typedef IntrinsicTrait<typename MT1::ElementType> IT;
522 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
523 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
525 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
526 const bool lhsAligned ( (~lhs).isAligned() );
527 const bool rhsAligned ( (~rhs).isAligned() );
529 const int threads ( omp_get_num_threads() );
530 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
531 const size_t equalShare ( (~lhs).
columns() / threads + addon );
532 const size_t rest ( equalShare & (
IT::size - 1UL ) );
533 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
535 #pragma omp for schedule(dynamic,1) nowait
536 for(
int i=0UL; i<threads; ++i )
538 const size_t column( i*colsPerThread );
545 if( vectorizable && lhsAligned && rhsAligned ) {
546 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
549 else if( vectorizable && lhsAligned ) {
550 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
553 else if( vectorizable && rhsAligned ) {
554 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
558 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
584 template<
typename MT1
587 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
595 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
597 const int threads ( omp_get_num_threads() );
598 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
599 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
601 #pragma omp for schedule(dynamic,1) nowait
602 for(
int i=0UL; i<threads; ++i )
604 const size_t row( i*rowsPerThread );
609 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
610 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
635 template<
typename MT1
638 void smpAddAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
646 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
648 const int threads ( omp_get_num_threads() );
649 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
650 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
652 #pragma omp for schedule(dynamic,1) nowait
653 for(
int i=0UL; i<threads; ++i )
655 const size_t column( i*colsPerThread );
661 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
687 template<
typename MT1
691 inline typename EnableIf< And< IsDenseMatrix<MT1>
692 , Or< Not< IsSMPAssignable<MT1> >
693 , Not< IsSMPAssignable<MT2> > > > >::Type
694 smpAddAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
725 template<
typename MT1
729 inline typename EnableIf< And< IsDenseMatrix<MT1>
730 , IsSMPAssignable<MT1>
731 , IsSMPAssignable<MT2> > >::Type
732 smpAddAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
748 #pragma omp parallel shared( lhs, rhs )
749 smpAddAssign_backend( ~lhs, ~rhs );
782 template<
typename MT1
785 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
793 typedef IntrinsicTrait<typename MT1::ElementType> IT;
794 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
795 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
797 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
798 const bool lhsAligned ( (~lhs).isAligned() );
799 const bool rhsAligned ( (~rhs).isAligned() );
801 const int threads ( omp_get_num_threads() );
802 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
803 const size_t equalShare ( (~lhs).
rows() / threads + addon );
804 const size_t rest ( equalShare & (
IT::size - 1UL ) );
805 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
807 #pragma omp for schedule(dynamic,1) nowait
808 for(
int i=0UL; i<threads; ++i )
810 const size_t row( i*rowsPerThread );
815 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
817 if( vectorizable && lhsAligned && rhsAligned ) {
818 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
821 else if( vectorizable && lhsAligned ) {
822 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
825 else if( vectorizable && rhsAligned ) {
826 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
830 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
856 template<
typename MT1
859 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
867 typedef IntrinsicTrait<typename MT1::ElementType> IT;
868 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
869 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
871 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
872 const bool lhsAligned ( (~lhs).isAligned() );
873 const bool rhsAligned ( (~rhs).isAligned() );
875 const int threads ( omp_get_num_threads() );
876 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
877 const size_t equalShare ( (~lhs).
columns() / threads + addon );
878 const size_t rest ( equalShare & (
IT::size - 1UL ) );
879 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest +
IT::size ):( equalShare ) );
881 #pragma omp for schedule(dynamic,1) nowait
882 for(
int i=0UL; i<threads; ++i )
884 const size_t column( i*colsPerThread );
891 if( vectorizable && lhsAligned && rhsAligned ) {
892 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
895 else if( vectorizable && lhsAligned ) {
896 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
899 else if( vectorizable && rhsAligned ) {
900 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
904 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
930 template<
typename MT1
933 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
941 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
943 const int threads ( omp_get_num_threads() );
944 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
945 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
947 #pragma omp for schedule(dynamic,1) nowait
948 for(
int i=0UL; i<threads; ++i )
950 const size_t row( i*rowsPerThread );
955 const size_t m(
min( rowsPerThread, (~lhs).
rows() -
row ) );
956 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
981 template<
typename MT1
984 void smpSubAssign_backend( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
992 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
994 const int threads ( omp_get_num_threads() );
995 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
996 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
998 #pragma omp for schedule(dynamic,1) nowait
999 for(
int i=0UL; i<threads; ++i )
1001 const size_t column( i*colsPerThread );
1007 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
1033 template<
typename MT1
1037 inline typename EnableIf< And< IsDenseMatrix<MT1>
1038 , Or< Not< IsSMPAssignable<MT1> >
1039 , Not< IsSMPAssignable<MT2> > > > >::Type
1040 smpSubAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
1071 template<
typename MT1
1075 inline typename EnableIf< And< IsDenseMatrix<MT1>
1076 , IsSMPAssignable<MT1>
1077 , IsSMPAssignable<MT2> > >::Type
1078 smpSubAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
1094 #pragma omp parallel shared( lhs, rhs )
1095 smpSubAssign_backend( ~lhs, ~rhs );
1127 template<
typename MT1
1131 inline typename EnableIf< IsDenseMatrix<MT1> >::Type
1132 smpMultAssign( Matrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
Header file for mathematical functions.
BLAZE_ALWAYS_INLINE 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:879
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:258
Header file for the IsSame and IsStrictlySame type traits.
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix)
Returns the current number of rows of the matrix.
Definition: Matrix.h:316
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
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 Or class template.
const MT::ElementType min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:947
Header file for the DenseMatrix base class.
BLAZE_ALWAYS_INLINE 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:635
Header file for the Not class template.
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:2476
Header file for the IsDenseMatrix type trait.
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
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
EnableIf< IsDenseMatrix< MT1 > >::Type smpSubAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP subtraction assignment of a matrix to dense matrix.
Definition: DenseMatrix.h:160
Header file for the SubmatrixExprTrait class template.
Header file for run time assertion macros.
EnableIf< IsDenseMatrix< MT1 > >::Type smpAssign(Matrix< MT1, SO1 > &lhs, const Matrix< MT2, SO2 > &rhs)
Default implementation of the SMP assignment of a matrix to a dense matrix.
Definition: DenseMatrix.h:98
BLAZE_ALWAYS_INLINE 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:742
Header file for the complete SparseSubmatrix implementation.
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
EnableIf< IsDenseMatrix< MT1 > >::Type smpAddAssign(Matrix< 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:129
#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
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix)
Returns the current number of columns of the matrix.
Definition: Matrix.h:332
Header file for basic type definitions.
#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
EnableIf< IsDenseVector< VT1 > >::Type smpMultAssign(Vector< 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:189
#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.
BLAZE_ALWAYS_INLINE 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:849