RFR: 8264945: Optimize the code-gen for Math.pow(x, 0.5)

Jie Fu jiefu at openjdk.java.net
Mon Apr 12 07:06:38 UTC 2021


On Fri, 9 Apr 2021 22:39:44 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> Hi all,
>> 
>> I'd like to optimize the code-gen for Math.pow(x, 0.5).
>> And 7x ~ 14x performance improvement is observed by the jmh micro-benchmarks.
>> 
>> While I was optimizing a machine learning program, I found both Math.pow(x, 2) and Math.pow(x, 0.5) are used.
>> To my surprise, C2 just optimizes the case for Math.pow(x, 2) [1], but still not for Math.pow(x, 0.5) yet.
>> 
>> The patch just replace Math.pow(x, 0.5) with Math.sqrt(x).
>> 
>> Before:
>> Benchmark                     (seed)   Mode  Cnt      Score    Error   Units
>> MathBench.powDouble0Dot5           0  thrpt    8  45525.117 ? 11.686  ops/ms
>> MathBench.powDouble0Dot5Loop       0  thrpt    8      0.031 ?  0.001  ops/ms
>> 
>> Benchmark                     (seed)   Mode  Cnt      Score    Error   Units
>> MathBench.powDouble0Dot5           0  thrpt    8  45509.317 ?  6.581  ops/ms
>> MathBench.powDouble0Dot5Loop       0  thrpt    8      0.031 ?  0.001  ops/ms
>> 
>> After:
>> Benchmark                     (seed)   Mode  Cnt       Score     Error   Units
>> MathBench.powDouble0Dot5           0  thrpt    8  343354.892 ? 362.900  ops/ms
>> MathBench.powDouble0Dot5Loop       0  thrpt    8       0.457 ?   0.001  ops/mso
>> 
>> Benchmark                     (seed)   Mode  Cnt       Score    Error   Units
>> MathBench.powDouble0Dot5           0  thrpt    8  343421.559 ? 49.326  ops/ms
>> MathBench.powDouble0Dot5Loop       0  thrpt    8       0.457 ?  0.001  ops/ms
>> 
>> Testing:
>>   - tier1~3 on Linux/x64
>> 
>> Thanks,
>> Best regards,
>> Jie
>> 
>> [1] https://github.com/openjdk/jdk/blob/master/src/hotspot/share/opto/library_call.cpp#L1680
>
> Please, verify that result is the same when run with -Xint (Interpreter only) and (-XX:TieredStopAtLevel=1) C1 only. May be they need the same optimization.

Hi @vnkozlov @neliasso and @huishi-hs , 

Thanks for your review and comments.
While I was implementing the opt for C1 and interpreter, I found Math.pow(x, 0.5) and Math.sqrt(x) would compute different values for x={-0.0, Double.NEGATIVE_INFINITY} [1].
Let's hold on this issue until we have a conclusion about that question.
Thanks.

[1] https://mail.openjdk.java.net/pipermail/core-libs-dev/2021-April/076195.html

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

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


More information about the hotspot-compiler-dev mailing list