SpinPause() should be inlined?
daniel.daugherty at oracle.com
daniel.daugherty at oracle.com
Tue Jun 22 15:55:14 UTC 2021
Here's the RFE where that was discussed back in 2018:
JDK-8208458 Simplify and inline os::SpinPause() for non-Windows OS
on X86
https://bugs.openjdk.java.net/browse/JDK-8208458
Dan
On 6/22/21 10:51 AM, Yasumasa Suenaga wrote:
> Hi all,
>
> I saw lock contention in SecureRandom. When I was analyzing it, I had
> a question.
>
> ObjectMonitor::TrySpin() calls SpinPause(). SpinPause() would issue
> PAUSE, but it is not inlined as following:
>
> ```
> 1587e90: f0 4d 0f b1 2e lock cmpxchg %r13,(%r14)
> 1587e95: 48 85 c0 test %rax,%rax
> 1587e98: 74 16 je 1587eb0
> <ObjectMonitor::TrySpin(JavaThread*)+0x60>
> 1587e9a: e8 31 7b d4 ff callq 12cf9d0 <SpinPause>
> 1587e9f: 83 eb 01 sub $0x1,%ebx
> 1587ea2: 72 da jb 1587e7e
> <ObjectMonitor::TrySpin(JavaThread*)+0x2e>
> ```
>
> I found following comment about it in os.hpp. It says SpinPause()
> should be inlined.
>
> ```
> // Note that "PAUSE" is almost always used with synchronization
> // so arguably we should provide Atomic::SpinPause() instead
> // of the global SpinPause() with C linkage.
> // It'd also be eligible for inlining on many platforms.
> ```
>
> According to Intel Software Developer's Manual, PAUSE seems to need to
> be inlined, but I'm not sure it can be allow through function call.
> I've fixed it to do so for Linux x64 [1] and I benchmarked with [2],
> then I saw some advantage in PAUSE on my Core i3-8145U, but it may be
> within the margin of error.
>
> * original
> Benchmark (algo) (bytes) Mode Cnt Score
> Error Units
> RandomBenchmark.fillRandomInMT DRBG 16 thrpt 3 510141.578
> ± 138543.261 ops/s
>
> * with inlined PAUSE
> Benchmark (algo) (bytes) Mode Cnt Score
> Error Units
> RandomBenchmark.fillRandomInMT DRBG 16 thrpt 3 531589.958
> ± 66942.549 ops/s
>
>
> Should be inlined PAUSE as `Atomic::SpinPause()`?
>
>
> Thanks,
>
> Yasumasa
>
>
> [1]
> https://github.com/YaSuenag/jdk/commit/66b31d35fac6fb0537bb9d85957157342fec564d
> [2]
> https://github.com/YaSuenag/hwrand/blob/master/benchmark/src/main/java/com/yasuenag/hwrand/benchmark/RandomBenchmark.java#L59-L64
More information about the hotspot-dev
mailing list