RFR: 8373026: C2 SuperWord and Vector API: vector algorithms test and benchmark

Emanuel Peter epeter at openjdk.org
Wed Dec 17 11:34:19 UTC 2025


This is an exploratory work. I wanted to use auto vectorization and the Vector API to implement some SIMD algorithms. We don't have too many IR tests and benchmarks, so I'm proposing an initial set of them, to be extended in the future.

Note: for now they are all `int` based. And some of them may not use the Vector API optimally, so feel free to propose ideas and integrate them in a follow-up RFE ;)

**Discussion**

Observations:
- If the loop can be auto vectorized, that is the fastest. If we cannot vectorize, we at least get reasonable scalar performance.
- If the Vector API code can be fully intrinsified, we get fast code. But somtimes, the Vector API is horribly slow, much slower than scalar loop performance.
  - `linux_aarch64_server`: `filterI`, `scanAddI`, `reduceAddIFieldsX4` are very slow
  - `macosx_aarch64`: `filterI`, `scanAddI`, `reduceAddIFieldsX4`, `findMinIndex` are very slow
  - `linux_x64_oci_server`: Vector API leads to really nice speedups
  - `windows_x64_oci_server`: the only one that gets good/better performance on all benchmarks
  - `macosx_x64_sandybridge`: `scanAddI`!, `reduceAddIFieldsX4` are very slow. Other benchmarks benefit.
- Compact Object Headers has some negative effect on some loop benchmarks.
  - `linux_aarch64_server`: `reduceAddI`, `copyI`
  - `macosx_aarch64`: `mapI`, `reduceAddI`, `copyI`
  - `linux_x64_oci_server`: `reduceAddI`, `copyI`, `findI`?
  - `windows_x64_oci_server`: `reduceAddI` and some others a little bit
  - `macosx_x64_sandybridge`: `fillI`, `iotaI`, `mapI`, `reduceAddI`, `copyI`
- Intrinsics can be much faster than auto vectoirzed or Vector API code.
  - `linux_aarch64_server`: `copyI`
  - `macosx_x64_sandybridge`: actually, `Arrays.fill` seems to suffer with Compact Object Headers as well.
- `rearrange` often needs to do the `mask load` and `and` operation inside the loop. That has a slight performance impact, I filed [JDK-8373240](https://bugs.openjdk.org/browse/JDK-8373240).

**Benchmark Plots**

Units: nanoseconds per algorithm invocation.

`linux_x64_oci`
<img width="4500" height="6000" alt="algo_linux_x64_oci_server" src="https://github.com/user-attachments/assets/f2c5bbcb-e009-4c54-a1bf-91af45326cb9" />

`windows_x64_oci`
<img width="4500" height="6000" alt="algo_windows_x64_oci_server" src="https://github.com/user-attachments/assets/8946d248-4d75-4b16-8f17-627a90dcb6c3" />

`macosx_x64_sandybridge`
<img width="4500" height="6000" alt="algo_macosx_x64_sandybridge" src="https://github.com/user-attachments/assets/c862664b-efaa-48f8-a8ea-7065905669f8" />

`linux_aarch64`
<img width="4500" height="6000" alt="algo_linux_aarch64_server" src="https://github.com/user-attachments/assets/776b6090-cb33-4291-b021-c6e0c7a4451a" />

`macosx_aarch64`
<img width="4500" height="6000" alt="algo_macosx_aarch64" src="https://github.com/user-attachments/assets/6c964719-2ec1-4972-a687-9bce42debbec" />

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

Commit messages:
 - Merge branch 'master' into JDK-8373026-vector-algorithms
 - another IR rule fix
 - more small fixes and comments
 - more IR rules
 - wip more IR rules
 - improve IR rules
 - gather benchmark
 - gather test
 - filterI
 - findI benchmark
 - ... and 19 more: https://git.openjdk.org/jdk/compare/78c2d572...40c51e8f

Changes: https://git.openjdk.org/jdk/pull/28639/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=28639&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8373026
  Stats: 1576 lines in 4 files changed: 1576 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/28639.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28639/head:pull/28639

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


More information about the hotspot-compiler-dev mailing list