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 )
355 assign( ~lhs, ~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 )
399 assign( ~lhs, ~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() ) );
473 addAssign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
475 else if( vectorizable && lhsAligned ) {
476 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
477 addAssign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
479 else if( vectorizable && rhsAligned ) {
480 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
481 addAssign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
484 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
485 addAssign( target, submatrix<unaligned>( ~rhs,
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 ) );
547 addAssign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
549 else if( vectorizable && lhsAligned ) {
550 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
551 addAssign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
553 else if( vectorizable && rhsAligned ) {
554 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
555 addAssign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
558 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
559 addAssign( target, submatrix<unaligned>( ~rhs, 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() ) );
611 addAssign( target, submatrix<unaligned>( ~rhs,
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 ) );
662 addAssign( target, submatrix<unaligned>( ~rhs, 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 )
701 addAssign( ~lhs, ~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 )
745 addAssign( ~lhs, ~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() ) );
819 subAssign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
821 else if( vectorizable && lhsAligned ) {
822 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
823 subAssign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
825 else if( vectorizable && rhsAligned ) {
826 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
827 subAssign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
830 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
831 subAssign( target, submatrix<unaligned>( ~rhs,
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 ) );
893 subAssign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
895 else if( vectorizable && lhsAligned ) {
896 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
897 subAssign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
899 else if( vectorizable && rhsAligned ) {
900 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
901 subAssign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
904 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
905 subAssign( target, submatrix<unaligned>( ~rhs, 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() ) );
957 subAssign( target, submatrix<unaligned>( ~rhs,
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 ) );
1008 subAssign( target, submatrix<unaligned>( ~rhs, 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 )
1047 subAssign( ~lhs, ~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 )
1091 subAssign( ~lhs, ~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 )
1139 multAssign( ~lhs, ~rhs );
Header file for mathematical functions.
Header file for basic type definitions.
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:252
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:308
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:107
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.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
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:1682
Header file for the DenseMatrix base class.
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:2586
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:246
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:107
bool isSerialSectionActive()
Returns whether a serial section is active or not.
Definition: SerialSection.h:213
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
Header file for the complete SparseSubmatrix implementation.
bool isParallelSectionActive()
Returns whether a parallel section is active or not.
Definition: ParallelSection.h:213
#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:324
#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.