public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Daniel Kiss <Daniel.Kiss@arm.com>
To: "Martin Liška" <mliska@suse.cz>
Cc: "gcc@gcc.gnu.org" <gcc@gcc.gnu.org>, Pavel Iliin <Pavel.Iliin@arm.com>
Subject: Re: [RFC] Function Multi Versioning on Arm
Date: Thu, 21 Jul 2022 17:49:07 +0000	[thread overview]
Message-ID: <285FC35B-89C4-405B-AA87-21E838B58F60@arm.com> (raw)
In-Reply-To: <c4afc2d1-2e21-efb0-cfed-eddd7c361289@suse.cz>

Hello,

Thanks for the quick reply, see mine inline.
> On 2022. Jul 19., at 12:01, Martin Liška <mliska@suse.cz> wrote:
> 
> On 7/18/22 12:36, Daniel Kiss via Gcc wrote:
>> Hello,
>> 
>> We are going to add Function Multiversioning [1] support to Arm architectures.
>> The specification is made public as beta[2] to ensure toolchain that follows Arm
>> C Language Extension will implement it in the same way.
>> 
>> A few tweaks considered to make the developers' life easier.
>> Since the `target` attribute is used widely on Arm, we would like to introduce a
>> new attribute `target_version` to avoid confusion and possible deployment
>> problems. The `target_clones` attribute will be supported too. Also the “default”
>> version to be made optional.
>> 
>> We are looking for feedback on the specification (reply, github works too).
>> 
>> Thanks so much,
>> Daniel
>> 
>> [1] https://gcc.gnu.org/onlinedocs/gcc/Function-Multiversioning.html 
>> [2] https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning
>> 
> 
> Hello.
> 
> Thanks for working on the feature, it will be nice to cover the gap in between x86_64 and powerpc,
> which implement the FMV feature.
> 
> As the person who's been involved with the current MVC code in the GCC, I have a few comments/questions
> about it:
> 
> 1) both i386 and Powerpc also allow specifying an equivalent to -march (like `arch=bdver2`),
>   in Arm case it seems to me only individual features are considered
Arm architecture version is not definite enough in this case because
certain features are optional on a given versions and may back ported to older versions.
Implementation name of a core also could be misleading in most of the cases. And too many out there if
all implementation is considered not just Arm’s Cortex cores.
Also the kernel support varies regardless the actual hardware, features can be disabled by the firmware/OS.
I think developers target a given feature instead of a given uarch most cases.

> 
> 2) about 'target_version' attribute - I like the idea as one can have a completely independent
>   function implementation optimized for an ISA;
>   note it's very close to 'target' attribute (supported in C++), where one needs to provide
>   a resolver and have the pretty same functionality (see e.g. gcc/testsuite/g++.target/i386/mv1.C).
>   However, the feature does not work in C and you will have the very same problem with target_version
>   attribute (multiple functions with the same declaration):
> 
>  mv1.c:76:1: error: redefinition of ‘foo’
>     76 | foo ()
>        | ^~~
In our clang implementation\prototype such a use case is supported. The goal was to able to write like this in C
/* existing code*/
extern int foo();
int foo(){}
/* addition */
#ifdef __ARM_FEATURE_FUNCTION_MULTI_VERSIONING
__attribute__((target_version(“...")))
int foo(){}
#endif

so an existing codebase can be extended without breaking it even for old compilers, without heavy checks for attribute support.

> 3) If you will implement 'target_version' attribute, I would like to see it available also for the
>   existing targets supporting MVC
Yes, this is the plan if other target maintainers will accept it.
IMHO all semantical differences would work for all targets.
> 
> 4) A small note about the mangling, the existing i386 naming scheme looks like:
> 
> ...
> _Z3foov.avx2_ssse3
> ...
> 
> 5) Can you please define how will you evaluate priorities for a situation where multiple features
>   are used (e.g. dotprod+sm)?
> 
>   Note we face the very same problem on i386, where it's very hard to specify a priority
>   for the family of avx512 features. That said, an optional priority specifier might be possible.
ACLE provides a table of priorities for given feature and a simple algorithm how to choose.

Version where the most features are requested will be picked,
then the one with the highest priority.
in case of (dotprod+sm, sve) set the dotprod+sm will be selected just because it is more specified, even
sve has higher priority.

We considered the other of the attributes in the source, but that might be quite problematic to preserve during
compilation.

A new attribute or variant that provides priority could work too, just so far the newer feature usually a better
choice, and those got higher priority.

> 
> 6) Note that as opposed to i385 and Powerpc, we don't allow a combination of ISA flags for target_clone
>   attribute (like sse2+avx512f).
Noted, I think in case of Arm it may make sense to support it.
> 
> 7) FMV may be disabled in compile time by a compiler flag. In this case the default version shall be used.
> 
>   I would like to see the functionality also target agnostic.
Sure, I agree.  the proposed flag is -mno-fmv (-mfmv default on). 
Also maybe the feature indication define __ARM_FEATURE_FUNCTION_MULTI_VERSIONING could be just
__FEATURE_FUNCTION_MULTI_VERSIONING?

> 
> Anyway, looking forward to the Arm implementation.
> Hope the comments are constructive.
Thanks, help me a lot.

> 
> Cheers,
> Martin


  reply	other threads:[~2022-07-21 17:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-18 10:36 Daniel Kiss
2022-07-19 10:01 ` Martin Liška
2022-07-21 17:49   ` Daniel Kiss [this message]
2022-07-22  8:12     ` Martin Liška
2022-07-22  8:40       ` Daniel Kiss
2022-07-25 14:17         ` Martin Liška
2022-11-23 12:28 ` Martin Liška

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=285FC35B-89C4-405B-AA87-21E838B58F60@arm.com \
    --to=daniel.kiss@arm.com \
    --cc=Pavel.Iliin@arm.com \
    --cc=gcc@gcc.gnu.org \
    --cc=mliska@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).