RFR: 8278241: Implement JVM SpinPause on linux-aarch64

Stuart Monteith smonteith at openjdk.java.net
Mon Dec 13 12:36:09 UTC 2021


On Fri, 10 Dec 2021 21:02:53 GMT, Evgeny Astigeevich <duke at openjdk.java.net> wrote:

> This JVM SpinPause can use different implementations of spin pauses. It uses `SpinWait` description which is defined with `OnSpinWaitInst`/`OnSpinWaitInstCount` options.  The `SpinWait` provides an instruction runner together with the description of the instruction and the instruction count. It can be used at places where generation of spin pauses is not possible, like in runtime SpinPause function.
> 
> The `SpinWait` description is also used for the `_onSpinWait()` intrinsic. We don't have use cases when we need different implementations for the `_onSpinWait()` intrinsic and JVM SpinPause. However JVM SpinPause might need less instructions than the intrinsic. To support such cases the instruction runner interface supports the `count` parameter.
> 
> Testing results for fastdebug and release builds:
> - `gtest`: Passed
> - `tier1`...`tier4`: Passed
> - `hotspot/jtreg/runtime/Thread/TestSpinPause.java`: Passed
> 
> JVM SpinPause is used for the synchronised statements and can benchmarked with `org.openjdk.bench.vm.lang.LockUnlock.testContendedLock`.
> 
> Benchmarking results (number of samples per an experiment: 150) for Graviton2 (Neoverse N1), 1 ISB instruction:
> 
> 
> 
> +-----------+-------------------+------------+-----------+-----------+----------+---------+
> | CPU cores | Contended threads | Base ns/op |   Error   |    New    |  Error   |  Diff   |
> +-----------+-------------------+------------+-----------+-----------+----------+---------+
> |         8 |                64 |  10007.213 | ±910.911  |  8527.346 | ±377.242 | -14.79% |
> |        16 |                64 |  10274.935 | ±880.568  |  8310.433 | ±326.845 | -19.12% |
> |        32 |                64 |  12231.947 | ±1525.364 |  9205.941 | ±394.409 | -24.74% |
> |        64 |                64 |    9929.49 | ±586.074  | 10488.695 | ±570.458 | 5.63%   |
> |        64 |                32 |   5605.119 | ±629.340  |  5023.882 | ±230.639 | -10.37% |
> |        64 |                16 |   2817.346 | ±263.696  |  2367.528 | ±94.158  | -15.97% |
> |        64 |                 2 |    870.389 | ±530.579  |   464.395 | ±126.260 | -46.65% |
> +-----------+-------------------+------------+-----------+-----------+----------+---------+

src/hotspot/cpu/aarch64/spin_wait_aarch64.hpp line 71:

> 69: 
> 70:   SpinWait(Inst inst = NONE, int count = 0, InstRunner inst_runner = run_none) :
> 71:       _inst(inst), _count(count), _inst_runner(inst_runner)  {}

Wouldn't it make more sense to have _inst_runner initialized in the constructor based on the value of Inst inst?
You aren't differentiating between the two in get_spin_wait_desc anyway.

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

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


More information about the hotspot-dev mailing list