[ovs-dev] [PATCH RFC 2/5] configure: Include -mprefetchwt1 explicitly.

Ben Pfaff blp at ovn.org
Mon Dec 4 21:01:35 UTC 2017


On Mon, Dec 04, 2017 at 08:59:47PM +0000, Bodireddy, Bhanuprakash wrote:
> >On Mon, Dec 04, 2017 at 08:16:47PM +0000, Bhanuprakash Bodireddy wrote:
> >> Processors support prefetch instruction in anticipation of write but
> >> compilers(gcc) won't use them unless explicitly asked to do so even
> >> with '-march=native' specified.
> >>
> >> [Problem]
> >>   Case A:
> >>     OVS_PREFETCH_CACHE(addr, OPCH_HTW)
> >>        __builtin_prefetch(addr, 1, 3)
> >>          leaq    -112(%rbp), %rax        [Assembly]
> >>          prefetchw  (%rax)
> >>
> >>   Case B:
> >>     OVS_PREFETCH_CACHE(addr, OPCH_LTW)
> >>        __builtin_prefetch(addr, 1, 1)
> >>          leaq    -112(%rbp), %rax        [Assembly]
> >>          prefetchw  (%rax)             <***problem***>
> >>
> >>   Inspite of specifying -march=native and using Low Temporal
> >Write(OPCH_LTW),
> >>   the compiler generates 'prefetchw' instruction instead of 'prefetchwt1'
> >>   instruction available on processor.
> >>
> >> [Solution]
> >>   Include -mprefetchwt1
> >>
> >>   Case B:
> >>     OVS_PREFETCH_CACHE(addr, OPCH_LTW)
> >>        __builtin_prefetch(addr, 1, 1)
> >>          leaq    -112(%rbp), %rax        [Assembly]
> >>          prefetchwt1  (%rax)
> >>
> >> [Testing]
> >>   $ ./boot.sh
> >>   $ ./configure
> >>      checking target hint for cgcc... x86_64
> >>      checking whether gcc accepts -mprefetchwt1... yes
> >>   $ make -j
> >>
> >> Signed-off-by: Bhanuprakash Bodireddy
> >> <bhanuprakash.bodireddy at intel.com>
> >
> >Does this have any effect if the architecture or CPU configured for use does
> >not support prefetchwt1?
> 
> That's a good question and I spent reasonable time today to figure this out.
> I have Haswell, Broadwell and Skylake CPUs and they all support this instruction.  But I found that this instruction isn't enabled by default even with march=native and so need to explicitly enable this.
> 
> Coming to your question, there won't be side effects on using OPCH_LTW.
> On Processors that *doesn't* support PREFETCHW and PREFETCHWT1 the compiler generates a 'prefetcht1' instruction.
> On processors that support PREFETCHW the compiler generates 'prefetchw' instruction.
> On processors that support PREFETCHW & PREFETCHWT1, the compiler generates 'prefetchwt1' instruction with -mprefetchwt1 explicitly enabled.
> 
> >If it could lead to that situation, then this does not
> >seem like the right thing to do, and we might want to fall back to
> >recommending use of the option when the person building knows that the
> >software will run on a machine with prefetchwt1.
> 
> According to above on processors that doesn't have this instruction support, 'prefetchnt1' instruction would be generated and doesn't have side effects.
> I verified this using https://gcc.godbolt.org/  and carefully checking the instructions generated for different compiler versions and march flags.

OK.  That is good reassurance, then, so:
        Acked-by: Ben Pfaff <blp at ovn.org>

Beyond the comments I've made already, I don't expect to review this
series myself.  Thanks for all the work you've put into it.


More information about the dev mailing list