[eigen] malloc in Scalar x Matrix Matrix |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: "eigen@xxxxxxxxxxxxxxxxxxx" <eigen@xxxxxxxxxxxxxxxxxxx>
- Subject: [eigen] malloc in Scalar x Matrix Matrix
- From: "Larsson, Henrik R." <larsson@xxxxxxxxxxx>
- Date: Tue, 9 Jul 2019 16:22:38 +0000
- Accept-language: en-US
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=larsson@xxxxxxxxxxx;
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=caltech.onmicrosoft.com; s=selector1-caltech-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6Eu8YKCXpDQXGEMEIssNGbqG/keQIFVlV0btuKa1qUY=; b=mY2Srq9uks+r46B5yPIUuIWHsv+lxXrVoMl7LLCeweTjVRO+wRoIJFM3FNVZe3khsa5m6PNjWy85jJdv2PITVYTpfw8MarZTEdpZZVQrHHpeRim9W0EK1tvAfhhevnS9e7jRh+zcYUbQNbX4er4trfKRuEhGZ58hop4s61t33Z8=
- Thread-index: AQHVNnKGQVNDUGwaMEWEWoxhGL+8Ww==
- Thread-topic: malloc in Scalar x Matrix Matrix
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.
In this expression, 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