Bug 466 - helgrind race condition warnings using openmp
: helgrind race condition warnings using openmp
Status: RESOLVED FIXED
Product: Eigen
Classification: Unclassified
Component: Core - general
: 3.0
: All All
: Normal Unknown
Assigned To: Nobody
:
:
:
:
:
  Show dependency treegraph
 
Reported: 2012-05-22 07:23 UTC by Bowie Owens
Modified: 2012-06-14 14:12 UTC (History)
2 users (show)



Attachments
Patch adding an initParallel() global function (6.05 KB, patch)
2012-06-14 14:12 UTC, Gael Guennebaud
no flags Details | Diff | Splinter Review

Description Bowie Owens 2012-05-22 07:23:46 UTC
I get warnings like the following when I run my program under helgrind using
Eigen and openmp. I think I have been able to eliminate the warnings by
following the change specified at http://stackoverflow.com/a/10540025/453436


==13966== ----------------------------------------------------------------
==13966== 
==13966== Possible data race during read of size 8 at 0xAA8A60 by thread #7
==13966== Locks held: none
==13966==    at 0x4874D2: Eigen::internal::manage_caching_sizes(Eigen::Action,
long*, long*) (GeneralBlockPanelKernel.h:55)
==13966==    by 0x4BE35B: void
Eigen::internal::computeProductBlockingSizes<double, double, 4>(long&, long&,
long&) (GeneralBlockPanelKernel.h:99)
==13966==    by 0x4BA1C5: Eigen::internal::triangular_solve_matrix<double,
long, 1, 5, false, 0, 0>::run(long, long, double const*, long, double*, long)
(TriangularSolverMatrix.h:71)
==13966==    by 0x4B708C:
Eigen::internal::triangular_solver_selector<Eigen::Block<Eigen::Matrix<double,
-1, -1, 0, -1, -1> const, -1, -1, false, true> const,
Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false, true>, 1,
5, 0, -1>::run(Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, -1,
-1, false, true> const&, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
-1, -1, false, true>&) (SolveTriangular.h:104)
==13966==    by 0x4B37ED: void
Eigen::TriangularView<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>
const, -1, -1, false, true> const, 5u>::solveInPlace<1,
Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false, true>
>(Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1,
-1, false, true> > const&) const (SolveTriangular.h:190)
==13966==    by 0x4AF09E: void
Eigen::TriangularView<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>
const, -1, -1, false, true> const,
5u>::solveInPlace<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1,
-1, false, true> >(Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1,
0, -1, -1>, -1, -1, false, true> > const&) const (TriangularMatrix.h:356)
==13966==    by 0x4A76FA: void
Eigen::internal::solve_retval<Eigen::FullPivLU<Eigen::Matrix<double, -1, -1, 0,
-1, -1> >, Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > >::evalTo<Eigen::Matrix<double, -1,
-1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&) const
(FullPivLU.h:704)
==13966==    by 0x49FD14: void
Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double, -1,
-1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > >::evalTo<Eigen::Matrix<double, -1,
-1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&) const (Solve.h:64)
==13966==    by 0x49AB30: void
Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > >::evalTo<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >(Eigen::Matrix<double, -1, -1, 0, -1, -1>&) const
(ReturnByValue.h:74)
==13966==    by 0x495C0C: Eigen::Matrix<double, -1, -1, 0, -1,
-1>::Matrix<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > >
>(Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > > const&) (Matrix.h:309)
==13966==    by 0x491B6B:
Eigen::ProductBase<Eigen::GeneralProduct<Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > >,
Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>,
Eigen::Matrix<double, -1, 1, 0, -1, 1> const,
Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4> const>, 4>,
Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > >,
Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>,
Eigen::Matrix<double, -1, 1, 0, -1, 1> const,
Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4> const>
>::ProductBase(Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > > const&,
Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>,
Eigen::Matrix<double, -1, 1, 0, -1, 1> const,
Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4> const> const&) (ProductBase.h:104)
==13966==    by 0x48D62C:
Eigen::GeneralProduct<Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > >,
Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>,
Eigen::Matrix<double, -1, 1, 0, -1, 1> const,
Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4> const>,
4>::GeneralProduct(Eigen::ReturnByValue<Eigen::internal::solve_retval_base<Eigen::FullPivLU<Eigen::Matrix<double,
-1, -1, 0, -1, -1> >,
Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>,
Eigen::Matrix<double, -1, -1, 0, -1, -1> > > > const&,
Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>,
Eigen::Matrix<double, -1, 1, 0, -1, 1> const,
Eigen::GeneralProduct<Eigen::Matrix<double, -1, -1, 0, -1, -1>,
Eigen::Matrix<double, -1, 1, 0, -1, 1>, 4> const> const&) (Product.h:327)
==13966== 
==13966== This conflicts with a previous write of size 8 by thread #1
==13966== Locks held: none
==13966==    at 0x487478: Eigen::internal::manage_caching_sizes(Eigen::Action,
long*, long*) (GeneralBlockPanelKernel.h:42)
==13966==    by 0x4A4736: void
Eigen::internal::computeProductBlockingSizes<double, double, 1>(long&, long&,
long&) (GeneralBlockPanelKernel.h:99)
==13966==    by 0x49DE15: void
Eigen::internal::computeProductBlockingSizes<double, double>(long&, long&,
long&) (GeneralBlockPanelKernel.h:108)
==13966==    by 0x498C9C: Eigen::internal::gemm_blocking_space<0, double,
double, 2, 2, -1, false>::gemm_blocking_space(long, long, long)
(GeneralMatrixMatrix.h:350)
==13966==    by 0x49400D: void
Eigen::GeneralProduct<Eigen::Transpose<Eigen::Matrix<double, -1, 2, 0, -1, 2>
>, Eigen::Matrix<double, -1, 2, 0, -1, 2>,
5>::scaleAndAddTo<Eigen::Matrix<double, 2, 2, 0, 2, 2> >(Eigen::Matrix<double,
2, 2, 0, 2, 2>&, double) const (GeneralMatrixMatrix.h:433)
==13966==    by 0x48FC2E: void
Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Matrix<double,
-1, 2, 0, -1, 2> >, Eigen::Matrix<double, -1, 2, 0, -1, 2>, 5>,
Eigen::Transpose<Eigen::Matrix<double, -1, 2, 0, -1, 2> >,
Eigen::Matrix<double, -1, 2, 0, -1, 2> >::scaleAndAddTo<Eigen::Matrix<double,
2, 2, 0, 2, 2> >(Eigen::Matrix<double, 2, 2, 0, 2, 2>&, double) const
(ProductBase.h:124)
==13966==    by 0x48B7A4: void
Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Matrix<double,
-1, 2, 0, -1, 2> >, Eigen::Matrix<double, -1, 2, 0, -1, 2>, 5>,
Eigen::Transpose<Eigen::Matrix<double, -1, 2, 0, -1, 2> >,
Eigen::Matrix<double, -1, 2, 0, -1, 2> >::evalTo<Eigen::Matrix<double, 2, 2, 0,
2, 2> >(Eigen::Matrix<double, 2, 2, 0, 2, 2>&) const (ProductBase.h:115)
==13966==    by 0x48859A:
Eigen::ProductBase<Eigen::GeneralProduct<Eigen::Transpose<Eigen::Matrix<double,
-1, 2, 0, -1, 2> >, Eigen::Matrix<double, -1, 2, 0, -1, 2>, 5>,
Eigen::Transpose<Eigen::Matrix<double, -1, 2, 0, -1, 2> >,
Eigen::Matrix<double, -1, 2, 0, -1, 2> >::operator Eigen::Matrix<double, 2, 2,
0, 2, 2> const&() const (ProductBase.h:133)
Comment 1 Gael Guennebaud 2012-06-08 17:27:49 UTC
You are right, my initial solution was not good. Fixed:

https://bitbucket.org/eigen/eigen/changeset/b24a0c74e593/
 changeset:   b24a0c74e593
 user:        ggael
 date:        2012-06-08 17:29:02
 summary:     Fix bug 466: race condition destected by helgrind in
manage_caching_sizes.
 After all, the solution based on threadprivate is not that costly.
Comment 2 Gael Guennebaud 2012-06-14 14:12:10 UTC
Created attachment 279 [details] [review]
Patch adding an initParallel() global function

The previous solution was limited to OpenMP only, and not even supported on all
platform (e.g., macosx with default compiler).

This new patch add a initParallel() function which must be called at the
initialization time of a multi-threaded application calling Eigen from multiple
threads.

Note You need to log in before you can comment on or make changes to this bug.