35 #ifndef _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
36 #define _BLAZE_MATH_SMP_OPENMP_DENSEMATRIX_H_
85 template<
typename MT1
89 inline void smpAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
118 template<
typename MT1
121 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
122 smpAssign( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
136 typedef IntrinsicTrait<typename MT1::ElementType> IT;
137 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
138 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
140 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
141 const bool lhsAligned ( (~lhs).isAligned() );
142 const bool rhsAligned ( (~rhs).isAligned() );
144 #pragma omp parallel shared( lhs, rhs )
146 const int threads ( omp_get_num_threads() );
147 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
148 const size_t equalShare ( (~lhs).
rows() / threads + addon );
149 const size_t rest ( equalShare & ( IT::size - 1UL ) );
150 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
152 #pragma omp for schedule(dynamic,1) nowait
153 for(
int i=0UL; i<threads; ++i )
155 const size_t row( i*rowsPerThread );
160 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
162 if( vectorizable && lhsAligned && rhsAligned ) {
163 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
164 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
166 else if( vectorizable && lhsAligned ) {
167 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
168 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
170 else if( vectorizable && rhsAligned ) {
171 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
172 assign( target, submatrix<aligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
175 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
176 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
202 template<
typename MT1
205 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
206 smpAssign( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
220 typedef IntrinsicTrait<typename MT1::ElementType> IT;
221 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
222 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
224 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
225 const bool lhsAligned ( (~lhs).isAligned() );
226 const bool rhsAligned ( (~rhs).isAligned() );
228 #pragma omp parallel shared( lhs, rhs )
230 const int threads ( omp_get_num_threads() );
231 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
232 const size_t equalShare ( (~lhs).
columns() / threads + addon );
233 const size_t rest ( equalShare & ( IT::size - 1UL ) );
234 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
236 #pragma omp for schedule(dynamic,1) nowait
237 for(
int i=0UL; i<threads; ++i )
239 const size_t column( i*colsPerThread );
244 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
246 if( vectorizable && lhsAligned && rhsAligned ) {
247 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
248 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
250 else if( vectorizable && lhsAligned ) {
251 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
252 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
254 else if( vectorizable && rhsAligned ) {
255 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
256 assign( target, submatrix<aligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
259 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
260 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
286 template<
typename MT1
289 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
290 smpAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
304 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
306 #pragma omp parallel shared( lhs, rhs )
308 const int threads ( omp_get_num_threads() );
309 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
310 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
312 #pragma omp for schedule(dynamic,1) nowait
313 for(
int i=0UL; i<threads; ++i )
315 const size_t row( i*rowsPerThread );
320 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
321 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
322 assign( target, submatrix<unaligned>( ~rhs,
row, 0UL, m, (~lhs).
columns() ) );
347 template<
typename MT1
350 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
351 smpAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
365 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
367 #pragma omp parallel shared( lhs, rhs )
369 const int threads ( omp_get_num_threads() );
370 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
371 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
373 #pragma omp for schedule(dynamic,1) nowait
374 for(
int i=0UL; i<threads; ++i )
376 const size_t column( i*colsPerThread );
381 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
382 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
383 assign( target, submatrix<unaligned>( ~rhs, 0UL,
column, (~lhs).
rows(), n ) );
408 template<
typename MT1
412 inline void smpAddAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
441 template<
typename MT1
444 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
445 smpAddAssign( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,rowMajor>& rhs )
459 typedef IntrinsicTrait<typename MT1::ElementType> IT;
460 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
461 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
463 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
464 const bool lhsAligned ( (~lhs).isAligned() );
465 const bool rhsAligned ( (~rhs).isAligned() );
467 #pragma omp parallel shared( lhs, rhs )
469 const int threads ( omp_get_num_threads() );
470 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
471 const size_t equalShare ( (~lhs).
rows() / threads + addon );
472 const size_t rest ( equalShare & ( IT::size - 1UL ) );
473 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
475 #pragma omp for schedule(dynamic,1) nowait
476 for(
int i=0UL; i<threads; ++i )
478 const size_t row( i*rowsPerThread );
483 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
485 if( vectorizable && lhsAligned && rhsAligned ) {
486 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
489 else if( vectorizable && lhsAligned ) {
490 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
493 else if( vectorizable && rhsAligned ) {
494 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
498 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
525 template<
typename MT1
528 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
529 smpAddAssign( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
543 typedef IntrinsicTrait<typename MT1::ElementType> IT;
544 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
545 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
547 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
548 const bool lhsAligned ( (~lhs).isAligned() );
549 const bool rhsAligned ( (~rhs).isAligned() );
551 #pragma omp parallel shared( lhs, rhs )
553 const int threads ( omp_get_num_threads() );
554 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
555 const size_t equalShare ( (~lhs).
columns() / threads + addon );
556 const size_t rest ( equalShare & ( IT::size - 1UL ) );
557 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
559 #pragma omp for schedule(dynamic,1) nowait
560 for(
int i=0UL; i<threads; ++i )
562 const size_t column( i*colsPerThread );
567 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
569 if( vectorizable && lhsAligned && rhsAligned ) {
570 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
573 else if( vectorizable && lhsAligned ) {
574 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
577 else if( vectorizable && rhsAligned ) {
578 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
582 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
609 template<
typename MT1
612 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
613 smpAddAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
627 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
629 #pragma omp parallel shared( lhs, rhs )
631 const int threads ( omp_get_num_threads() );
632 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
633 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
635 #pragma omp for schedule(dynamic,1) nowait
636 for(
int i=0UL; i<threads; ++i )
638 const size_t row( i*rowsPerThread );
643 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
644 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
670 template<
typename MT1
673 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
674 smpAddAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
688 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
690 #pragma omp parallel shared( lhs, rhs )
692 const int threads ( omp_get_num_threads() );
693 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
694 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
696 #pragma omp for schedule(dynamic,1) nowait
697 for(
int i=0UL; i<threads; ++i )
699 const size_t column( i*colsPerThread );
704 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
705 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
731 template<
typename MT1
735 inline void smpSubAssign( DenseMatrix<MT1,SO1>& lhs,
const Matrix<MT2,SO2>& rhs )
764 template<
typename MT1
767 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
768 smpSubAssign( 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 #pragma omp parallel shared( lhs, rhs )
792 const int threads ( omp_get_num_threads() );
793 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
794 const size_t equalShare ( (~lhs).
rows() / threads + addon );
795 const size_t rest ( equalShare & ( IT::size - 1UL ) );
796 const size_t rowsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
798 #pragma omp for schedule(dynamic,1) nowait
799 for(
int i=0UL; i<threads; ++i )
801 const size_t row( i*rowsPerThread );
806 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
808 if( vectorizable && lhsAligned && rhsAligned ) {
809 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
812 else if( vectorizable && lhsAligned ) {
813 AlignedTarget target( submatrix<aligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
816 else if( vectorizable && rhsAligned ) {
817 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
821 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
848 template<
typename MT1
851 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
852 smpSubAssign( DenseMatrix<MT1,SO>& lhs,
const DenseMatrix<MT2,columnMajor>& rhs )
866 typedef IntrinsicTrait<typename MT1::ElementType> IT;
867 typedef typename SubmatrixExprTrait<MT1,aligned>::Type AlignedTarget;
868 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
870 const bool vectorizable( MT1::vectorizable && MT2::vectorizable && IsSame<ET1,ET2>::value );
871 const bool lhsAligned ( (~lhs).isAligned() );
872 const bool rhsAligned ( (~rhs).isAligned() );
874 #pragma omp parallel shared( lhs, rhs )
876 const int threads ( omp_get_num_threads() );
877 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
878 const size_t equalShare ( (~lhs).
columns() / threads + addon );
879 const size_t rest ( equalShare & ( IT::size - 1UL ) );
880 const size_t colsPerThread( ( vectorizable && rest )?( equalShare - rest + IT::size ):( equalShare ) );
882 #pragma omp for schedule(dynamic,1) nowait
883 for(
int i=0UL; i<threads; ++i )
885 const size_t column( i*colsPerThread );
890 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
892 if( vectorizable && lhsAligned && rhsAligned ) {
893 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
896 else if( vectorizable && lhsAligned ) {
897 AlignedTarget target( submatrix<aligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
900 else if( vectorizable && rhsAligned ) {
901 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
905 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
932 template<
typename MT1
935 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
936 smpSubAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,rowMajor>& rhs )
950 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
952 #pragma omp parallel shared( lhs, rhs )
954 const int threads ( omp_get_num_threads() );
955 const size_t addon ( ( ( (~lhs).
rows() % threads ) != 0UL )? 1UL : 0UL );
956 const size_t rowsPerThread( (~lhs).
rows() / threads + addon );
958 #pragma omp for schedule(dynamic,1) nowait
959 for(
int i=0UL; i<threads; ++i )
961 const size_t row( i*rowsPerThread );
966 const size_t m( min( rowsPerThread, (~lhs).
rows() -
row ) );
967 UnalignedTarget target( submatrix<unaligned>( ~lhs,
row, 0UL, m, (~lhs).
columns() ) );
993 template<
typename MT1
996 inline typename EnableIfTrue< MT1::smpAssignable && MT2::smpAssignable >::Type
997 smpSubAssign( DenseMatrix<MT1,SO>& lhs,
const SparseMatrix<MT2,columnMajor>& rhs )
1011 typedef typename SubmatrixExprTrait<MT1,unaligned>::Type UnalignedTarget;
1013 #pragma omp parallel shared( lhs, rhs )
1015 const int threads ( omp_get_num_threads() );
1016 const size_t addon ( ( ( (~lhs).
columns() % threads ) != 0UL )? 1UL : 0UL );
1017 const size_t colsPerThread( (~lhs).
columns() / threads + addon );
1019 #pragma omp for schedule(dynamic,1) nowait
1020 for(
int i=0UL; i<threads; ++i )
1022 const size_t column( i*colsPerThread );
1027 const size_t n( min( colsPerThread, (~lhs).
columns() -
column ) );
1028 UnalignedTarget target( submatrix<unaligned>( ~lhs, 0UL,
column, (~lhs).
rows(), n ) );
1054 template<
typename MT1
1058 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:151
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:178
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 intrinsic trait.
Header file for the SparseMatrix base class.
Header file for the matrix storage order types.
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:121
Header file for the complete DenseSubmatrix implementation.
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:179
Header file for the serial section implementation.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2382
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:269
Header file for the EnableIf class template.
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:91
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:211
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:209
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:239
#define BLAZE_OPENMP_PARALLEL_MODE
Compilation switch for the OpenMP parallelization.This compilation switch enables/disables the OpenMP...
Definition: OpenMP.h:65
#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:154
System settings for the OpenMP parallelization.
#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:138
#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
Header file for the FunctionTrace class.