Re: [eigen] any remaining issues blocking beta1, speak up!

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Gael: could you add your 1st example as a unit test? I understand that
other tests catch the issue already, but having this simple test case
can help in the future.

2010/7/3 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
> I really can't reproduce on linux x86-64 with GCC 4.3.
>
> I tried compiling with -fstrict-aliasing and also with -O2
> I tried both your versions, reading the program's return value like this:
>
> ##### 10:53:39 ~/build/eigen$ g++-4.3 z.cpp -o z -I ~/eigen -O2 && ./z
> && echo "zero"
> zero
>
> Benoit
>
>
>
> 2010/7/3 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:
>> no warning.
>>
>>
>> here is an simpler version:
>>
>> #include <iostream>
>> #include <Eigen/Dense>
>>
>> int main()
>> {
>>  Eigen::Matrix<float,1,1> v;
>>  v.setOnes();
>>  return (v.cwiseAbs()-v).sum();
>> }
>>
>> I have also simplified CwiseBinaryOp, such that the coeff(int)
>> function is directly implemented in CwiseBinaryOp (not in the base
>> class CwiseBinaryOpImpl) and such that it simply does:
>>
>> return m_rhs.coeff(0);
>>
>> which, in this example, should return v.coeff(0) == 1;
>>
>>  (so the left hand side and the functor are not used, but I remove
>> them then the issue disappear).
>>
>> I've also changed the functor by an object of type:
>>
>> struct foo {
>>  foo() : x(1) {}
>>  int x;
>> };
>>
>> just be sure the issue does not come from our empty functors. No success..
>>
>> If the left hand side (here v.cwiseAbs(), which is not used) is nested
>> by reference, then the issue disappear.
>>
>> Also, m_rhs().data() is wrong.
>>
>> ...
>>
>> gael
>>
>> On Sat, Jul 3, 2010 at 3:55 PM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
>>> Can you try compiling with
>>>
>>>    -Wstrict-aliasing=1
>>>
>>> indeed, the default value is 3, and 1 is the most aggressive warning
>>> level. It could however report a lot of false positives. According to
>>> `man gcc`.
>>>
>>> Benoit
>>>
>>> 2010/7/3 Gael Guennebaud <gael.guennebaud@xxxxxxxxx>:
>>>> here is a simplified version:
>>>>
>>>> #include <iostream>
>>>> #include <Eigen/Dense>
>>>>
>>>> template<typename A, typename B> EIGEN_DONT_INLINE int foo(const A& a,
>>>> const B& b)
>>>> {
>>>>  return (a - b).sum() <= 0;
>>>> }
>>>>
>>>> int main()
>>>> {
>>>>  Eigen::Matrix<float,1,1> v;
>>>>  v.setOnes();
>>>>  return foo(v.colwise().maxCoeff(),v);
>>>> }
>>>>
>>>> which, again, fails with gcc-4.3 + strict-aliasing only....
>>>> investigating to see if I can find a workaround.
>>>>
>>>> gael
>>>>
>>>> On Sat, Jul 3, 2010 at 1:03 PM, Jitse Niesen <jitse@xxxxxxxxxxxxxxxxx> wrote:
>>>>> On Sat, 3 Jul 2010, Benoit Jacob wrote:
>>>>>
>>>>>> All is in the title. Can we release beta1 this Saturday?
>>>>>
>>>>> There is also the stable_norm_1 test that is failing on gcc 4.3. This seems
>>>>> to be a mistake in Eigen itself.
>>>>>
>>>>> See the previous email I wrote:
>>>>>
>>>>> On Thu, 1 Jul 2010, Jitse Niesen wrote:
>>>>>>
>>>>>> Date: Thu, 1 Jul 2010 11:02:51 +0100 (BST)
>>>>>> From: Jitse Niesen <jitse@xxxxxxxxxxxxxxxxx>
>>>>>> To: Eigen mailinglist <eigen@xxxxxxxxxxxxxxxxxxx>
>>>>>> Subject: Failing stable_norm_1 test
>>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> I just spent some time on the stable_norm_1 test, which fails on both my
>>>>>> computer and Gael's computer when using gcc 4.3. It looks similar to the
>>>>>> issue
>>>>>> which you solved by the empty struct magic (well done!).
>>>>>>
>>>>>> The details are as follows. I constructed the following (fairly) minimal
>>>>>> test
>>>>>> example:
>>>>>>
>>>>>> #include <iostream>
>>>>>> #include <Eigen/Dense>
>>>>>>
>>>>>> int main()
>>>>>> {
>>>>>>  Eigen::Matrix<float,1,1> v;
>>>>>>  v(0,0) = 0.1;
>>>>>>  std::cerr << "blue norm = " << v.colwise().blueNorm() << "\n";
>>>>>>  std::cerr << "status = " <<
>>>>>> v.colwise().hypotNorm().isApprox(v.colwise().norm(), 1e-4) << "\n";
>>>>>> }
>>>>>>
>>>>>> When compiling with g++ (version 4.3.3) -O2 -g and running under valgrind,
>>>>>> this
>>>>>> produces:
>>>>>>
>>>>>> Use of uninitialised value of size 4
>>>>>>    at 0x8048F28: bool
>>>>>> Eigen::DenseBase<Eigen::PartialReduxExpr<Eigen::Matrix<float, 1, 1, 0, 1,
>>>>>> 1>,
>>>>>> Eigen::ei_member_hypotNorm<float>, 0>
>>>>>> >::isApprox<Eigen::PartialReduxExpr<Eigen::Matrix<float, 1, 1, 0, 1, 1>,
>>>>>> Eigen::ei_member_norm<float>, 0>
>>>>>> >(Eigen::DenseBase<Eigen::PartialReduxExpr<Eigen::Matrix<float, 1, 1, 0,
>>>>>> > 1, 1>,
>>>>>> Eigen::ei_member_norm<float>, 0> > const&, float) const (in
>>>>>> /scratch/1/users/jitse/work/c/eigen/eigenfoo)
>>>>>>    by 0x8048AF5: main (in /scratch/1/users/jitse/work/c/eigen/eigenfoo)
>>>>>>
>>>>>> and the same error with the same stack trace a bit later, at 0x8048F2A.
>>>>>>
>>>>>> The result of the program is also wrong: it should print status = 1, but
>>>>>> it
>>>>>> says status = 0.
>>>>>>
>>>>>> The error goes away when compiling with -fno-strict-aliasing.
>>>>>> I tried compiling with -Wstrict-aliasing=2 but that does not produce any
>>>>>> warnings.
>>>>>>
>>>>>> Over to the gurus!
>>>>>>
>>>>>> Cheers,
>>>>>> Jitse
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/