On Mon, 14 Oct 2024 at 14:35, Jonathan Wakely <jwak...@redhat.com> wrote:
>
> N.B. please CC the libstdc++ list for libstdc++ topics.
>
> On Mon, 14 Oct 2024 at 14:00, Matthew Malcomson <mmalcom...@nvidia.com> wrote:
> >
> > After getting GCC to handle floating point exceptions I'm now noticing that 
> > the `targetm.atomic_assign_expand_fenv` hook tends to use the library 
> > function `__atomic_feraiseexcept`.
> > This requires adding -latomic to the command line where it wasn't needed 
> > before.
> > I also notice that the inline CAS loop for libstdc++ `atomic<T>::fetch_add` 
> > on floating point types doesn't handle these floating point exceptions.
>
> Right, Joseph made the C front-end handle them for _Atomic but I
> didn't do that for std::atomic.
>
> > For context, clang (which has already implemented floating point fetch_add 
> > for floating point types) is not emitting anything to handle the floating 
> > point environment.

I'm not sure if C++ users really care about fenv. I think most don't.


> >
> > I expect that the eventual goal should be (please do correct if you 
> > disagree)
> >
> > Update the existing libstdc++ CAS loop to handle floating point exceptions.
> > Suggest to clang that the fetch_add builtin should handle floating point 
> > exceptions.
> > GCC builtin handles floating point exceptions.
> > __atomic_feraiseexcept should be a builtin to avoid previously unnecessary 
> > requirement to link libatomic.
> >
> > However I'm uncertain we could sort all that out for GCC 15.
> > Would it be reasonable to require linking with libatomic for the GCC 15 
> > release?
>
> That would be a regression for anybody using
> std::atomic<floating-point-type> today.
>
> > Alternatively is there some other intermediate step that people would 
> > prefer?
> > Similarly — maybe there's something I'm missing — maybe about differences 
> > between C/C++?
> >
> > Another option is to aim for implementing the functionality of 
> > __atomic_feraiseexcept inline in the fetch_add GCC 15 (a bit tight on 
> > time), to use it in the new fetch_add builtin overload, but not use it in 
> > the CAS loop.
> > That way no compiler & floating point type combination would need linking 
> > libatomic, current clang would not handle floating point exception 
> > information, while current gcc would handle that information.
> >
> > What are your thoughts?
>
> If making it Just Work without a new libatomic requirement is
> possible, I'd prefer that.
>
> > Regards,
> > Matthew
> >
> > ________________________________
> > From: Joseph Myers <josmy...@redhat.com>
> > Sent: 19 September 2024 10:38 PM
> > To: Matthew Malcomson <mmalcom...@nvidia.com>
> > Cc: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>; Jonathan Wakely 
> > <jwak...@redhat.com>; Richard Biener <rguent...@suse.de>
> > Subject: Re: [PATCH 0/8] [RFC] Introduce floating point fetch_add builtins
> >
> > External email: Use caution opening links or attachments
> >
> >
> > On Thu, 19 Sep 2024, mmalcom...@nvidia.com wrote:
> >
> > > 6) Anything special about floating point maths that I'm tripping up on?
> >
> > Correct atomic operations with floating-point operands should ensure that
> > exceptions raised exactly correspond to the operands for which the
> > operation succeeded, and not to the operands for any previous attempts
> > where the compare-exchange failed.  There is a lengthy note in the C
> > standard (in C11 it's a footnote in 6.5.16.2, in C17 it's a Note in
> > 6.5.16.2 and in C23 that subclause has become 6.5.17.3) that discusses
> > appropriate code sequences to achieve this.  In GCC the implementation of
> > this is in c-typeck.cc:build_atomic_assign, which in turn calls
> > targetm.atomic_assign_expand_fenv (note that we have the complication for
> > C of not introducing libm dependencies in code that only uses standard
> > language features and not <math.h>, <fenv.h> or <complex.h>, so direct use
> > of <fenv.h> functions is inappropriate here).
> >
> > I would expect such built-in functions to follow the same semantics for
> > floating-point exceptions as _Atomic compound assignment does.  (Note that
> > _Atomic compound assignment is more general in the allowed operands,
> > because compound assignment is a heterogeneous operation - for example,
> > the special floating-point logic in build_atomic_assign includes the case
> > where the LHS of the compound assignment is of atomic integer type but the
> > RHS is of floating type.  However, built-in functions allow memory orders
> > other than seq_cst to be used, whereas _Atomic compound assignment is
> > limited to the seq_cst case.)
> >
> > So it would seem appropriate for the implementation of such built-in
> > functions to make use of targetm.atomic_assign_expand_fenv for
> > floating-point environment handling, and for testcases to include tests
> > analogous to c11-atomic-exec-5.c that exceptions are being handled
> > correctly.
> >
> > Cf. N2329 which suggested such operations for C in <stdatomic.h> (but
> > tried to do to many things in one paper to be accepted into C); it didn't
> > go into the floating-point exceptions semantics but simple correctness
> > would indicate avoiding spurious exceptions from discarded computations.
> >
> > --
> > Joseph S. Myers
> > josmy...@redhat.com
> >

Reply via email to