我有一个模板库,其中一些函数专门用于浮点和双精度类型。此专业化使用 sse/avx,因此,此库具有-march=native -mavx2
编译器标志。当我尝试使用这个库的一些函数(不是专门的)时,我从 Ceres 收到以下运行时错误:
test_ceres: /usr/include/eigen3/Eigen/src/Core/DenseStorage.h:128: Eigen::internal::plain_array<double, 4, 0, 32>::plain_array() [T = double, Size = 4, MatrixOrArrayOptions = 0, Alignment = 32]: Assertion `(internal::UIntPtr(array) & (31)) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
我已经能够使用更简单的代码重现错误:here。本质上,此示例在-mavx2 -march=native
标志被删除时有效,并且在标志存在时不起作用(产生先前的错误)(来自 CmakeLists.txt 的注释和取消注释)。在此示例中,不存在使用 avx/sse 的函数,但请记住我的库中有它们,因此删除标志-mavx2 -march=native
不是一种选择。关于如何解决这个问题的任何想法?当我编译 Ceres 时,我添加了文档-DCMAKE_CXX_FLAGS="-march=native"
中指出的标志。
阅读错误消息中提供的网页并没有提供任何解决方案。
关于我的系统的一些有用信息:
- 编译器:clang++
- clang 版本 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
- 目标:x86_64-pc-linux-gnu
- 线程模型:posix
- Ceres 版本:2.0(我实际上有 git repo,我在几分钟前更新了它:)
- CPU:Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz