RFR: 8264945: Optimize the code-gen for Math.pow(x, 0.5)
Jie Fu
jiefu at openjdk.java.net
Fri Apr 16 07:08:35 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
Hi all,
According to the discussion [1], we can still perform pow(x, 0.5) => sqrt(x) for x >= 0.0 or x is +Inf/NaN.
To better help the code review, the whole optimization has been split into JDK-8265325 and JDK-8264945.
- 1) JDK-8265325: Optimize StubRoutines::dpow() for Math.pow(x, 0.5)
- 2) JDK-8264945: Optimize the code-gen for Math.pow(x, 0.5)
I'll update this pr once JDK-8265325 is finished since it depends on JDK-8265325.
Thanks.
Best regards,
Jie
[1] https://mail.openjdk.java.net/pipermail/core-libs-dev/2021-April/076220.html
-------------
PR: https://git.openjdk.java.net/jdk/pull/3404
More information about the hotspot-compiler-dev
mailing list