[eigen] malloc in Scalar x Matrix Matrix

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi,

I have an expressions of type
C.noalias() = alpha * A * B;
where alpha is a double and A, B and C are Maps of double Dynamic
Matrices of proper sizes.
I want to avoid any memory allocation but when I try to debug the
expression using EIGEN_RUNTIME_NO_MALLOC, I get an exception since
malloc is still used.
Only if I use the expression _without_ the scalar, i.e.,
C.noalias() = A * B;
I don't get an exception. Unfortunately, I do not have a minimal working
example. A minimal working example actually *works* (without throwing an
exception) but for reasons I do not understand,
I get an exception in my actual code, which is more complicated, even if
I first "remap" everything to the following expression:

const Map<const MatrixXd> A( _A.data(), _A.rows(), _A.cols()); /* size 2
x 10; _A, _B are templated Maps of RowMajor Dynamic Matrices; _C is a
normal reference to RowMajor Dynamic Matrix.*/
const Map<const MatrixXd> B( _B.data(), _B.rows(), _B.cols());  /* size
10 x 2*/
Map<MatrixXd> C( _C.data(), _C.rows(), _C.cols()); /* size 2 x 2*/
double v = 2.0;
// C.noalias() = A * B; // no memory allocation
C.noalias() = v * A * B; // memory allocation

Could you please give me a hint why I get this memory allocation? Since
I do not have a minimal working example that throws the exception, I
attach a backtrace of the exception in my actual code.
It seems that the matrix size of the lhs ("C.noalias()") somehow gets
lost within the Eigen code. At # 15 of the attached backtrace, the
matrix size is still known but afterwards it is set to 0 (I cannot print
the matrix size in #14 due to code inlining).

I use eigen 3.3.7-2 from arch linux.

Best regards,

Henrik
#0  0x000015554bd62755 in raise () from /usr/lib/libc.so.6
#1  0x000015554bd4d851 in abort () from /usr/lib/libc.so.6
#2  0x000015554bd4d727 in __assert_fail_base.cold () from /usr/lib/libc.so.6
#3  0x000015554bd5b026 in __assert_fail () from /usr/lib/libc.so.6
#4  0x0000555555c03def in Eigen::internal::check_that_malloc_is_allowed () at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:143
#5  0x0000555555c03cf1 in Eigen::internal::aligned_malloc (size=160) at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:155
#6  0x0000555555c03cd5 in Eigen::internal::conditional_aligned_malloc<true> (size=160) at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:214
#7  0x0000555555c09ce5 in Eigen::internal::conditional_aligned_new_auto<double, true> (size=20) at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:374
#8  0x0000555555c09c52 in Eigen::DenseStorage<double, -1, -1, -1, 0>::resize (this=0x7fffffff5ba0, size=20, rows=2, cols=10) at /usr/include/eigen3/Eigen/src/Core/DenseStorage.h:408
#9  0x0000555555c09be6 in Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::resize (this=0x7fffffff5ba0, rows=2, cols=10) at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:293
#10 0x0000555555f5940e in Eigen::internal::resize_if_allowed<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, double, double> (dst=..., src=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:720
#11 0x0000555555f59272 in Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::internal::assign_op<double, double> > (dst=..., src=..., 
    func=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:734
#12 0x0000555555f591f2 in Eigen::internal::Assignment<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::internal::assign_op<double, double>, Eigen::internal::Dense2Dense, void>::run (
    dst=..., src=..., func=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:879
#13 0x0000555555f5918d in Eigen::internal::call_assignment_no_alias<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::internal::assign_op<double, double> > (dst=..., src=..., func=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:836
#14 0x0000555555f5911f in Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::_set_noalias<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const> > (this=0x7fffffff5ba0, other=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/PlainObjectBase.h:732
[MATRIX/LHS SIZE KNOWN/CORRECT] #15 0x0000555555f590ad in Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::_init1<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const> > (this=0x7fffffff5ba0, other=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/PlainObjectBase.h:816
#16 0x0000555555f59007 in Eigen::Matrix<double, -1, -1, 0, -1, -1>::Matrix<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const> > (this=0x7fffffff5ba0, x=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/Matrix.h:294
#17 0x0000555555f58e86 in Eigen::internal::product_evaluator<Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 1>, 8, Eigen::DenseShape, Eigen::DenseShape, double, double>::product_evaluator (this=0x7fffffff5ba0, xpr=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/ProductEvaluators.h:446
#18 0x0000555555f58b18 in Eigen::internal::evaluator<Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 1> >::evaluator (
    this=0x7fffffff5ba0, xpr=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/ProductEvaluators.h:35
#19 0x0000555555f589bd in Eigen::internal::call_dense_assignment_loop<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 1>, Eigen::internal::assign_op<double, double> > (dst=..., src=..., func=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:730
#20 0x0000555555f58942 in Eigen::internal::Assignment<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 1>, Eigen::internal::assign_op<double, double>, Eigen::internal::Dense2Dense, void>::run (dst=..., src=..., func=...)
    at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:879
#21 0x0000555555f5889d in Eigen::internal::call_assignment_no_alias<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 1>, Eigen::internal::assign_op<double, double> > (dst=..., src=..., func=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:836
#22 0x0000555555f58573 in Eigen::internal::generic_product_impl<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::DenseShape, Eigen::DenseShape, 3>::evalTo<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> > > (dst=..., lhs=..., rhs=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/ProductEvaluators.h:397
#23 0x0000555555f5843c in Eigen::internal::generic_product_impl<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::DenseShape, Eigen::DenseShape, 8>::evalTo<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> > > (dst=..., lhs=..., rhs=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/products/GeneralMatrixMatrix.h:431
#24 0x0000555555f5835f in Eigen::internal::Assignment<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 0>, Eigen::internal::assign_op<double, double>, Eigen::internal::Dense2Dense, void>::run (dst=..., src=...)     at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/ProductEvaluators.h:148
#25 0x0000555555f5828d in Eigen::internal::call_assignment_no_alias<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 0>, Eigen::internal::assign_op<double, double> > (dst=..., src=..., func=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:836
#26 0x0000555555f3cf9d in Eigen::NoAlias<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::MatrixBase>::operator=<Eigen::Product<Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<double, double>, Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1> const> const, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> > const>, Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, 0> > (this=0x7fffffff5f70, other=...) at /usr/include/eigen3/unsupported/Eigen/CXX11/../../../Eigen/src/Core/NoAlias.h:42


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/