RFR: 8285040: PPC64 intrinsics for divideUnsigned and remainderUnsigned methods in java.lang.Integer and java.lang.Long [v4]

Vladimir Kozlov kvn at openjdk.java.net
Wed Apr 20 16:28:28 UTC 2022


On Wed, 20 Apr 2022 15:30:34 GMT, Martin Doerr <mdoerr at openjdk.org> wrote:

>> Add match rules for UDivI, UModI, UDivL, UModL as on x86 (JDK-8282221). PPC64 doesn't have DivMod instructions which can deliver both results at once.
>> Note: The x86 tests can currently not be extended to this platform because https://bugs.openjdk.java.net/browse/JDK-8280120 is not yet implemented.
>> 
>> Removed UDivI, UModI again in second commit, because performance was worse. C2 can optimize better without intrinsification.
>> 
>> LongDivMod without UDivL, UModL on Power9:
>> 
>> Iteration   1: 5453.092 ns/op
>> Iteration   2: 5480.991 ns/op
>> Iteration   3: 5465.746 ns/op
>> Iteration   4: 5496.196 ns/op
>> Iteration   5: 5500.508 ns/op
>> 
>> 
>> With UDivL, UModL:
>> 
>> Iteration   1: 3253.293 ns/op
>> Iteration   2: 3253.079 ns/op
>> Iteration   3: 3252.806 ns/op
>> Iteration   4: 3252.636 ns/op
>> Iteration   5: 3252.717 ns/op
>> 
>> 
>> Complete results:
>> 
>> Without UDivL, UModL:
>> 
>> Benchmark                               (BUFFER_SIZE)  (divisorType)  Mode  Cnt     Score     Error  Units
>> LongDivMod.testDivideRemainderUnsigned           1024          mixed  avgt   25  5482.364 ±  18.448  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       positive  avgt   25  4722.370 ±   2.314  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       negative  avgt   25  2024.052 ±   0.604  ns/op
>> LongDivMod.testDivideUnsigned                    1024          mixed  avgt   25  4772.528 ±  63.147  ns/op
>> LongDivMod.testDivideUnsigned                    1024       positive  avgt   25  3711.178 ±   1.178  ns/op
>> LongDivMod.testDivideUnsigned                    1024       negative  avgt   25  1195.149 ±   0.822  ns/op
>> LongDivMod.testRemainderUnsigned                 1024          mixed  avgt   25  4753.722 ± 115.171  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       positive  avgt   25  3749.799 ±   5.935  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       negative  avgt   25  1488.802 ±   0.628  ns/op
>> 
>> 
>> With UDivL, UModL:
>> 
>> Benchmark                               (BUFFER_SIZE)  (divisorType)  Mode  Cnt     Score   Error  Units
>> LongDivMod.testDivideRemainderUnsigned           1024          mixed  avgt   25  3253.162 ± 1.019  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       positive  avgt   25  3252.280 ± 1.608  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       negative  avgt   25  3252.933 ± 1.850  ns/op
>> LongDivMod.testDivideUnsigned                    1024          mixed  avgt   25  1648.233 ± 1.830  ns/op
>> LongDivMod.testDivideUnsigned                    1024       positive  avgt   25  1648.639 ± 0.816  ns/op
>> LongDivMod.testDivideUnsigned                    1024       negative  avgt   25  1646.247 ± 3.835  ns/op
>> LongDivMod.testRemainderUnsigned                 1024          mixed  avgt   25  1766.701 ± 1.897  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       positive  avgt   25  1767.413 ± 1.450  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       negative  avgt   25  1767.216 ± 1.800  ns/op
>> 
>> 
>> It turns out that the "UseDivMod" optimization is key for this benchmark. Implemented with 3rd commit.
>> Without UDivL, UModL and UseDivMod optimization:
>> 
>> Benchmark                               (BUFFER_SIZE)  (divisorType)  Mode  Cnt     Score   Error  Units
>> LongDivMod.testDivideRemainderUnsigned           1024          mixed  avgt   25  1848.883 ± 3.550  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       positive  avgt   25  1849.743 ± 1.309  ns/op
>> LongDivMod.testDivideRemainderUnsigned           1024       negative  avgt   25  1848.598 ± 2.436  ns/op
>> LongDivMod.testDivideUnsigned                    1024          mixed  avgt   25  1646.810 ± 4.024  ns/op
>> LongDivMod.testDivideUnsigned                    1024       positive  avgt   25  1648.605 ± 1.157  ns/op
>> LongDivMod.testDivideUnsigned                    1024       negative  avgt   25  1648.319 ± 1.285  ns/op
>> LongDivMod.testRemainderUnsigned                 1024          mixed  avgt   25  1766.375 ± 1.559  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       positive  avgt   25  1765.909 ± 1.815  ns/op
>> LongDivMod.testRemainderUnsigned                 1024       negative  avgt   25  1766.459 ± 1.255  ns/op
>
> Martin Doerr has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Add back Integer nodes after enabling UseDivMod optimization. That makes the difference.

Make sense.

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

Marked as reviewed by kvn (Reviewer).

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


More information about the hotspot-compiler-dev mailing list