一部の関数が 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=native
はできません。これを解決するために何をすべきかについて何か考えはありますか? Ceres をコンパイルしたときに、ドキュメント-DCMAKE_CXX_FLAGS="-march=native"
で指摘されているようにフラグを追加しました。
エラー メッセージに示されている Web ページを読んでも解決策はありませんでした。
私のシステムに関するいくつかの有用な情報:
- コンパイラ: clang++
- clang バージョン 6.0.0-1ubuntu2 (タグ/RELEASE_600/final)
- ターゲット: x86_64-pc-linux-gnu
- スレッドモデル: posix
- Ceres バージョン: 2.0 (実際には git リポジトリがあり、数分前に更新しました:)
- CPU: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz