У меня есть шаблонная библиотека, в которой некоторые функции специализируются для типов с плавающей запятой и двойных типов.Эта специализация использует 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.
Мне удалось воспроизвести ошибку с гораздо более простым кодом: здесь .По сути, этот пример работает, когда флаги -mavx2 -march=native
удалены, и не работает (выдает предыдущую ошибку), когда они присутствуют (комментарий и раскомментирование из CmakeLists.txt).В этом примере отсутствуют функции, использующие avx / sse, но помните, что в моей библиотеке они есть, поэтому удаление флагов -mavx2 -march=native
не вариант.Есть идеи, что делать, чтобы решить эту проблему?Когда я скомпилировал Ceres, я добавил флаг -DCMAKE_CXX_FLAGS="-march=native"
, как указано в документации .
Чтение веб-страницы , указанной в сообщении об ошибке , не помогло.
Некоторая полезная информация о моей системе:
- компилятор: clang ++
- clang версия 6.0.0-1ubuntu2 (теги / RELEASE_600 / final)
- Цель: x86_64-pc-linux-gnu
- Модель потока: posix
- Версия Ceres: 2.0 (на самом деле у меня есть git-репозиторий, и я обновил его через несколько минутназад:)
- Процессор: процессор Intel® Core ™ TM i7-4770 @ 3,40 ГГц