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