[llvm-dev] [cfe-dev] [RFC] FP Contract = fast?

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Thu Mar 16 17:20:32 PDT 2017


On 03/16/2017 06:23 PM, Adam Nemet wrote:
>
>> On Mar 16, 2017, at 4:04 PM, Adam Nemet via cfe-dev 
>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>
>>>
>>> On Mar 16, 2017, at 3:25 PM, Hal Finkel <hfinkel at anl.gov 
>>> <mailto:hfinkel at anl.gov>> wrote:
>>>
>>>
>>> On 03/16/2017 04:13 PM, Adam Nemet wrote:
>>>>
>>>>> On Mar 15, 2017, at 2:51 PM, Adam Nemet <anemet at apple.com 
>>>>> <mailto:anemet at apple.com>> wrote:
>>>>>
>>>>>>
>>>>>> On Mar 15, 2017, at 2:30 PM, Hal Finkel <hfinkel at anl.gov 
>>>>>> <mailto:hfinkel at anl.gov>> wrote:
>>>>>>
>>>>>>
>>>>>> On 03/15/2017 04:05 PM, Adam Nemet wrote:
>>>>>>>
>>>>>>>> On Mar 15, 2017, at 2:00 PM, Hal Finkel <hfinkel at anl.gov 
>>>>>>>> <mailto:hfinkel at anl.gov>> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 03/15/2017 01:47 PM, Adam Nemet wrote:
>>>>>>>>>
>>>>>>>>>> On Mar 15, 2017, at 11:36 AM, Mehdi Amini 
>>>>>>>>>> <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> On Mar 15, 2017, at 10:13 AM, Hal Finkel via cfe-dev 
>>>>>>>>>>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 03/15/2017 12:10 PM, Adam Nemet via llvm-dev wrote:
>>>>>>>>>>>> Relevant to this discussion is 
>>>>>>>>>>>> http://bugs.llvm.org/show_bug.cgi?id=25721 (-ffp-contract=fast 
>>>>>>>>>>>> does not work with LTO).  I am working on adding function 
>>>>>>>>>>>> attributes for fp-contract=fast which should fix this.
>>>>>>>>>>>
>>>>>>>>>>> Great!
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> A function attribute would be a strict improvement over 
>>>>>>>>>> today: LLVM can’t do contraction today. But actually I’m not 
>>>>>>>>>> sure if it is the long term right choice: attributes don’t 
>>>>>>>>>> combine well with inlining for instance. You mentioned FMF 
>>>>>>>>>> earlier, why don’t we have a FMF to allow contraction?
>>>>>>>>>
>>>>>>>>> OK, I thought that the prerequisite for that was a fast-math 
>>>>>>>>> pragma which I don’t think is something we have (I want to be 
>>>>>>>>> able to specify contract=fast on smaller granularity than 
>>>>>>>>> module).  But now that I think more about, we should be able 
>>>>>>>>> to turn a user function attribute into FMF in the front-end 
>>>>>>>>> which is the most flexible.
>>>>>>>>
>>>>>>>> I agree, a FMF is the way to go and we can then control it with 
>>>>>>>> the pragma. We can use the STDC FP_CONTRACT pragma for contraction;
>>>>>>>
>>>>>>> Just to confirm, do you mean to introduce a “fast” option to the 
>>>>>>> pragma, e.g.:
>>>>>>>
>>>>>>> #pragma STDC FP_CONTRACT FAST
>>>>>>
>>>>>> That's a good point. If we don't add something like this, then 
>>>>>> we'd be able to turn the fast mode off with the pragma, but then 
>>>>>> not be able to turn it back on ;)
>>>>>>
>>>>>> So, yes, except that I'm somewhat hesitant to invade the 'STDC' 
>>>>>> space with vendor extensions. If we generally introduce a pragma 
>>>>>> to control FMFs, maybe we should just use that instead? I don't 
>>>>>> have a clear idea on the syntax, but for example, if we had some 
>>>>>> pragma that let us do
>>>>>>
>>>>>> #pragma clang fast_math or #pragma clang fast_math nnan(off) 
>>>>>> contract(on) or whatever then we could use that. What do you think?
>>>>>
>>>>> That looks great; it nicely matches the internal representation. 
>>>>>  Let me take a stab at this.
>>>>
>>>> Thinking more about this, I am back to thinking that a function 
>>>> attribute is the better solution for this than FMF, at least before 
>>>> inlining.
>>>>
>>>> Consider the standard example where we want this to trigger: an 
>>>> overloaded addition and multiplier operator for a vector class.
>>>>
>>>> In this case, we want the fadd and the fmul in the inlined 
>>>> functions to have the FMF as well but we don’t necessarily want to 
>>>> mark the overloaded operators with the pragma; we may be only 
>>>> comfortable contracting at this call site.
>>>>
>>>> You don’t have this problem if you mark the containing function 
>>>> FP-contractable.  Effectively what we want is to outline the block 
>>>> within the pragma into a function and tag it with the attribute.
>>>>
>>>> During inlining we can still transform the function attribute into FMF.
>>>>
>>>> So I think I am going back to implementing fp-contract=fast as a 
>>>> function attribute as the first step unless there are any objections.
>>>
>>> Are you saying this works because we don't block inlining when 
>>> functions attributes don't match or update the function attributes 
>>> to be more conservative when inlining? This is specifically one of 
>>> the issues we were avoiding by using FMFs. Frankly, the same issue 
>>> comes up with other fast-math properties, and I don't see why we 
>>> should handle this differently. I think that I'd prefer you stick 
>>> with the new flag.
>>
>> OK, so in the example:
>>
>> #pragma clang fast_math contract_fast(on)
>>  vect v1 = v2 * v3 + v4;
>> #pragma clang fast_math contract_fast(off)
>>
>> where all the operands are vectors with the typical implementation 
>> for the overload operators, we wouldn’t fp-contract unless the 
>> operator definitions use contract_fast too?
>
> I guess it’s the conservative thing to do since those functions may 
> have non-contractable operations.

