У меня есть шаблонная библиотека, в которой некоторые функции специализируются для типов с плавающей запятой и двойных типов. Эта специализация использует 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"
как указано в документация.
Чтение веб-страница в сообщении об ошибке не предоставил никакого решения.
Немного полезной информации о моей системе:
Задача ещё не решена.
Других решений пока нет …