RFR(m): 8214271: Fast primitive to wake many threads

Robbin Ehn robbin.ehn at oracle.com
Mon Dec 17 11:08:19 UTC 2018


Thanks, fixed.

I'll send update once I sorted out part 3.

On 11/28/18 5:17 AM, David Holmes wrote:
> Hi Robbin,
> 
> Part 2:
> 
> I've looked at the generic waitBarrier implementation and it seems okay. A lot 
> of the usage constraints not clear in the API are more evident in the asserts in 
> the code. I still have some doubts about the benefit of helping with the wakeups 
> rather than it all being done by one thread, due to potential contention on the 
> semaphore - but your performance numbers show it can help (I just hope it 
> doesn't hurt on other platforms/systems - time will tell).

I think once of the best features is if the VM thread gets swapped out there is 
a big chance that other threads keep posting. An alternative option is to create 
a new Semaphore for each arm and thus allow extra posts.

/Robbin

> 
> Some minor nits with comments:
> 
> - src/hotspot/share/utilities/waitBarrier_generic.hpp
> 
> 31 // Except for the barrier tag it self, it uses two counter to keep the semaphore
>   32 // count correct and not leave any late thread hanging.
> 
> s/it self/itself/
> 
> s/counter/counters/
> 
> suggest s/hanging/waiting/
> 
> 38   // Which means it can become a waiter.
> 
> suggest -> // These threads can become waiters.
> 
> ---
> 
> -  src/hotspot/share/utilities/waitBarrier_generic.cpp
> 
> 55   // We need an exact count and never go below 0.
> 56   // Otherwise the semaphore might contain to many posts.
> 
> suggest:
> 
> // We need an exact count which never goes below zero,
> // otherwise the semaphore may be signalled too many times.
> 
> 74     // We must loop here until there is no waiters or potential waiters.
> 
> s/is/are/
> 
> More to follow.
> 
> Thanks,
> David
> 
> On 24/11/2018 2:55 am, Robbin Ehn wrote:
>> Forgot RFR in subject.
>>
>> /Robbin
>>
>> On 2018-11-23 17:51, Robbin Ehn wrote:
>>> Hi all, please review.
>>>
>>> When a safepoint is ended we need a way to get back to 100% utilization as fast
>>> as possible. 100% utilization means no idle cpu in the system if there is a
>>> JavaThread that could be executed. The traditional ways to wake many, e.g.
>>> semaphore, pthread_cond, is not implemented with a single syscall instead they
>>> typical do one syscall per thread to wake.
>>>
>>> This change-set contains that primitive, the WaitBarrier, and a gtest for it.
>>> No actual users, which is in coming patches.
>>>
>>> The WaitBarrier solves by doing a cooperative semaphore posting, threads woken
>>> will also post. On Linux we can instead directly use a futex and with one
>>> syscall wake all. Depending on how many threads and cpus the performance vary,
>>> but a good utilization of the machine, just on the edge of saturated, the 
>>> time to reach 100% utilization is around 3 times faster with the WaitBarrier 
>>> (where futex is faster than semaphore).
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~rehn/8214271/webrev/
>>>
>>> CR:
>>> https://bugs.openjdk.java.net/browse/JDK-8214271
>>>
>>> Passes 100 iterations of gtest on our platforms, both fastdebug and release.
>>> And have been stable when used in safepoints (t1-8) (coming patches).
>>>
>>> Thanks, Robbin


More information about the hotspot-dev mailing list