Using x86 pause instr in SpinPause

Vitaly Davidovich vitalyd at gmail.com
Wed Aug 29 05:31:23 PDT 2012


By the way, only thing I can think of as being a possible issue is the
pause instruction killing (or reducing) out of order/pipelined execution of
the rest of the loop body.  But then I don't know if this is such an issue
as the loop exit will probably have a branch misprediction anyway, killing
whatever is in the pipeline.

At any rate, would be interesting to see an explanation.

Cheers

Sent from my phone
On Aug 29, 2012 8:23 AM, "Vitaly Davidovich" <vitalyd at gmail.com> wrote:

> I'm actually curious to know if Eric can explain a bit more why pause is
> an issue here, possibly with some benchmark results.
>
> David's point earlier was that he doesn't think there's benefit to it in
> the way hotspot spins, but removing pause implies it can actually do harm
> rather than simply being unhelpful.
>
> I'm also assuming this is not AMD specific but Intel as well?
>
> Thanks
>
> Sent from my phone
> On Aug 29, 2012 8:04 AM, "Peter Levart" <peter.levart at marand.si> wrote:
>
>> Here's an interesting explanation about the impact of pause instruction
>> in spin-wait loops:
>>
>>
>> http://software.intel.com/en-us/articles/long-duration-spin-wait-loops-on-hyper-threading-technology-enabled-intel-processors/
>>
>> 4 years later: It may be that newer CPUs are more clever now.
>>
>> Regards, Peter
>>
>> On Tuesday, August 28, 2012 11:36:23 AM Eric Caspole wrote:
>> > Hi everybody,
>> > I have made a webrev making a one-line change to remove use of PAUSE
>> > in linux x64. This will bring linux into sync with windows where
>> > SpinPause is just "return 0" as Dan indicates below.
>> >
>> >   http://cr.openjdk.java.net/~ecaspole/nopause/webrev.00/webrev/
>> >
>> > We find that it is better not to use PAUSE in this kind of spin
>> > routine. Apparently someone discovered that on windows x64 years ago.
>> > Thanks,
>> > Eric
>> >
>> > On Aug 16, 2012, at 5:07 PM, Daniel D. Daugherty wrote:
>> > > On Win64, SpinPause() has been "return 0" since mid-2005. Way back
>> > >
>> > > when Win64 code was in os_win32_amd64.cpp:
>> > >     SCCS/s.os_win32_amd64.cpp:
>> > >
>> > >     D 1.9.1.1 05/07/04 03:20:45 dice 12 10  00025/00000/00334
>> > >     MRs:
>> > >     COMMENTS:
>> > >     5030359 -- back-end synchonization improvements - adaptive
>> > >
>> > > spinning, etc
>> > >
>> > > When the i486 and amd64 cpu dirs were merged back in 2007, the code
>> > >
>> > > became like it is below (#ifdef'ed):
>> > >     D 1.32 07/09/17 09:11:33 sgoldman 37 35 00264/00008/00218
>> > >     MRs:
>> > >     COMMENTS:
>> > >     5108146 Merge i486 and amd64 cpu directories.
>> > >     Macro-ized register names. Inserted amd64 specific code.
>> > >
>> > > Looks like on Linux-X64, the code has used the PAUSE instruction
>> > >
>> > > since mid-2005:
>> > >     D 1.3 05/07/04 03:14:09 dice 4 3        00031/00000/00353
>> > >     MRs:
>> > >     COMMENTS:
>> > >     5030359 -- back-end synchonization improvements - adaptive
>> > >
>> > > spinning, etc
>> > >
>> > > We'll have to see if Dave Dice remember why he implemented
>> > > it this way...
>> > >
>> > > Dan
>> > >
>> > > On 8/16/12 12:01 PM, Eric Caspole wrote:
>> > >> Hi everybody,
>> > >> Does anybody know the reason why SpinPause is simply "return 0" on
>> > >> Win64 but uses PAUSE on Linux in a .s file?
>> > >> We would like to remove PAUSE from linux too.
>> > >>
>> > >> Thanks,
>> > >> Eric
>> > >>
>> > >>
>> > >> ./src/os_cpu/windows_x86/vm/os_windows_x86.cpp
>> > >>
>> > >>     548 extern "C" int SpinPause () {
>> > >>     549 #ifdef AMD64
>> > >>     550    return 0 ;
>> > >>     551 #else
>> > >>     552    // pause == rep:nop
>> > >>     553    // On systems that don't support pause a rep:nop
>> > >>     554    // is executed as a nop.  The rep: prefix is ignored.
>> > >>     555    _asm {
>> > >>     556       pause ;
>> > >>     557    };
>> > >>     558    return 1 ;
>> > >>     559 #endif // AMD64
>> > >>     560 }
>> > >>
>> > >> src/os_cpu/linux_x86/vm/linux_x86_64.s
>> > >>
>> > >>      63         .globl SpinPause
>> > >>      64         .align 16
>> > >>      65         .type  SpinPause, at function
>> > >>      66 SpinPause:
>> > >>      67         rep
>> > >>      68         nop
>> > >>      69         movq   $1, %rax
>> > >>      70         ret
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/attachments/20120829/fe0dc462/attachment.html 


More information about the hotspot-runtime-dev mailing list