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: Function Multiversioning Usability.


The specifications should apply to virtual member functions too --
though the underlying implementation for MVed virtual functions and
virtual calls can be quite different.

David

On Tue, Aug 16, 2011 at 1:37 PM, Sriraman Tallam <tmsriram@google.com> wrote:
> Hi,
>
> ?I am working on supporting function multi-versioning in GCC and here
> is a write-up on its usability.
>
> Multiversioning Usability
> ====================
>
> For a simple motivating example,
>
> int
> find_popcount(unsigned int i)
> {
> ?return __builtin_popcount(i);
> }
>
> Currently, compiling this with -mpopcnt will result in the “popcnt”
> instruction being used and otherwise call a built-in generic
> implementation. It is desirable to have two versions of this function
> so that it can be run both on targets that support the popcnt insn and
> those that do not.
>
>
> * Case I - User Guided Versioning where only one function body is
> provided by the user.
>
> This case addresses a use where the user wants multi-versioning but
> provides only one function body. ?I want to add a new attribute called
> “mversion” which will be used like this:
>
> int __attribute__(mversion(“popcnt”))
> find_popcount(unsigned int i)
> {
> ?return __builtin_popcount(i);
> }
>
> With the attribute, the compiler should understand that it should
> generate two versions for this function. The user makes a call to this
> function like a regular call but the code generated would call the
> appropriate function at run-time based on a check to determine if that
> instruction is supported or not.
>
> The attribute can be scaled to support many versions but allowing a
> comma separated list of values for the mversion attribute. For
> instance, “__attribute__(mversion(“sse3”, “sse4”, ...)) will provide a
> version for each. For N attributes, N clones plus one clone for the
> default case will have to be generated by the compiler. The arguments
> to the "mversion" attribute will be similar to the arguments supported
> by the "target" attribute.
>
> This attribute is useful if the same source is going to be used to
> generate the different versions. If this has to be done manually, the
> user has to duplicate the body of the function and specify a target
> attribute of “popcnt” on one clone. Then, the user has to use
> something like IFUNC support or manually write code to call the
> appropriate version. All of this will be done automatically by the
> compiler with this new attribute.
>
> * Case II - User Guided Versioning where the function bodies for each
> version differ and is provided by the user.
>
> This case pertains to multi-versioning when the source bodies of the
> two or more versions are different and are provided by the user. Here
> too, I want to use a new attribute, “version”. Now, the user can
> specify versioning intent like this:
>
> int __attribute__((version(“popcnt”))
> find_popcnt(unsigned int i)
> {
> ? // inline assembly of the popcnt instruction, specialized version.
> ?asm(“popcnt ….”);
> }
>
> int
> find_popcnt(unsigned int i)
> {
> ?//generic code for doing this
> ?...
> }
>
> This uses function overloading to specify versions. ?The compiler will
> understand that versioning is requested, since the functions have
> different attributes with "version", and will generate the code to
> execute the right function at run-time. ?The compiler should check for
> the existence of one body without the attribute which will be the
> default version.
>
> * Case III - Versioning is done automatically by the compiler.
>
> I want to add a new compiler flag “-mversion” along the lines of “-m”.
> If the user specifies “-mversion=popcnt” then the compiler will
> automatically create two versions of any function that is impacted by
> the new instruction. The difference between “-m” and “-mversion” will
> be that while “-m” generates only the specialized version, “-mversion”
> will generate both the specialized and the generic versions. ?There is
> no need to explicity mark any function for versioning, no source
> changes.
>
> The compiler will decide if it is beneficial to multi-version a
> function based on heuristics using hotness information, code size
> growth, etc.
>
>
> Runtime support
> ===============
>
> In order for the compiler to generate multi-versioned code, it needs
> to call functions that would test if a particular feature exists or
> not at run-time. For example, IsPopcntSupported() would be one such
> function. I have prepared a patch to do this which adds the runtime
> support in libgcc and supports new builtins to test the various
> features. I will send the patch separately to keep the dicussions
> focused.
>
>
> Thoughts?
>
> Thanks,
> -Sri.
>


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