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