При компиляции с marhc=native
этот код дает segfault:
// Compute all transformations matrices and put into a vector
std::vector<mu::MF4> smpl::get_all_transformations(const mu::MFX &new_joints, const mu::MFX &theta)
{
std::vector<mu::MF4> G_vec;
mu::MFX theta_star = mu::MFX::Zero(theta.rows(), theta.cols());
for (auto k = 0; k < mu::NBRJOINTS; ++k)
{
mu::MF4 G_ = get_rigid_tr(theta, new_joints, k);
mu::MF4 G_star = get_rigid_tr(theta_star, get_J(), k);
mu::MF4 tmp = G_*G_star.inverse();
std::cout<<"Before crash "<<std::endl;
getchar();
G_vec.push_back(tmp);
std::cout<<"After crash"<<std::endl;
}
return G_vec;
}
mu::MFX/4
- это typedefs для Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic>
или Eigen::Matrix4f
.
Когда я запускаю этот код, я получаю вывод
Before crash
After crash
Before crash
Segmentation fault
, когда я компилирую с march=native
. Когда я компилирую без него, тогда он работает отлично. В чем может быть проблема? Мой коллега может запустить его с march-native
, как я понял.
Я использую Eigen из диспетчера пакетов в Ubuntu 18.04, и у меня есть следующие флаги:
message(STATUS "Found Eigen headers in: ${EIGEN_INCLUDE_DIR}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -lrt -std=c++17 -O3 -fopenmp -march=native")
РЕДАКТИРОВАТЬ:
Я не смог воспроизвести его, но когда я переименовал все std::vector::mu::MF4> to std::vector<mu::MF4,Eigen::aligned_allocator<mu::MF4> >
, кратер sh исчез. Кажется немного случайным, что это терпит неудачу на моем большом проекте, но это работает на маленьком примере.