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