RFR: 8291550: RISC-V: jdk uses misaligned memory access when AvoidUnalignedAccess enabled [v9]

Vladimir Kempik vkempik at openjdk.org
Thu May 11 08:07:50 UTC 2023


On Thu, 11 May 2023 07:15:13 GMT, Fei Yang <fyang at openjdk.org> wrote:

>> Before the PR
>> 
>> 
>> Benchmark                      Mode  Cnt     Score   Error  Units
>> StringEquals.almostEqual       avgt   25  1214.131 ± 4.400  ns/op
>> StringEquals.almostEqualUTF16  avgt   25  1213.310 ± 7.156  ns/op
>> StringEquals.different         avgt   25    20.102 ± 2.306  ns/op
>> StringEquals.differentCoders   avgt   25    14.780 ± 1.147  ns/op
>> StringEquals.equal             avgt   25  1218.393 ± 5.275  ns/op
>> StringEquals.equalsUTF16       avgt   25  1216.750 ± 4.383  ns/op
>> 
>> 
>> 
>> With this PR
>> 
>> 
>> Benchmark                      Mode  Cnt   Score   Error  Units
>> StringEquals.almostEqual       avgt   25  28.584 ± 1.178  ns/op
>> StringEquals.almostEqualUTF16  avgt   25  28.375 ± 1.052  ns/op
>> StringEquals.different         avgt   25  19.572 ± 1.031  ns/op
>> StringEquals.differentCoders   avgt   25  14.969 ± 2.348  ns/op
>> StringEquals.equal             avgt   25  28.603 ± 0.148  ns/op
>> StringEquals.equalsUTF16       avgt   25  29.217 ± 1.969  ns/op
>> 
>> 
>> Xor moved
>> 
>> 
>> Benchmark                      Mode  Cnt   Score   Error  Units
>> StringEquals.almostEqual       avgt   25  28.455 ± 1.068  ns/op
>> StringEquals.almostEqualUTF16  avgt   25  28.244 ± 0.920  ns/op
>> StringEquals.different         avgt   25  18.940 ± 0.831  ns/op
>> StringEquals.differentCoders   avgt   25  14.566 ± 1.298  ns/op
>> StringEquals.equal             avgt   25  27.891 ± 0.606  ns/op
>> StringEquals.equalsUTF16       avgt   25  28.294 ± 0.913  ns/op
>> 
>> 
>> second run of Xor moved:
>> 
>> 
>> Benchmark                      Mode  Cnt   Score   Error  Units
>> StringEquals.almostEqual       avgt   25  28.687 ± 1.170  ns/op
>> StringEquals.almostEqualUTF16  avgt   25  28.909 ± 1.518  ns/op
>> StringEquals.different         avgt   25  19.400 ± 2.132  ns/op
>> StringEquals.differentCoders   avgt   25  13.582 ± 0.249  ns/op
>> StringEquals.equal             avgt   25  29.025 ± 1.139  ns/op
>> StringEquals.equalsUTF16       avgt   25  30.509 ± 2.931  ns/op
>> 
>> 
>> Third run of last two tests:
>> 
>> 
>> Benchmark                 Mode  Cnt   Score   Error  Units
>> StringEquals.equal        avgt   25  29.196 ± 1.380  ns/op
>> StringEquals.equalsUTF16  avgt   25  28.642 ± 1.286  ns/op
>> 
>> hard to say
>
> Thanks for trying this out. Another issue here is that 8-byte memory accesses at address a1/a2 would exceed the range for strings whose size is smaller than wordSize. I am not quite sure whether that is safe to do. Could we just incorporate changes which only resolves the unaligned access problem here?

On an fpga I can see these numbers with perfnorm profiler:

Just this PR:

Secondary result "org.openjdk.bench.java.lang.StringEquals.equal:IPC":
  1.245 ±(99.9%) 0.037 insns/clk [Average]
  (min, avg, max) = (1.234, 1.245, 1.258), stdev = 0.010
  CI (99.9%): [1.209, 1.282] (assumes normal distribution)

This PR + moving xor:

Secondary result "org.openjdk.bench.java.lang.StringEquals.equal:IPC":
  1.239 ±(99.9%) 0.050 insns/clk [Average]
  (min, avg, max) = (1.224, 1.239, 1.253), stdev = 0.013
  CI (99.9%): [1.190, 1.289] (assumes normal distribution)

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

PR Review Comment: https://git.openjdk.org/jdk/pull/13645#discussion_r1190785062


More information about the hotspot-dev mailing list