RFR: 8283566: G1: Improve G1BarrierSet::enqueue performance [v3]

Thomas Schatzl tschatzl at openjdk.java.net
Wed Mar 30 11:20:42 UTC 2022


On Wed, 30 Mar 2022 10:11:36 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

>> While looking at startup/warmup benchmarks for VarHandles, I noticed that `G1BarrierSet::enqueue` is not inlined and quite hot. Its uses also load the oop first, and then check if queues are active. This could be improved a bit. This only matters for the barrier paths that VM takes, which is the case for `java.lang.invoke` VM infra. 
>> 
>> Not sure about `enqueue_oop` name, I did it to avoid accidental overload clash with `enqueue(T* dst)`. Open for suggestions.
>> 
>> On a simple test:
>> 
>> 
>> import java.lang.invoke.MethodHandles;
>> import java.lang.invoke.VarHandle;
>> 
>> public class VHWarmup {
>> 
>>     static final int SIZE = 1_000_000;
>> 
>>     private VarHandle[] vhs;
>>     private int x;
>> 
>>     public static void main(String... args) throws Exception {
>>         new VHWarmup().run();
>>     }
>> 
>>     public void run() throws Exception {
>>         vhs = new VarHandle[SIZE];
>>         for (int c = 0; c < SIZE; c++) {
>>             VarHandle vh = MethodHandles.lookup().findVarHandle(VHWarmup.class, "x", int.class);
>>             vh.get(this);
>>             vhs[c] = vh;
>>         }
>>     }
>> }
>> 
>> 
>> Baseline:
>> 
>> 
>> $ perf stat -r 10 build/linux-x86_64-server-release/images/jdk/bin/java -Xms128m -Xmx128m VHWarmup > /dev/null
>> 
>>  Performance counter stats for 'build/linux-x86_64-server-release/images/jdk/bin/java -Xms128m -Xmx128m VHWarmup' (10 runs):
>> 
>>           1,392.13 msec task-clock                #    1.183 CPUs utilized            ( +-  0.45% )
>>                887      context-switches          #    0.637 K/sec                    ( +-  1.05% )
>>                  6      cpu-migrations            #    0.004 K/sec                    ( +- 14.72% )
>>             31,755      page-faults               #    0.023 M/sec                    ( +-  0.17% )
>>      4,708,582,477      cycles                    #    3.382 GHz                      ( +-  0.44% )  (50.46%)
>>        168,230,638      stalled-cycles-frontend   #    3.57% frontend cycles idle     ( +-  2.75% )  (50.35%)
>>        790,033,580      stalled-cycles-backend    #   16.78% backend cycles idle      ( +-  1.82% )  (50.03%)
>>      9,094,235,238      instructions              #    1.93  insn per cycle         
>>                                                   #    0.09  stalled cycles per insn  ( +-  0.22% )  (49.54%)
>>      1,716,367,002      branches                  # 1232.909 M/sec                    ( +-  0.38% )  (49.65%)
>>          3,908,772      branch-misses             #    0.23% of all branches          ( +-  2.89% )  (49.97%)
>> 
>>            1.17642 +- 0.00616 seconds time elapsed  ( +-  0.52% )
>> 
>> 
>> Patched:
>> 
>> 
>> $ perf stat -r 10 build/linux-x86_64-server-release/images/jdk/bin/java -Xms128m -Xmx128m VHWarmup > /dev/null
>> 
>>  Performance counter stats for 'build/linux-x86_64-server-release/images/jdk/bin/java -Xms128m -Xmx128m VHWarmup' (10 runs):
>> 
>>           1,288.69 msec task-clock                #    1.203 CPUs utilized            ( +-  0.73% )
>>                860      context-switches          #    0.667 K/sec                    ( +-  1.38% )
>>                  7      cpu-migrations            #    0.006 K/sec                    ( +- 11.96% )
>>             31,830      page-faults               #    0.025 M/sec                    ( +-  0.13% )
>>      4,331,508,315      cycles                    #    3.361 GHz                      ( +-  0.72% )  (50.01%)
>>        151,638,797      stalled-cycles-frontend   #    3.50% frontend cycles idle     ( +-  2.94% )  (49.56%)
>>        604,797,159      stalled-cycles-backend    #   13.96% backend cycles idle      ( +-  4.17% )  (49.70%)
>>      8,517,580,297      instructions              #    1.97  insn per cycle         
>>                                                   #    0.07  stalled cycles per insn  ( +-  0.50% )  (49.99%)
>>      1,600,179,319      branches                  # 1241.714 M/sec                    ( +-  0.46% )  (50.44%)
>>          4,129,679      branch-misses             #    0.26% of all branches          ( +-  4.39% )  (50.30%)
>> 
>>            1.07125 +- 0.00822 seconds time elapsed  ( +-  0.77% )
>> 
>> 
>> Additional testing:
>>  - [x] Linux x86_64 fastdebug `tier1`
>>  - [x] Linux x86_64 fastdebug `tier2`
>>  - [x] SPECjvm2008 shows no regressions
>
> Aleksey Shipilev 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 seven additional commits since the last revision:
> 
>  - Merge branch 'master' into JDK-8283566-g1-enqueue
>  - enqueue_preloaded*
>  - enqueue_loc
>  - Merge branch 'master' into JDK-8283566-g1-enqueue
>  - Cleanups
>  - More complete patch
>  - Inlining

Marked as reviewed by tschatzl (Reviewer).

-------------

PR: https://git.openjdk.java.net/jdk/pull/7921



More information about the hotspot-gc-dev mailing list