This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libmvec in gcc to have vector math in fortran


On Tue, Apr 10, 2018 at 12:29 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Tue, Apr 10, 2018 at 11:22:03AM +0100, Szabolcs Nagy wrote:
>> On 10/04/18 11:14, Janne Blomqvist wrote:
>> > As I mentioned previously in that thread you linked to, the fortran
>> > frontend never generates a direct call to libm sin(), or for that matter
>> > ZGVbN2v_sin(). Instead it generates a "call" to __builtin_sin(). And
>> > similarly for other libm functions that have gcc builtins. The
>> > middle-end optimizers are then free to do whatever optimizations they
>> > like on that __builtin_sin call, such as constant folding, and at least
>> > as far as the fortran frontend is concerned, vectorizing if -mveclibabi=
>> > or such is in effect.
>>
>> the generated builtin call is not the issue (same happens in c),
>> the knowledge about libc declarations is.
>>
>> the middle-end has no idea what functions can be vectorized,
>> only the libc knows it and declares this in c headers.
>>
>> this is the problem i'm trying to solve.
>
> And the easiest solution is in the Fortran FE based on some flag
> (e.g. -mveclibabi=glibc) through a target hook add
> __attribute__((__simd__ ("notinbranch")))
> to the builtins like __builtin_sin etc. that have them in the
> glibc header (x86_64 -m64 and -ffast-math only):
>
> #  undef __DECL_SIMD_cos
> #  define __DECL_SIMD_cos __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_cosf
> #  define __DECL_SIMD_cosf __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_sin
> #  define __DECL_SIMD_sin __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_sinf
> #  define __DECL_SIMD_sinf __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_sincos
> #  define __DECL_SIMD_sincos __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_sincosf
> #  define __DECL_SIMD_sincosf __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_log
> #  define __DECL_SIMD_log __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_logf
> #  define __DECL_SIMD_logf __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_exp
> #  define __DECL_SIMD_exp __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_expf
> #  define __DECL_SIMD_expf __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_pow
> #  define __DECL_SIMD_pow __DECL_SIMD_x86_64
> #  undef __DECL_SIMD_powf
> #  define __DECL_SIMD_powf __DECL_SIMD_x86_64
>
> The sincos/sincosf stuff is questionable, because some glibc versions
> implement it incorrectly and the simd ("notinbranch") attribute isn't that
> useful for it anyway, we'd want to use extra clauses so that it doesn't need
> to do scatter stores.

I wonder if it is possible for glibc to ship a "module" for fortran instead
containing the appropriate declarations and gfortran auto-include that
(if present).

Hard-coding stuff like suggested above is of course possible but not
very forward compatible with changes in glibc.

Richard.

>         Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]