[llvm-dev] [test-suite] making polybench/symm succeed with "-Ofast" and "-ffp-contract=on"

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Fri Oct 14 15:10:08 PDT 2016


----- Original Message -----
> From: "Sebastian Pop" <sebpop.llvm at gmail.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "Renato Golin" <renato.golin at linaro.org>, "Sebastian Paul Pop" <s.pop at samsung.com>, "llvm-dev"
> <llvm-dev at lists.llvm.org>, "Matthias Braun" <matze at braunis.de>, "Clang Dev" <cfe-dev at lists.llvm.org>, "nd"
> <nd at arm.com>, "Abe Skolnik" <a.skolnik at samsung.com>
> Sent: Friday, October 14, 2016 5:05:01 PM
> Subject: Re: [test-suite] making polybench/symm succeed with "-Ofast" and "-ffp-contract=on"
> 
> On Fri, Oct 14, 2016 at 10:50 AM, Hal Finkel <hfinkel at anl.gov> wrote:
> > ----- Original Message -----
> >> From: "Renato Golin" <renato.golin at linaro.org>
> >> To: "Sebastian Pop" <sebpop.llvm at gmail.com>
> >> Cc: "Hal Finkel" <hfinkel at anl.gov>, "Sebastian Paul Pop"
> >> <s.pop at samsung.com>, "llvm-dev" <llvm-dev at lists.llvm.org>,
> >> "Matthias Braun" <matze at braunis.de>, "Clang Dev"
> >> <cfe-dev at lists.llvm.org>, "nd" <nd at arm.com>, "Abe Skolnik"
> >> <a.skolnik at samsung.com>
> >> Sent: Friday, October 14, 2016 10:36:12 AM
> >> Subject: Re: [test-suite] making polybench/symm succeed with
> >> "-Ofast" and "-ffp-contract=on"
> >>
> >> On 14 October 2016 at 15:50, Sebastian Pop <sebpop.llvm at gmail.com>
> >> wrote:
> >> > These 3 tests are passing with the following configurations:
> >> > -O3 -ffp-contract=off
> >> > -O3 -ffp-contract=on
> >> > -O0 -ffp-contract=off
> >> > -O0 -ffp-contract=on
> >> >
> >> > They are not passing at:
> >> > -Ofast -ffp-contract=on
> >> > -Ofast -ffp-contract=off
> >>
> >> Let's separate completely FP-contract and fast-math. They're
> >> different
> >> things and need different solutions.
> >>
> >>
> >> > if(TEST_SUITE_USES_FAST_MATH)
> >> >   add_definitions(-DFP_ABSTOLERANCE=1e0)
> >> > else()
> >> >   add_definitions(-DFP_ABSTOLERANCE=1e-5)
> >> > endif()
> >>
> >> This doesn't make sense. If my program decreased precision by 5
> >> orders
> >> of magnitude with -ffast-math, I'd be *very* worried.
> >
> > Is this an absolute or a relative tolerance? If this is absolute,
> > as the name implies, then I'm not sure how to feel. We should
> > probably use a relative tolerance where possible.
> >
> 
> This is absolute tolerance: here is the code I'm using to check.
> 
>         double V1 = A[i][j];
>         double V2 = B[i][j];
>         double Diff = fabs(V1 - V2);
>         if (Diff > AbsTolerance) {
>           fprintf(stderr, "A[%d][%d] = %lf and B[%d][%d] = %lf differ
>           more than"
>                   " FP_ABSTOLERANCE = %lf\n", i, j, V1, i, j, V2,
>                   AbsTolerance);
>           return 0;
>         }
> 
> Do you want me to add the relative tolerance for the 2 tests?
> polybench/linear-algebra/kernels/symm, FP_ABSTOLERANCE=1e1
> polybench/linear-algebra/solvers/gramschmidt, FP_ABSTOLERANCE=1e0
> What should be a good relative tolerance to set for these two tests?

What's the minimum relative tolerance that you need for them to pass?

 -Hal

> 
> Here is the code to compute the relative tolerance from fpcmp:
> 
>   // Check to see if these are inside the absolute tolerance
>   if (AbsTolerance < fabs(V1-V2)) {
>     // Nope, check the relative tolerance...
>     double Diff;
>     if (V2)
>       Diff = fabs(V1/V2 - 1.0);
>     else if (V1)
>       Diff = fabs(V2/V1 - 1.0);
>     else
>       Diff = 0;  // Both zero.
>     if (Diff > RelTolerance) {
>       fprintf(stderr, ("%s: Compared: %e and %e\n"
>                        "abs. diff = %e rel.diff = %e\n"
>                        "Out of tolerance: rel/abs: %e/%e\n"),
>               g_program, V1, V2, fabs(V1-V2), Diff, RelTolerance,
>               AbsTolerance);
>       return true;
>     }
>   }
> 
> >  -Hal
> >
> >>
> >> I hope that fast-math in Clang isn't that broken, so that's
> >> probably
> >> to do with the assumptions in the output reduction phase.
> >>
> >> But, as I said, let's do Ofast *later*. One thing at a time.
> 
> Agreed. I will update the patch, make sure all Polybench pass with
> "-O3 -ffp-contract=on/off" and it will be ready to commit.
> 
> Thanks,
> Sebastian
> 

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory


More information about the llvm-dev mailing list