RFR: 8274243: Implement fast-path for ASCII-compatible CharsetEncoders on aarch64
Patric Hedlin
phedlin at openjdk.java.net
Mon Dec 6 16:16:33 UTC 2021
On Mon, 6 Dec 2021 14:09:07 GMT, Patric Hedlin <phedlin at openjdk.org> wrote:
> Implementation of ISO/ASCII char set encoding, extending current implementation with ASCII encoding support.
>
> Implementation focusing on balance between small footprint and efficiency, trying to utilise a dual SIMD path (e.g. Neoverse N1) for the additional Ascii-check.
>
> Testing: tier1-6
>
> Benchmarks (ran on Aurora/Ampere Altra):
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16384-type:ASCII..........72.23%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16384-type:BIG5...........70.38%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16384-type:ISO_8859_15....67.81%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16384-type:UTF_16......... 3.72%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16384-type:UTF_8..........68.50%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:2048-type:ASCII...........65.59%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:2048-type:BIG5............60.59%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:2048-type:ISO_8859_15.....63.79%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:2048-type:UTF_16.......... 1.04%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:2048-type:UTF_8...........63.33%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:512-type:ASCII............57.25%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:512-type:BIG5.............49.33%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:512-type:ISO_8859_15......61.37%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:512-type:UTF_16........... 0.02%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:512-type:UTF_8............54.75%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:255-type:ASCII............54.52%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:255-type:BIG5.............40.41%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:255-type:ISO_8859_15......58.46%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:255-type:UTF_16...........-0.55%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:255-type:UTF_8............55.98%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:127-type:ASCII............47.37%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:127-type:BIG5.............36.41%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:127-type:ISO_8859_15......50.83%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:127-type:UTF_16........... 8.63%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:127-type:UTF_8............48.95%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:31-type:ASCII.............17.55%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:31-type:BIG5..............18.58%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:31-type:ISO_8859_15.......20.82%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:31-type:UTF_16............ 4.16%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:31-type:UTF_8.............18.44%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16-type:ASCII.............21.96%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16-type:BIG5..............22.42%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16-type:ISO_8859_15.......30.27%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16-type:UTF_16............-1.17%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:16-type:UTF_8.............35.99%
>
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:15-type:ASCII............. 6.19%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:15-type:BIG5.............. 7.34%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:15-type:ISO_8859_15....... 8.34%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:15-type:UTF_16............-0.46%
> openjdk.bench.java.nio.CharsetEncodeDecode.encode-size:15-type:UTF_8............. 6.80%
Current implementation (including prefetch hint).
Benchmark (charsetName) (message) (timesToAppend) Mode Cnt Score Error Units
EncoderBenchmarks.charsetEncoder UTF-8 This is a simple ASCII message 3 avgt 4 144.807 ± 9.557 ns/op
EncoderBenchmarks.charsetEncoder UTF-8 This is a message with unicode 3 avgt 4 378.458 ± 206.193 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a simple ASCII message 3 avgt 4 200.844 ± 14.998 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a message with unicode 3 avgt 4 356.589 ± 8.588 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a simple ASCII message 3 avgt 4 698.518 ± 17.269 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a message with unicode 3 avgt 4 862.678 ± 30.872 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a simple ASCII message 3 avgt 4 109.413 ± 2.780 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a message with unicode 3 avgt 4 522.050 ± 34.763 ns/op
**-XX:SoftwarePrefetchHintDistance=128**
Benchmark (charsetName) (message) (timesToAppend) Mode Cnt Score Error Units
EncoderBenchmarks.charsetEncoder UTF-8 This is a simple ASCII message 3 avgt 4 144.519 ± 12.731 ns/op
EncoderBenchmarks.charsetEncoder UTF-8 This is a message with unicode 3 avgt 4 302.409 ± 51.020 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a simple ASCII message 3 avgt 4 201.144 ± 14.624 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a message with unicode 3 avgt 4 469.724 ± 4.871 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a simple ASCII message 3 avgt 4 695.666 ± 22.061 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a message with unicode 3 avgt 4 858.812 ± 22.913 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a simple ASCII message 3 avgt 4 109.598 ± 1.921 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a message with unicode 3 avgt 4 511.589 ± 34.407 ns/op
New implementation (disregards prefetch hint).
Benchmark (charsetName) (message) (timesToAppend) Mode Cnt Score Error Units
EncoderBenchmarks.charsetEncoder UTF-8 This is a simple ASCII message 3 avgt 4 116.916 ± 14.340 ns/op
EncoderBenchmarks.charsetEncoder UTF-8 This is a message with unicode 3 avgt 4 292.334 ± 10.038 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a simple ASCII message 3 avgt 4 178.490 ± 11.258 ns/op
EncoderBenchmarks.charsetEncoderWithAllocation UTF-8 This is a message with unicode 3 avgt 4 363.741 ± 13.080 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a simple ASCII message 3 avgt 4 695.520 ± 20.217 ns/op
EncoderBenchmarks.charsetEncoderWithAllocationWrappingBuilder UTF-8 This is a message with unicode 3 avgt 4 862.785 ± 13.673 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a simple ASCII message 3 avgt 4 108.263 ± 6.123 ns/op
EncoderBenchmarks.toStringGetBytes UTF-8 This is a message with unicode 3 avgt 4 516.571 ± 22.347 ns/op
-------------
PR: https://git.openjdk.java.net/jdk/pull/6723
More information about the hotspot-compiler-dev
mailing list