Собственное умножение висит - PullRequest
0 голосов
/ 04 июля 2018

Вот проблемная функция (немного измененная во время моих попыток отладки):

// note: using MatrixX = Eigen::MatrixXd;
VectorX Foo::bar(const MatrixX &mat,
                                                const VectorX &b,
                                                const MatrixX &D,
                                                MatrixX &cov,
                                                double *chisq,
                                                double *cond)
{
    std::cout << "size of the matrices...." << std::endl;
    std::cout << "D row/col: " << D.rows() << '/' << D.cols() << std::endl;
    std::cout << "mat row/col: " << mat.rows() << '/' << mat.cols() << std::endl;
    std::cout << "D: " << std::endl;
    std::cout << D << std::endl;
    std::cout << "mat: " << std::endl;
    std::cout << mat << std::endl;
    std::cout << "And A = D*mat:" << std::endl;
    MatrixX A = D * mat;
    std::cout << A << std::endl;

    return {}; // of course we do more here but to make debugging easier yknow...
}

Что происходит, это , последняя команда никогда не отображается . Конечно, вы скажете, что размеры матриц должны быть несовместимыми, и, конечно, мне бы хотелось, чтобы все было так просто:

size of the matrices....
D row/col: 4/4
mat row/col: 4/3
D: 
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
mat: 
        -1          0  0.0377692
        -0         -1  -0.218875
 -0.958009 -0.0190212  -0.292296
  0.148245  -0.896453  -0.473009
And A = D*mat:
^C

Таким образом, А следует вычислять без проблем в виде матрицы 4 * 3.

Я попытался воспроизвести это с помощью этого тривиального кода:

#include <eigen3/Eigen/Eigen>
#include <iostream>

using M = Eigen::MatrixXd;

void stupid_piece_of_shit(M const &mat, M const &D_)
{
    M A_ = D_ * mat;
    std::cout << A_ << std::endl; // making sure A_ is actually evaluated
}

int main(int argc, char *argv[])
{
    auto mat = M(4, 3);
    auto D_ = M(4, 4);

    mat << -1, 0, 0.0377692,
        -0, -1, -0.218875,
        -0.958009, -0.0190212, -0.292296,
        0.148245, -0.896453, -0.473009;

    D_ << 1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1;

    wat(mat, D_);
    return 0;
}

Конечно этот образец отлично работает.

Итак, я запустил эту штуку с помощью gdb, ^ C, пока программа зависала, а затем получил обратную трассировку:

Thread 1 "foo" received signal SIGINT, Interrupt.
0x00007ffff6fa2be3 in Eigen::internal::gebp_kernel<double, double, long, Eigen::internal::blas_data_mapper<double, long, 0, 0>, 4, 4, false, false>::operator()(Eigen::internal::blas_data_mapper<double, long
, 0, 0> const&, double const*, double const*, long, long, long, double, long, long, long, long) () from blabla

(gdb) bt
#0  0x00007ffff6fa2be3 in Eigen::internal::gebp_kernel<double, double, long, Eigen::internal::blas_data_mapper<double, long, 0, 0>, 4, 4, false, false>::operator()(Eigen::internal::blas_data_mapper<double,
long, 0, 0> const&, double const*, double const*, long, long, long, double, long, long, long, long) () from blabla.so

#1  0x00007ffff6fa8c83 in Eigen::internal::general_matrix_matrix_product<long, double, 0, false, double, 0, false, 0>::run(long, long, long, double const*, long, double const*, long, double*, long, double,
Eigen::internal::level3_blocking<double, double>&, Eigen::internal::GemmParallelInfo<long>*) () from blabla.so

#2  0x00007fffcdfb2002 in Eigen::internal::gemm_functor<double, long, Eigen::internal::general_matrix_matrix_product<long, double, 0, false, double, 0, false, 0>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, E
igen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::internal::gemm_blocking_space<0, double, double, -1, -1, -1, 1, false> >::operator() (this=0x7fffffff9f50, row=0, ro
ws=4, col=0, cols=3, info=0x0) at project/3rdparty/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h:223

