Ceres程序崩溃

今儿在用Ceres的库的时候,程序莫名崩溃,gdb看了下堆栈信息:

#0  0x0000000000428045 in _mm256_store_pd (__A=..., __P=<optimized out>)
    at /usr/lib/gcc/x86_64-linux-gnu/5/include/avxintrin.h:842
#1  Eigen::internal::pstore<double, double __vector(4)>(double*, double __vector(4) const&) (from=..., to=<optimized out>)
    at /usr/include/eigen3/Eigen/src/Core/arch/AVX/PacketMath.h:245
#2  Eigen::internal::pstoret<double, double __vector(4), 32>(double*, double __vector(4) const&) (from=..., to=<optimized out>)
    at /usr/include/eigen3/Eigen/src/Core/GenericPacketMath.h:516
#3  Eigen::internal::assign_op<double>::assignPacket<32, double __vector(4)>(double*, double __vector(4) const&) const (b=..., a=<optimized out>, 
    this=<optimized out>)
    at /usr/include/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h:28
#4  Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::assign_op<double>, 0>::assignPacket<32, 32, double __vector(4)>(long, long) (col=<optimized out>, 
    row=<optimized out>, this=<synthetic pointer>)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:619
#5  Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::assign_op<double>, 0>::assignPacketByOuterInner<32, 32, double __vector(4)>(long, long) (inner=0, outer=0, 
    this=<synthetic pointer>)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:633
#6  Eigen::internal::copy_using_evaluator_innervec_CompleteUnrolling<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::assign_op<double>, 0>, 0, 4>::run (
    kernel=<synthetic pointer>, kernel=<synthetic pointer>)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:265
#7  Eigen::internal::dense_assignment_loop<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::evaluator<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Eigen::internal::assign_op<double>, 0>, 2, 2>::run (kernel=<synthetic pointer>)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:460
#8  Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::internal::assign_op<double> > (func=..., src=..., dst=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:680
#9  Eigen::internal::Assignment<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::internal::assign_op<double>, Eigen::internal::Dense2Dense, double>::run (func=..., src=..., dst=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:827
#10 Eigen::internal::call_assignment_no_alias<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::internal::assign_op<double> >
    (func=..., src=..., dst=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:780
#11 Eigen::internal::call_assignment<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::internal::assign_op<double> >(Eigen::Matrix<double, 4, 1, 0, 4, 1>&, Eigen::Matrix<double, 4, 1, 0, 4, 1> const&, Eigen::internal::assign_op<double> const&, Eigen::internal::enable_if<!Eigen::internal::evaluator_assume_aliasing<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::internal::evaluator_traits<Eigen::Matrix<double, 4, 1, 0, 4, 1> >::Shape>::value, void*>::type) (func=..., src=..., dst=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:743
#12 Eigen::internal::call_assignment<Eigen::Matrix<double, 4, 1, 0, 4, 1>, Eigen::Matrix<double, 4, 1, 0, 4, 1> > (src=..., dst=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:721
#13 Eigen::PlainObjectBase<Eigen::Matrix<double, 4, 1, 0, 4, 1> >::_set<Eigen::Matrix<double, 4, 1, 0, 4, 1> > (other=..., this=0x7ffff003b590)
    at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:682
#14 Eigen::Matrix<double, 4, 1, 0, 4, 1>::operator= (other=..., 
    this=0x7ffff003b590) at /usr/include/eigen3/Eigen/src/Core/Matrix.h:208
#15 Eigen::QuaternionBase<Eigen::Quaternion<double, 0> >::operator= (
    other=..., this=0x7ffff003b590)
    at /usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:486
#16 Eigen::Quaternion<double, 0>::operator= (other=..., this=0x7ffff003b590)
    at /usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:235

是在dense_assignment_loop附近崩溃,应该是Eigen字节对其的问题。

分析

我在程序中使用了-march=native编译选项,而Ceres在编译时并未使用该选项,程序链接后可能就会产生问题。

解决

在编译Ceres的时候用cmake .. -DCMAKE_CXX_FLAGS="-march=native"即可解决

Last modification:August 9, 2019
If you think my article is useful to you, please feel free to appreciate