RFR 8080623 CPU overhead in FJ due to spinning in awaitWork
Vitaly Davidovich
vitalyd at gmail.com
Wed May 20 13:29:03 UTC 2015
It's to prevent cpu from getting a memory violation hazard when it exits
the busy wait. The commentary alludes to having pause instruction
available, to notify cpu that the code is busy waiting, but that
instruction isn't available. The randomness is to fool branch prediction
so as to not have too many instructions out of order in flight when it
ultimately breaks out of the loop.
sent from my phone
On May 20, 2015 9:20 AM, "David Holmes" <david.holmes at oracle.com> wrote:
> On 20/05/2015 8:24 PM, Paul Sandoz wrote:
>
>>
>> On May 20, 2015, at 11:46 AM, David Holmes <david.holmes at oracle.com>
>> wrote:
>>
>> On 20/05/2015 7:28 PM, Paul Sandoz wrote:
>>>
>>>>
>>>> On May 20, 2015, at 9:07 AM, David Holmes <david.holmes at oracle.com>
>>>> wrote:
>>>>
>>>> On 20/05/2015 3:55 AM, Paul Sandoz wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8080623
>>>>>>
>>>>>> diff -r ea3ca5cfc3c6
>>>>>> src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
>>>>>> ---
>>>>>> a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
>>>>>> Tue May 19 20:04:29 2015 +0300
>>>>>> +++
>>>>>> b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java
>>>>>> Tue May 19 19:54:00 2015 +0200
>>>>>> @@ -1328,13 +1328,9 @@
>>>>>> /**
>>>>>> * Number of times to spin-wait before blocking. The spins (in
>>>>>> * awaitRunStateLock and awaitWork) currently use randomized
>>>>>> - * spins. If/when MWAIT-like intrinsics becomes available, they
>>>>>> - * may allow quieter spinning. The value of SPINS must be a power
>>>>>> - * of two, at least 4. The current value causes spinning for a
>>>>>> - * small fraction of typical context-switch times, well
>>>>>> worthwhile
>>>>>> - * given the typical likelihoods that blocking is not necessary.
>>>>>> + * spins. Currently set to zero to reduce CPU usage.
>>>>>>
>>>>>
>>>>> I'd keep the commentary even if disabling spinning at this time.
>>>>>
>>>>>
>>>> Some of removed commentary makes less sense given the motivation to set
>>>> the value to zero. How about the following tweak:
>>>>
>>>> /**
>>>> * Number of times to spin-wait before blocking. The spins (in
>>>> * awaitRunStateLock and awaitWork) currently use randomized
>>>> - * spins. If/when MWAIT-like intrinsics becomes available, they
>>>> - * may allow quieter spinning. The value of SPINS must be a power
>>>> - * of two, at least 4. The current value causes spinning for a
>>>> - * small fraction of typical context-switch times, well worthwhile
>>>> - * given the typical likelihoods that blocking is not necessary.
>>>> + * spins. Currently set to zero to reduce CPU usage.
>>>>
>>>
>>> I've lost the context for what "spin" is getting randomized ??
>>>
>>>
>> Not sure there was much context to begin with :-) best to look at the
>> implementation: a spin value, initialized to SPINS, is (if > 0) decremented
>> if the next value from a PRNG (Marsaglia-like) is non-negative.
>>
>
> Not sure I grok why we would randomize the spin but ...
>
> Thanks,
> David
>
>
>>
>> + *
>>>> + * If greater than zero the value of SPINS must be a power
>>>> + * of two, at least 4. A value of 2048 causes spinning for a
>>>> + * small fraction of typical context-switch times.
>>>> + *
>>>> + * If/when MWAIT-like intrinsics becomes available, they
>>>> + * may allow quieter spinning.
>>>>
>>>
>>> Yep that's fine - thanks.
>>>
>>>
>> Thanks,
>> Paul.
>>
>>
More information about the core-libs-dev
mailing list