我有一个模板库,其中有些函数专门用于float和double类型。此专门化使用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=本机
不是一个选择。有什么办法解决这个问题吗?当我编译ceres时,我添加了国旗
-DCMAKE_CXX_FLAGS="-march=native"
正如
documentation
.
阅读
webpage provided in the error message
没有提供任何解决方案。
关于我的系统的一些有用信息:
-
编译:clang++
-
Clang版本6.0.0-1ubuntu2(标签/发行版/600/最终版)
-
目标:x86_64-pc-linux-gnu
-
线程模型:posix
-
ceres版本:2.0(实际上我有git repo,几分钟前就更新了:)
-
CPU:Intel(R)Core(TM)i7-4770 CPU@3.40GHz