Boost logo

Boost Users :

Subject: Re: [Boost-users] [Interval] Help debugging compiler optimization
From: Tim van Erven (tim_at_[hidden])
Date: 2018-03-03 20:08:48


Hi Nate,

Thanks for your help.

Below is the output from gcc 7.2.0 on mac os. Apparently the difference
already happens between -O0 and -O1.
To summarize:
     - gcc on linux with boost 1.58
     - clang and gcc 7.2.0 on mac os with boost 1.66
all give wrong (or at least inconsistent) output depending on
optimization options.
(Since third1 and third2 are both < 1/3, multiplying them by 3 should
give an interval with lower end-point < 1, but it sometimes doesn't.)

I am attaching the outputs of
g++-7 -Q -O0 --help=optimizers > o0.txt
$ g++-7 -Q -O1 --help=optimizers > o1.txt

$ g++-7 foo.cpp -o foo
$ ./foo
third1 = 0.3333333333333333148296162562473909929394721984863281250000000000
third2 = 0.3333333333333333148296162562473909929394721984863281250000000000
v1 =
(0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
v2 =
(0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)

$ g++-7 -O1 foo.cpp -o foo
./foo
third1 = 0.3333333333333333148296162562473909929394721984863281250000000000
third2 = 0.3333333333333333148296162562473909929394721984863281250000000000
v1 =
(0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
v2 =
(1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000000000000000000000000000000000000000000000000000000)

Best,
   Tim

On 02/03/2018 18:23, Nathan Ernst wrote:
> I'm not sure what's going on (seems like maybe a fast but error prone
> floating point rounding), but comparing the optimization flags enabled
> between -O0 and -O2 might help shed some light on it.
>
> You can get the explicit optimization flags enabled for your compiler via:
> g++ -Q -O2 --help=optimizers
> g++ -Q -O0 --help=optimizers
>
> Regards,
> Nate
>
> On Fri, Mar 2, 2018 at 10:17 AM, Tim van Erven via Boost-users
> <boost-users_at_[hidden] <mailto:boost-users_at_[hidden]>> wrote:
>
> Dear all,
>
> I am trying to understand why I am getting different numerical
> results with the interval library depending on the optimization
> level of the compiler.
>
> I am attaching the smallest example I have been able to create:
>
> # On my Mac laptop
> Apple LLVM version 9.0.0 (clang-900.0.39.2)
> boost 1.66 (installed via homebrew)
> $ g++ foo.cpp -o foo
> $ ./foo
> third1 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> third2 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> v1 =
> (0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
> v2 =
> (0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
>
> $ g++ -O2 foo.cpp -o foo
> $ ./foo
> third1 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> third2 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> v1 =
> (1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
> v2 =
> (1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
>
> I would expect to get the same output in both cases, but the lower
> end-points are different in the second case, and seem wrong to me
> since third2 * 3.0 < 1.0.
>
> # On my Linux machine the effect is different:
> gcc version 5.4.0 20160609
> boost 1.58 on Ubuntu 16.04.9
>
> $ g++ foo.cpp -o foo
> $ ./foo
> third1 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> third2 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> v1 =
> (0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
> v2 =
> (0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
>
> $ g++ -O2 foo.cpp -o foo
> $ ./foo
> third1 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> third2 =
> 0.3333333333333333148296162562473909929394721984863281250000000000
> v1 =
> (0.9999999999999998889776975374843459576368331909179687500000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
> v2 =
> (1.0000000000000000000000000000000000000000000000000000000000000000,1.0000000000000000000000000000000000000000000000000000000000000000)
>
> Can anyone explain what is going on?
>
> Thanks in advance,
>
> Tim
>
> --
> Tim van Erven<tim_at_[hidden]> <mailto:tim_at_[hidden]>
> www.timvanerven.nl <http://www.timvanerven.nl>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden] <mailto:Boost-users_at_[hidden]>
> https://lists.boost.org/mailman/listinfo.cgi/boost-users
> <https://lists.boost.org/mailman/listinfo.cgi/boost-users>
>
>

-- 
Tim van Erven <tim_at_[hidden]>
www.timvanerven.nl






Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net