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"
即可解决