#3  0x00007fffcdfb11d6 in Eigen::internal::parallelize_gemm<true, Eigen::internal::gemm_functor<double, long, Eigen::internal::general_matrix_matrix_product<long, double, 0, false, double, 0, false, 0>, Eig
en::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::internal::gemm_blocking_space<0, double, double, -1, -1, -1, 1, false> >, lo
ng> (func=..., rows=4, cols=3, transpose=false) at project/3rdparty/eigen3/Eigen/src/Core/products/Parallelizer.h:96

#4  0x00007fffcdfb1074 in Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>::scaleAndAddTo<Eigen::Matrix<double, -1, -1, 0, -1, -1> > (this=0x7ffff
fffa770, dst=Eigen::Matrix<double,4,3,ColMajor> (data ptr: 0x161b3000) = {...}, alpha=@0x7fffffffa048: 1) at project/3rdparty/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h:
427

#5  0x00007fffcdfb0e20 in Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Ma
trix<double, -1, -1, 0, -1, -1> >::scaleAndAddTo<Eigen::Matrix<double, -1, -1, 0, -1, -1> > (this=0x7fffffffa770, dst=Eigen::Matrix<double,4,3,ColMajor> (data ptr: 0x161b3000) = {...}, alpha=@0x7fffffffa048
: 1) at project/3rdparty/eigen3/Eigen/src/Core/ProductBase.h:118

#6  0x00007fffcdfb0db6 in Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Ma
trix<double, -1, -1, 0, -1, -1> >::evalTo<Eigen::Matrix<double, -1, -1, 0, -1, -1> > (this=0x7fffffffa770, dst=Eigen::Matrix<double,4,3,ColMajor> (data ptr: 0x161b3000) = {...}) at project/3rdparty/eigen3/Eigen/src/Core/ProductBase.h:109

#7  0x00007fffcdf7c4ea in Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, 5>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Ma
trix<double, -1, -1, 0, -1, -1> >::operator Eigen::Matrix<double, -1, -1, 0, -1, -1> const& (this=0x7fffffffa770) at project/3rdparty/eigen3/Eigen/src/Core/ProductBase.h:127

#8  0x00007fffcdf79cd7 in Bar::bar2 (mat=Eigen::Matrix<double,4,3,ColMajor> (data ptr: 0x1528cdc0) = {...}, b=Eigen::Matrix<double,4,1,ColMajor> (data ptr: 0x1513e5b0) = {...}, D=Eigen::Matri
x<double,4,4,ColMajor> (data ptr: 0x16172b20) = {...}, cov=Eigen::Matrix<double,3,3,ColMajor> (data ptr: 0x161b8400) = {...}, chisq=0x7fffffffa968, cond=0x7fffffffa960) at project
somefile.cpp

#9  0x00007fffcdf79906 in Bar::bar (poses=std::vector of length 2, capacity 2 = {...}, image_points=std::vector of length 2, capacity 2 = {...}, point_3d_W=Eigen::Matrix<doubl
e,3,1,ColMajor> (data ptr: 0x7fffffffc320) = {...}, covariance_W=Eigen::Matrix<double,3,3,ColMajor> (data ptr: 0x7fffffffc338) = {...}) at somefile2.cpp

#10 0x000000000041d10e in main (argc=1, argv=0x7fffffffd9c8) at project/applications/bar/src/main.cpp:376

Некоторые подробности:

  • Загрузка ЦП моей программы составляет 100%, когда она зависает
  • Код отлично работает (по словам моего коллеги) в Windows (VC 14)
  • Проблема встречается как с лязгом, так и с gcc
  • Матрицы, передаваемые как параметры, объявляются в стеке (, а не из структуры), поэтому это не должно быть какой-то странной проблемой распределителя

Я попытаюсь завтра войти в стек вызовов Eigen и выяснить, что происходит, но из того, что я видел, утомительно делать (а GDB не загружает Eigen :: internal для некоторых причина). Так что, если у кого-то есть указания / решения этой довольно странной проблемы ... Что ж, спасибо, что сделали мой четверг намного приятнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...