RFR: 8373026: C2 SuperWord and Vector API: vector algorithms test and benchmark [v16]
Paul Sandoz
psandoz at openjdk.org
Wed Jan 28 23:12:12 UTC 2026
On Wed, 28 Jan 2026 10:51:44 GMT, Emanuel Peter <epeter at openjdk.org> wrote:
>> 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.
>>
>> Note: the `aarch64` machines all only have `NEON` support. Performance may be much better on `SVE`, I have not benchmarked that yet.
>>
>> `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...
>
> Emanuel Peter has updated the pull request incrementally with two additional commits since the last revision:
>
> - Jatins typo fix part 2
>
> Co-authored-by: Jatin Bhateja <jatinbha.cloud at gmail.com>
> - Jatins typo fix part 1
>
> Co-authored-by: Jatin Bhateja <jatinbha.cloud at gmail.com>
Very good, i just focused on the benchmark code. In addition to highlighting gaps in platforms it may also highlight gaps in machine code gen when performance is good to improve it further.
test/micro/org/openjdk/bench/vm/compiler/VectorAlgorithmsImpl.java line 534:
> 532: for (; i < SPECIES_I512.loopBound(a.length); i += SPECIES_I512.length()) {
> 533: IntVector v = IntVector.fromArray(SPECIES_I512, a, i);
> 534: v = v.add(v.rearrange(shf1), mask1);
These are lane shifting operations, so another variant can use `compress` with the masks as input. Another could use `slice`, ideally the rearrange and slice variants would generate comparable code, or the compress and slice would.
-------------
Marked as reviewed by psandoz (Reviewer).
PR Review: https://git.openjdk.org/jdk/pull/28639#pullrequestreview-3719592647
PR Review Comment: https://git.openjdk.org/jdk/pull/28639#discussion_r2738982413
More information about the hotspot-compiler-dev
mailing list