RFR: 8303401: Add a Vector API equalsIgnoreCase micro benchmark

Sandhya Viswanathan sviswanathan at openjdk.org
Tue Feb 28 22:23:05 UTC 2023


On Tue, 28 Feb 2023 15:59:26 GMT, Eirik Bjorsnos <duke at openjdk.org> wrote:

> This PR suggests we add a vectorized equalsIgnoreCase benchmark to the set of benchmarks in `org.openjdk.bench.jdk.incubator.vector`. This benchmark serves as an example of how vectorization can be useful also in the area of text processing. It takes advantage of the fact that ASCII and Latin-1 were designed to optimize case-twiddling operations.
> 
> The code came about during the work on #12632, where vectorization was deemed out of scope.
> 
> Benchmark results:
> 
> 
> Benchmark                             (size)  Mode  Cnt     Score   Error  Units
> EqualsIgnoreCaseBenchmark.scalar          16  avgt   15    20.671 ± 0.718  ns/op
> EqualsIgnoreCaseBenchmark.scalar          32  avgt   15    46.155 ± 3.258  ns/op
> EqualsIgnoreCaseBenchmark.scalar          64  avgt   15    68.248 ± 1.767  ns/op
> EqualsIgnoreCaseBenchmark.scalar         128  avgt   15   148.948 ± 0.890  ns/op
> EqualsIgnoreCaseBenchmark.scalar        1024  avgt   15  1090.708 ± 7.540  ns/op
> EqualsIgnoreCaseBenchmark.vectorized      16  avgt   15    21.872 ± 0.232  ns/op
> EqualsIgnoreCaseBenchmark.vectorized      32  avgt   15    11.378 ± 0.097  ns/op
> EqualsIgnoreCaseBenchmark.vectorized      64  avgt   15    13.703 ± 0.135  ns/op
> EqualsIgnoreCaseBenchmark.vectorized     128  avgt   15    21.632 ± 0.735  ns/op
> EqualsIgnoreCaseBenchmark.vectorized    1024  avgt   15   105.509 ± 7.493  ns/op

Thanks a lot for this micro benchmark.

test/micro/org/openjdk/bench/jdk/incubator/vector/EqualsIgnoreCaseBenchmark.java line 85:

> 83: 
> 84:             // ASCII and Latin-1 were designed to optimize case-twiddling operations
> 85:             ByteVector lowerA = va.or((byte) 0x20);

Just curious, here you use lower whereas in scalar code upper is being used. Any reasons?

test/micro/org/openjdk/bench/jdk/incubator/vector/EqualsIgnoreCaseBenchmark.java line 88:

> 86: 
> 87:             // Determine which bytes represent ASCII or Latin-1 letters:
> 88:             VectorMask<Byte> asciiLetter = lowerA.lt((byte) '{').and(lowerA.lt((byte) 0x60).not());

We do have GT/GE/NE etc comparison operators supported in Vector API, which you can use here and other places in this benchmark. e.g.
You could do lowerA.compare(GE, (byte)0x60) instead of using lt() followed not(). BTW did you mean to use GT here?

You will need to do the following import:
import static  jdk.incubator.vector.VectorOperators.*;

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

PR: https://git.openjdk.org/jdk/pull/12790


More information about the core-libs-dev mailing list