On Fri, 25 Feb 2022 06:22:42 GMT, Jatin Bhateja <jbhat...@openjdk.org> wrote:

>> Summary of changes:
>> - Intrinsify Math.round(float) and Math.round(double) APIs.
>> - Extend auto-vectorizer to infer vector operations on encountering scalar 
>> IR nodes for above intrinsics.
>> - Test creation using new IR testing framework.
>> 
>> Following are the performance number of a JMH micro included with the patch 
>> 
>> Test System: Intel(R) Xeon(R) Platinum 8380 CPU @ 2.30GHz (Icelake Server)
>> 
>> 
>> Benchmark | TESTSIZE | Baseline AVX3 (ops/ms) | Withopt AVX3 (ops/ms) | Gain 
>> ratio | Baseline AVX2 (ops/ms) | Withopt AVX2 (ops/ms) | Gain ratio
>> -- | -- | -- | -- | -- | -- | -- | --
>> FpRoundingBenchmark.test_round_double | 1024.00 | 504.15 | 2209.54 | 4.38 | 
>> 510.36 | 548.39 | 1.07
>> FpRoundingBenchmark.test_round_double | 2048.00 | 293.64 | 1271.98 | 4.33 | 
>> 293.48 | 274.01 | 0.93
>> FpRoundingBenchmark.test_round_float | 1024.00 | 825.99 | 4754.66 | 5.76 | 
>> 751.83 | 2274.13 | 3.02
>> FpRoundingBenchmark.test_round_float | 2048.00 | 412.22 | 2490.09 | 6.04 | 
>> 388.52 | 1334.18 | 3.43
>> 
>> 
>> Kindly review and share your feedback.
>> 
>> Best Regards,
>> Jatin
>
> Jatin Bhateja has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   8279508: Adding descriptive comments.

As per SDM, if post conversion a floating point number is non-representable in 
destination format e.g. a floating point value 3.4028235E10 post integer 
conversion will overflow the value range of integer primitive type, hence a 
-0.0 value or 0x80000000 is returned here. Similarly for +/- NaN and  +/-Inf 
post conversion value returns is -0.0.  All these cases i.e. post conversion 
non-representable floating point values and NaN/Inf values are handled in a 
special manner where algorithm first performs an unordered comparison b/w 
original source value and returns a 0 in case of  NaN, this weeds out the NaN 
case and for rest of the special values we check the MSB bit of the source and 
either return an Integer.MAX_VALUE for +ve numbers or a Integer.MIN_VALUE to 
adhere to the semantics of Math.round API.

Existing tests were enhanced to cover various special cases (NaN/Inf/+ve/-ve 
value/values which may be inexact after adding 0.5/ values which post 
conversion overflow integer value range).

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

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

Reply via email to