RFR: 8264054: Bad XMM performance on java.lang.MathBench.sqrtDouble
Eric Caspole
ecaspole at openjdk.java.net
Tue Mar 30 14:56:08 UTC 2021
On Tue, 30 Mar 2021 12:27:27 GMT, Nils Eliasson <neliasso at openjdk.org> wrote:
>> For the j.l.Math JMH at https://github.com/openjdk/jmh-jdk-microbenchmarks/blob/master/micros-jdk11/src/main/java/org/openjdk/bench/java/lang/MathBench.java, the performance for sqrt benchmark could be improved. Thanks a lot to Eric Caspole for finding this issue.
>>
>> Benchmark:
>> @Benchmark
>> public double sqrtDouble() {
>> return Math.sqrt(double4Dot1);
>> }
>>
>> Current code generated (linux format) by c2 JIT is:
>> vsqrtsd 0x50(%r10),%xmm0,%xmm0
>>
>> The vsqrtsd instruction operation is specified as below:
>> VSQRTSD (VEX.128 encoded version)
>> DEST[63:0] := SQRT(SRC2[63:0])
>> DEST[127:64] := SRC1[127:64]
>> DEST[MAXVL-1:128] := 0
>>
>> The upper 127:64 bits are set from previous contents of xmm0. As the destination xmm0 register was not initialized prior to use by c2 JIT, this causes stall and lower performance.
>>
>> By adding xmm0 initialization prior to use, the performance of the above benchmark improves significantly.
>>
>> Code generated after patch:
>> vxorpd %xmm0,%xmm0,%xmm0
>> vsqrtsd 0x50(%r10),%xmm0,%xmm0
>>
>> Performance before patch:
>> Benchmark Mode Cnt Score Error Units
>> MathBench.sqrtDouble thrpt 8 193612.396 ± 95.807 ops/ms
>>
>> Performance after patch:
>> MathBench.sqrtDouble thrpt 8 276388.024 ± 846.372 ops/ms
>>
>> Best Regards,
>> Sandhya
>
> In the bug report you are mentioning new test micro benchmark test cases. Have you already contributed those, or would you like to add those to this PR?
I added these micros the the https://github.com/openjdk/jmh-jdk-microbenchmarks a couple weeks ago, before we knew about this problem, because it is easy to work on JMH with Maven. But it would be best to contribute these micros into the JDK repo at the same time as this patch. I will get it together for the JDK repo and connect with Sandhya.
-------------
PR: https://git.openjdk.java.net/jdk/pull/3256
More information about the hotspot-compiler-dev
mailing list