RFR(m): 8214271: Fast primitive to wake many threads
David Holmes
david.holmes at oracle.com
Wed Nov 28 04:17:15 UTC 2018
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).
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