RFR: 8322732: ForkJoinPool may underutilize cores in async mode [v7]
Doug Lea
dl at openjdk.org
Wed May 29 14:54:11 UTC 2024
On Wed, 29 May 2024 14:19:52 GMT, Viktor Klang <vklang at openjdk.org> wrote:
>> Doug Lea has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 41 additional commits since the last revision:
>>
>> - Merge branch 'openjdk:master' into JDK-8322732
>> - Add test for utilization with interdependent tasks
>> - Un-misplace onSpinWait call
>> - Adjust control flow
>> - Reduce memory stalls
>> - Merge branch 'openjdk:master' into JDK-8322732
>> - More performance tradoffs
>> - Address review comments
>> - Merge branch 'openjdk:master' into JDK-8322732
>> - Repack some fields; adjust control flow
>> - ... and 31 more: https://git.openjdk.org/jdk/compare/2d88272f...cf5fe55c
>
> src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 2094:
>
>> 2092: if (((p = w.phase) & IDLE) != 0)
>> 2093: p = awaitWork(w, delay); // block, drop, or exit
>> 2094: }
>
> I'm presuming the code below would be equivalent but avoid calculating the delay unless w.phase is IDLE?
>
> Suggestion:
>
> if ((p & IDLE) != 0 && ((p = w.phase) & IDLE) != 0) {
> long delay = (((qc & RC_MASK) > 0L) ? 0L :
> (w.source != INVALID_ID) ? keepAlive :
> TIMEOUT_SLOP); // minimal delay if cascade
> p = awaitWork(w, delay); // block, drop, or exit
> }
Seems slightly better not to recheck until call, since previous loop would usually have caught this if there was actually any work.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/19131#discussion_r1619034460
More information about the core-libs-dev
mailing list