Exactly; the problem is that this is the desirable behavior in some 
circumstances and undesirable in others, but I think that doing the 
conservative thing is the most self-consistent choice (and also allows 
users the most powerful fine-grained control).

Thanks again,
Hal

>
> Adam
>
>>
>> Adam
>>
>>>
>>>  -Hal
>>>
>>>>
>>>> Adam
>>>>
>>>>>
>>>>> Adam
>>>>>
>>>>>>
>>>>>>  -Hal
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Adam
>>>>>>>
>>>>>>>> I also think that having a "fast math" pragma is also a good 
>>>>>>>> idea (the fact that we can currently only specify fast-math 
>>>>>>>> settings on a translation-unit level is somewhat problematic).
>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Also, IIUC, the function attribute as well as a FMF wouldn’t 
>>>>>>>>>> apply to the “ON” setting but only to the “FAST” mode (no way 
>>>>>>>>>> to distinguish source level statement in llvm IR).
>>>>>>>>
>>>>>>>> Right. We still have the existing fmuladd intrinsic method for 
>>>>>>>> dealing with the "ON" setting.
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Yes.
>>>>>>>>>
>>>>>>>>> Adam
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Mehdi
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Also now that we have backend optimization remarks, I am 
>>>>>>>>>>>> planning to report missed optimization when we can’t fuse 
>>>>>>>>>>>> FMAs due “fast” not being on.  This will show up in the 
>>>>>>>>>>>> opt-viewer.  Then the user can opt in either with the 
>>>>>>>>>>>> command-line switch or the new function attribute.
>>>>>>>>>>>
>>>>>>>>>>> That seems useful.
>>>>>>>>>>>
>>>>>>>>>>> Thanks again,
>>>>>>>>>>> Hal
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Adam
>>>>>>>>>>>>
>>>>>>>>>>>>> On Mar 15, 2017, at 6:27 AM, Renato Golin via cfe-dev 
>>>>>>>>>>>>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Folks,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I've been asking around people about the state of FP 
>>>>>>>>>>>>> contract, which
>>>>>>>>>>>>> seems to be "on" but it's not really behaving like it, at 
>>>>>>>>>>>>> least not as
>>>>>>>>>>>>> I would expect:
>>>>>>>>>>>>>
>>>>>>>>>>>>> int foo(float a, float b, float c) { return a*b+c; }
>>>>>>>>>>>>>
>>>>>>>>>>>>> $ clang -target aarch64-linux-gnu -O2 -S fma.c 
>>>>>>>>>>>>> -ffp-contract=on -o -
>>>>>>>>>>>>> (...)
>>>>>>>>>>>>> fmul s0, s0, s1
>>>>>>>>>>>>> fadd s0, s0, s2
>>>>>>>>>>>>> (...)
>>>>>>>>>>>>>
>>>>>>>>>>>>> $ clang -target aarch64-linux-gnu -O2 -S fma.c 
>>>>>>>>>>>>> -ffp-contract=fast -o -
>>>>>>>>>>>>> (...)
>>>>>>>>>>>>> fmadd s0, s0, s1, s2
>>>>>>>>>>>>> (...)
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'm not sure this works in Fortran either, but defaulting 
>>>>>>>>>>>>> to "on" when
>>>>>>>>>>>>> (I believe) the language should allow contraction and not 
>>>>>>>>>>>>> doing it is
>>>>>>>>>>>>> not a good default.
>>>>>>>>>>>>>
>>>>>>>>>>>>> i haven't worked out what would be necessary to make it 
>>>>>>>>>>>>> work on a
>>>>>>>>>>>>> case-by-case basis (what kinds of fusions does C allow?) 
>>>>>>>>>>>>> to make sure
>>>>>>>>>>>>> we don't do all or nothing, but if we don't want to start that
>>>>>>>>>>>>> conversation now, then I'd recommend we just turn it all 
>>>>>>>>>>>>> the way to 11
>>>>>>>>>>>>> (like GCC) and let people turn it off if they really mean it.
>>>>>>>>>>>>>
>>>>>>>>>>>>> The rationale is that:
>>>>>>>>>>>>>
>>>>>>>>>>>>> * Contracted operations increase precision (less rounding 
>>>>>>>>>>>>> steps)
>>>>>>>>>>>>> * It performs equal or faster on all architectures I know 
>>>>>>>>>>>>> (true everywhere?)
>>>>>>>>>>>>> * Users already expect that (certainly, GCC users do)
>>>>>>>>>>>>> * Makes us look good on benchmarks :)
>>>>>>>>>>>>>
>>>>>>>>>>>>> A recent SPEC2k6 comparison Linaro did for AArch64, enabling
>>>>>>>>>>>>> -ffp-contract=fast took the edge of GCC in a number of 
>>>>>>>>>>>>> cases and in
>>>>>>>>>>>>> some of them made them comparable in performance. So, any 
>>>>>>>>>>>>> reasons not
>>>>>>>>>>>>> to?
>>>>>>>>>>>>>
>>>>>>>>>>>>> If we go with it, we need to first finish the job that 
>>>>>>>>>>>>> Sebastian was
>>>>>>>>>>>>> dong on the test-suite, then just turn it on by default. A 
>>>>>>>>>>>>> second
>>>>>>>>>>>>> stage would be to add tests/benchmarks that explicitly test FP
>>>>>>>>>>>>> precision, so that we have some extra guarantee that we're 
>>>>>>>>>>>>> doing the
>>>>>>>>>>>>> right thing.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Opinions?
>>>>>>>>>>>>>
>>>>>>>>>>>>> cheers,
>>>>>>>>>>>>> --renato
>>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>>> cfe-dev mailing list
>>>>>>>>>>>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>>>>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> LLVM Developers mailing list
>>>>>>>>>>>> llvm-dev at lists.llvm.org
>>>>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>>>>>>>>
>>>>>>>>>>> -- 
>>>>>>>>>>> Hal Finkel
>>>>>>>>>>> Lead, Compiler Technology and Programming Languages
>>>>>>>>>>> Leadership Computing Facility
>>>>>>>>>>> Argonne National Laboratory
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> cfe-dev mailing list
>>>>>>>>>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> Hal Finkel
>>>>>>>> Lead, Compiler Technology and Programming Languages
>>>>>>>> Leadership Computing Facility
>>>>>>>> Argonne National Laboratory
>>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Hal Finkel
>>>>>> Lead, Compiler Technology and Programming Languages
>>>>>> Leadership Computing Facility
>>>>>> Argonne National Laboratory
>>>>
>>>
>>> -- 
>>> Hal Finkel
>>> Lead, Compiler Technology and Programming Languages
>>> Leadership Computing Facility
>>> Argonne National Laboratory
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170316/fbbc2750/attachment-0001.html>


More information about the llvm-dev mailing list