Function Multiversioning in GCC6

O Mahony, Billy billy.o.mahony@intel.com
Thu Apr 6 10:04:00 GMT 2017



> -----Original Message-----
> From: Victor Rodriguez [mailto:vm.rod25@gmail.com]
> Sent: Wednesday, April 5, 2017 8:09 PM
> To: O Mahony, Billy <billy.o.mahony@intel.com>; Evgeny Stupachenko
> <evstupac@gmail.com>
> Cc: Xi Ruoyao <ryxi@stu.xidian.edu.cn>; gcc-help@gcc.gnu.org
> Subject: Re: Function Multiversioning in GCC6
> 
> On Tue, Apr 4, 2017 at 4:18 AM, O Mahony, Billy <billy.o.mahony@intel.com>
> wrote:
> > Hi Victor,
> >
> >> -----Original Message-----
> >> From: Victor Rodriguez [mailto:vm.rod25@gmail.com]
> >> Sent: Monday, April 3, 2017 10:29 PM
> >> To: O Mahony, Billy <billy.o.mahony@intel.com>
> >> Cc: Xi Ruoyao <ryxi@stu.xidian.edu.cn>; gcc-help@gcc.gnu.org
> >> Subject: Re: Function Multiversioning in GCC6
> >>
> >> On Thu, Mar 30, 2017 at 3:59 AM, O Mahony, Billy
> >> <billy.o.mahony@intel.com> wrote:
> >> > Hi Victor,
> >> >
> >> > Thanks to you and  Abraham Duenas, and Evgeny Stupachenko for your
> >> work on FMV - it's a very neat feature and from my own investigations
> >> so far it works with minimal overhead even when used with inlined
> functions.
> >> >
> >> Welcome :)
> >>
> >> > One thing that could be stated explicitly in the article is that
> >> > use of the 'target' attribute with identically named functions
> >> > (i.e. the first code sample in the lwn article) is still C++-only
> >> > in gcc-6
> >>
> >> yes
> >>
> >> and if you want to do this with C you need to create your own ifunc
> >> resolver and have several differently named functions.
> >> >
> >>
> >> The idea is that you use one single funtion with just atributes ,
> >> instead of multiple funtions
> >>
> >> Why do you need old implementation of C++ FMV in C ?
> >
> > [[BO'M]]
> > I'm working on a code base that already has different definitions of
> functions optimized for specific cpu instruction sets. One definition is picked
> by macro at compile time based on make flags.
> >
> Sounds interesting, If something is not optimized for particular target  you
> should file a bugzilla report. if is proper for your code, then as you mention
> FMV is not the best option. However try to reevaluate if this is the best
> approach for your application. Maybe is a good time to rewrite it and make
> more compact and understandable.
> 
> > In my experiments with FMV I've looked at a hashing function. There are
> two definitions - a pure C definition and one that uses sse42 intrinsics. The
> pure C impl is really a set of inlined functions as I pulled it out of a suite of
> hashing functions (hash32, hash64, hash32_array, etc etc) for the purposes
> of the experiment.
> >
> > I'm assuming that, sophisticated as compilers are now, it won't replace the
> several layers of  inlined C functions with single sse42 intrinsic call just
> because I specify "sse42" as one of the list of target_clones. So I stuck with
> the several definitions solution.
> 
> Is your code open source ? so we can tak ea look ?
[[BO'M]] Hi Victor,
I'm looking at this wrt to Open vSwitch code https://github.com/openvswitch/ovs

As an experiment I was compiling a test program with both the sse42 and default versions of hash_words_inline function which are both in lib/hash.h. Currently one implementation or the other is chosen by compile time #def.

It looks like ifunc is supported by the latest version of clang. Do you know if it is supported by BSD and Windows.

Thanks,
Billy. 

> 
> >
> >
> >>
> >> Regards
> >>
> >> > Thanks,
> >> > Billy.
> >> >
> >> >
> >> >
> >> >> -----Original Message-----
> >> >> From: Victor Rodriguez [mailto:vm.rod25@gmail.com]
> >> >> Sent: Thursday, March 30, 2017 1:10 AM
> >> >> To: O Mahony, Billy <billy.o.mahony@intel.com>
> >> >> Cc: Xi Ruoyao <ryxi@stu.xidian.edu.cn>; gcc-help@gcc.gnu.org
> >> >> Subject: Re: Function Multiversioning in GCC6
> >> >>
> >> >> On Thu, Mar 23, 2017 at 4:45 AM, O Mahony, Billy
> >> >> <billy.o.mahony@intel.com> wrote:
> >> >> >
> >> >> > Hi Xi,
> >> >> >
> >> >> > Thanks for the clarification/confirmation.
> >> >> >
> >> >> > Regards,
> >> >> > Billy.
> >> >> >
> >> >> > > -----Original Message-----
> >> >> > > From: Xi Ruoyao [mailto:ryxi@stu.xidian.edu.cn]
> >> >> > > Sent: Thursday, March 23, 2017 9:21 AM
> >> >> > > To: O Mahony, Billy <billy.o.mahony@intel.com>
> >> >> > > Cc: ryxi@stu.xidian.edu.cn; gcc-help@gcc.gnu.org
> >> >> > > Subject: Re: Function Multiversioning in GCC6
> >> >> > >
> >> >> > > On 2017-03-22 10:51 +0000, O Mahony, Billy wrote:
> >> >> > >
> >> >> > > > However when I compile the first example in this LWN article
> >> >> > > > https://lwn.net/Articles/691932/ with gcc-6 C compiler it
> >> >> > > > fails with
> >> >> > > > (error: redefinition of
> >> >> > > > 'foo'...) .
> >> >> > >
> >> >> > > The document
> >> >> > > <https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/Function-
> >> >> > > Multiversioning.html> said:
> >> >> > >
> >> >> > >     With the GNU *C++* front end, for x86 targets, you may
> >> >> > > specify multiple versions of the function.
> >> >> > >
> >> >> > > FMV doesn't work with C FE.  In C,
> >> >> > > __attribute__((target("sse4.2"))) just means to compile this
> >> >> > > function with -msse4.2, see
> >> >> > > <https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/Common-Function-
> >> >> > > Attributes.html>.
> >> >> > >
> >> >> > > --
> >> >> > > Xi Ruoyao <ryxi@stu.xidian.edu.cn> School of Aerospace Science
> >> >> > > and Technology, Xidian University
> >> >> >
> >> >>
> >> >> You can also read this LWN article:
> >> >>
> >> >> https://lwn.net/Articles/691932/


More information about the Gcc-help mailing list