This forum has been archived. All content is frozen. Please use KDE Discuss instead.

memory error using a QR decomposition

Tags: None
(comma "," separated)
jeanf
Registered Member
Posts
2
Karma
0
Hi everyone,

I'm getting a segfault error in a QR decomposition (used by a function of my own).
I have been able to reproduce a problem in a simple program (compiled with gcc 4.4 and using eigen 3.1) .
The program seems to work fine but valgrind complains about an 'Invalid read of size 8' error.
v is a float array of size 2455
Mat is a float array of size 24550

Code: Select all
int main(int argc, char *argv[])
{
  Matrix<float, Dynamic, Dynamic> M(2455, 10);
  Matrix<float, Dynamic, 1> values(2455, 1);
  Matrix<float, 10, 1> output;

  for (unsigned int i = 0; i< 2455; ++i)
    {
      values[i] = v[i];
      for (unsigned int j = 0; j< 10; ++j)
   M(i,j) = Mat[i+2455*j];
    }

  HouseholderQR<Matrix<float, Dynamic, Dynamic> > qr(M);
  output = qr.solve(values);

 
  return 0;
}


Here is the valgrind output :

Code: Select all
 valgrind ./minimal
==4534== Memcheck, a memory error detector
==4534== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==4534== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==4534== Command: ./minimal
==4534==
==4534== Invalid read of size 8
==4534==    at 0x40160F: float __vector Eigen::internal::pload<float __vector>(Eigen::internal::unpacket_traits<float __vector>::type const*) (xmmintrin.h:899)
==4534==    by 0x41D26B: Eigen::internal::general_matrix_vector_product<long, float, 1, false, float, false, 0>::run(long, long, float const*, long, float const*, long, float*, long, float) (GeneralMatrixVector.h:455)
==4534==    by 0x41C10E: void Eigen::internal::gemv_selector<2, 1, true>::run<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> const>, Eigen::Transpose<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const> const>, 4>, Eigen::Transpose<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > > >(Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> const>, Eigen::Transpose<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const> const>, 4> const&, Eigen::Transpose<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >&, Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> const>, Eigen::Transpose<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const> const>, 4>::Scalar) (GeneralProduct.h:498)
==4534==    by 0x4196EB: void Eigen::internal::gemv_selector<1, 0, true>::run<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >(Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4> const&, Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >&, Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>::Scalar) (GeneralProduct.h:342)
==4534==    by 0x415584: void Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>::scaleAndAddTo<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >(Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >&, float) const (GeneralProduct.h:326)
==4534==    by 0x40FBAA: void Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> >::scaleAndAddTo<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >(Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >&, float) const (ProductBase.h:111)
==4534==    by 0x40BFF0: void Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> >::evalTo<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >(Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >&) const (ProductBase.h:102)
==4534==    by 0x409AAA: Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >& Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> > >::lazyAssign<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> >(Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true> > const&) (ProductBase.h:272)
==4534==    by 0x407938: Eigen::internal::assign_selector<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4>, false, false>::run(Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >&, Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4> const&) (Assign.h:522)
==4534==    by 0x4059B0: Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >& Eigen::NoAlias<Eigen::Map<Eigen::Matrix<float, 1, -1, 1, 1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::MatrixBase>::operator=<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4> >(Eigen::MatrixBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1, 1, false, true> const>, Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true>, -1, -1, false, true>, 4> > const&) (NoAlias.h:41)
==4534==    by 0x404283: void Eigen::MatrixBase<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, -1, false, true> >::applyHouseholderOnTheLeft<Eigen::VectorBlock<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1> >(Eigen::VectorBlock<Eigen::Block<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, -1, 1, true, true>, -1> const&, float const&, float*) (Householder.h:122)
==4534==    by 0x4035B5: void Eigen::internal::householder_qr_inplace_unblocked<Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>, Eigen::Block<Eigen::Matrix<float, -1, 1, 0, -1, 1>, -1, 1, false, true> >(Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>&, Eigen::Block<Eigen::Matrix<float, -1, 1, 0, -1, 1>, -1, 1, false, true>&, Eigen::Block<Eigen::Matrix<float, -1, -1, 0, -1, -1>, -1, -1, false, true>::Scalar*) (HouseholderQR.h:222)
==4534==  Address 0x5969658 is 0 bytes after a block of size 98,200 alloc'd
==4534==    at 0x4C244E8: malloc (vg_replace_malloc.c:236)
==4534==    by 0x400CA6: Eigen::internal::aligned_malloc(unsigned long) (Memory.h:202)
==4534==    by 0x403A2A: void* Eigen::internal::conditional_aligned_malloc<true>(unsigned long) (Memory.h:283)
==4534==    by 0x402FC2: float* Eigen::internal::conditional_aligned_new_auto<float, true>(unsigned long) (Memory.h:403)
==4534==    by 0x402629: Eigen::DenseStorage<float, -1, -1, -1, 0>::resize(long, long, long) (DenseStorage.h:217)
==4534==    by 0x4028E7: void Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >::_init2<long, long>(long, long, Eigen::internal::enable_if<true, long>::type*) (PlainObjectBase.h:611)
==4534==    by 0x402329: Eigen::Matrix<float, -1, -1, 0, -1, -1>::Matrix<long, long>(long const&, long const&) (Matrix.h:235)
==4534==    by 0x401D7D: Eigen::HouseholderQR<Eigen::Matrix<float, -1, -1, 0, -1, -1> >::HouseholderQR(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&) (HouseholderQR.h:86)
==4534==    by 0x400A6C: main (minimal.cpp:2479)
==4534==
==4534==
==4534== HEAP SUMMARY:
==4534==     in use at exit: 0 bytes in 0 blocks
==4534==   total heap usage: 6 allocs, 6 frees, 216,120 bytes allocated
==4534==
==4534== All heap blocks were freed -- no leaks are possible
==4534==
==4534== For counts of detected and suppressed errors, rerun with: -v
==4534== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)


I'm quite new to the eigen library, so I may do something wrong.
Have you got any ideas ?

Thanks,

Jean
User avatar
ggael
Moderator
Posts
3447
Karma
19
OS
Thanks for finding this. Fixed:

https://bitbucket.org/eigen/eigen/chang ... e18ba243f/
changeset: 694e18ba243f
branch: 3.1
user: ggael
date: 2012-08-30 10:52:15
summary: Fix out-of-range memory access in GEMV (the memory was not used for the computation, only to assemble unaligned packets from aligned packet loads)
jeanf
Registered Member
Posts
2
Karma
0
Thanks for the quick fix !


Bookmarks



Who is online

Registered users: Baidu [Spider], Bing [Bot], Google [Bot], Yahoo [Bot]