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

Reply via email to