RFR: 8283566: G1: Improve G1BarrierSet::enqueue performance

Thomas Schatzl tschatzl at openjdk.java.net
Thu Mar 24 09:17:52 UTC 2022


On Wed, 23 Mar 2022 13:34:59 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

Maybe rename `enqueue_oop` to `enqueue_not_null`? This is a fairly common naming scheme for methods specialized that way.

Lgtm.

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

Marked as reviewed by tschatzl (Reviewer).

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



More information about the hotspot-gc-dev mailing list