* Fix a compilation issue with large fixed-size matrices: the unrollers were always instanciated.

* the unrolling limits are configurable at compile time.
This commit is contained in:
Gael Guennebaud 2008-03-05 13:18:19 +00:00
parent 861c6f4c9b
commit 8e0d548039
9 changed files with 76 additions and 45 deletions

View File

@ -77,8 +77,9 @@ Scalar MatrixBase<Scalar, Derived>::dot(const MatrixBase<Scalar, OtherDerived>&
Scalar res;
if(EIGEN_UNROLLED_LOOPS
&& Traits::SizeAtCompileTime != Dynamic
&& Traits::SizeAtCompileTime <= 16)
DotUnroller<Traits::SizeAtCompileTime-1, Traits::SizeAtCompileTime,
&& Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT)
DotUnroller<Traits::SizeAtCompileTime-1,
Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT ? Traits::SizeAtCompileTime : Dynamic,
Derived, MatrixBase<Scalar, OtherDerived> >
::run(*static_cast<const Derived*>(this), other, res);
else

View File

@ -49,6 +49,8 @@
cout << x.row(0) << endl;
}
* \endcode
*
* \nosubgrouping
*/
template<typename Scalar, typename Derived> class MatrixBase
{

View File

@ -106,9 +106,12 @@ Derived& MatrixBase<Scalar, Derived>
// copying a vector expression into a vector
{
assert(size() == other.size());
if(EIGEN_UNROLLED_LOOPS && Traits::SizeAtCompileTime != Dynamic && Traits::SizeAtCompileTime <= 25)
if(EIGEN_UNROLLED_LOOPS
&& Traits::SizeAtCompileTime != Dynamic
&& Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_OPEQUAL)
VectorOperatorEqualsUnroller
<Derived, OtherDerived, Traits::SizeAtCompileTime>::run
<Derived, OtherDerived,
Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_OPEQUAL ? Traits::SizeAtCompileTime : Dynamic>::run
(*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other));
else
for(int i = 0; i < size(); i++)
@ -120,10 +123,11 @@ Derived& MatrixBase<Scalar, Derived>
assert(rows() == other.rows() && cols() == other.cols());
if(EIGEN_UNROLLED_LOOPS
&& Traits::SizeAtCompileTime != Dynamic
&& Traits::SizeAtCompileTime <= 25)
&& Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_OPEQUAL)
{
MatrixOperatorEqualsUnroller
<Derived, OtherDerived, Traits::SizeAtCompileTime>::run
<Derived, OtherDerived,
Traits::SizeAtCompileTime <= EIGEN_UNROLLING_LIMIT_OPEQUAL ? Traits::SizeAtCompileTime : Dynamic>::run
(*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other));
}
else

View File

@ -106,9 +106,10 @@ template<typename Lhs, typename Rhs> class Product : NoOperatorEquals,
Scalar res;
if(EIGEN_UNROLLED_LOOPS
&& Lhs::Traits::ColsAtCompileTime != Dynamic
&& Lhs::Traits::ColsAtCompileTime <= 16)
&& Lhs::Traits::ColsAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT)
ProductUnroller<Lhs::Traits::ColsAtCompileTime-1,
Lhs::Traits::ColsAtCompileTime, LhsRef, RhsRef>
Lhs::Traits::ColsAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT ? Lhs::Traits::ColsAtCompileTime : Dynamic,
LhsRef, RhsRef>
::run(row, col, m_lhs, m_rhs, res);
else
{

View File

@ -61,8 +61,11 @@ Scalar MatrixBase<Scalar, Derived>::trace() const
{
assert(rows() == cols());
Scalar res;
if(EIGEN_UNROLLED_LOOPS && Traits::RowsAtCompileTime != Dynamic && Traits::RowsAtCompileTime <= 16)
TraceUnroller<Traits::RowsAtCompileTime-1, Traits::RowsAtCompileTime, Derived>
if(EIGEN_UNROLLED_LOOPS
&& Traits::RowsAtCompileTime != Dynamic
&& Traits::RowsAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT)
TraceUnroller<Traits::RowsAtCompileTime-1,
Traits::RowsAtCompileTime <= EIGEN_UNROLLING_LIMIT_PRODUCT ? Traits::RowsAtCompileTime : Dynamic, Derived>
::run(*static_cast<const Derived*>(this), res);
else
{

View File

@ -31,6 +31,20 @@
#define EIGEN_UNROLLED_LOOPS (true)
#endif
/** Defines the maximal loop size (i.e., the matrix size NxM) to enable
* meta unrolling of operator=.
*/
#ifndef EIGEN_UNROLLING_LIMIT_OPEQUAL
#define EIGEN_UNROLLING_LIMIT_OPEQUAL 25
#endif
/** Defines the maximal loop size to enable meta unrolling
* of the matrix product, dot product and trace.
*/
#ifndef EIGEN_UNROLLING_LIMIT_PRODUCT
#define EIGEN_UNROLLING_LIMIT_PRODUCT 16
#endif
#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER RowMajor
#else

View File

@ -104,6 +104,8 @@ void EigenTest::testAdjoint()
adjoint(MatrixXi(8, 12));
adjoint(MatrixXcd(20, 20));
}
// test a large matrix only once
adjoint(Matrix<float, 100, 100>());
}
} // namespace Eigen

View File

@ -89,6 +89,7 @@ void EigenTest::testBasicStuff()
basicStuff(MatrixXcf(3, 3));
basicStuff(MatrixXi(8, 12));
basicStuff(MatrixXcd(20, 20));
basicStuff(Matrix<float, 100, 100>());
}
}

View File

@ -94,6 +94,9 @@ void EigenTest::testProduct()
product(MatrixXi(8, 12));
product(MatrixXcd(20, 20));
}
// test a large matrix only once
product(Matrix<float, 100, 100>());
}
} // namespace Eigen