RFR: 8342095: Add autovectorizer support for subword vector casts
Jasmine Karthikeyan
jkarthikeyan at openjdk.org
Tue Feb 4 19:43:32 UTC 2025
On Tue, 4 Feb 2025 18:27:03 GMT, Emanuel Peter <epeter at openjdk.org> wrote:
>> Hi all,
>> This patch adds initial support for the autovectorizer to generate conversions between subword types. Currently, when superword sees two packs that have different basic types, it discards them and bails out of vectorization. This patch changes the behavior to ask the backend if a cast between the conflicting types is supported, and keeps the pack if it is. Later, when the `VTransform` graph is built, a synthetic cast is emitted when packs requiring casts are detected. Currently, only narrowing casts are supported as I wanted to re-use existing `VectorCastX2Y` logic for the initial version, but adding more conversions is simple and can be done with a subsequent RFE. I have attached a JMH benchmark and got these results on my Zen 3 machine:
>>
>>
>> Baseline Patch
>> Benchmark (SIZE) Mode Cnt Score Error Units Score Error Units Improvement
>> VectorSubword.intToByte 1024 avgt 12 200.049 ± 19.787 ns/op 56.228 ± 3.535 ns/op (3.56x)
>> VectorSubword.intToShort 1024 avgt 12 179.826 ± 1.539 ns/op 43.332 ± 1.166 ns/op (4.15x)
>> VectorSubword.shortToByte 1024 avgt 12 245.580 ± 6.150 ns/op 29.757 ± 1.055 ns/op (8.25x)
>>
>>
>> I've also added some IR tests and they pass on my linux x64 machine. Thoughts and reviews would be appreciated!
>
> test/hotspot/jtreg/compiler/loopopts/superword/TestSubwordVectorization.java line 101:
>
>> 99: @IR(applyIfCPUFeature = { "avx", "true" },
>> 100: applyIfOr = {"AlignVector", "false", "UseCompactObjectHeaders", "false"},
>> 101: counts = { IRNode.VECTOR_CAST_I2B, IRNode.VECTOR_SIZE_ANY, ">0" })
>
> Hmm. It would be great if we could assert the length of the vector. Otherwise we may get less than we could.
>
> Something like this may work:
> `IRNode.VECTOR_SIZE + "min(max_int, max_byte)"`
>
> Have you tried that yet?
I think I wrote this test before realizing you can do size checks like in `ArrayTypeConvertTest.java`, I'll make sure to change it to the same system there.
> test/micro/org/openjdk/bench/vm/compiler/VectorSubword.java line 73:
>
>> 71: }
>> 72: }
>> 73: }
>
> Ah, these are all casting to smaller types. What about casting to larger types?
Originally I thought that larger type conversions were only available on AVX-512 based on the ad-file, but reading it more carefully now I see that they are indeed supported for AVX! I'll go ahead and generalize the changes further to make casting to larger types supported as well. I think this leaves `char` as the only type not supported, which I can look at in a follow-up RFE.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/23413#discussion_r1941790606
PR Review Comment: https://git.openjdk.org/jdk/pull/23413#discussion_r1941790789
More information about the hotspot-compiler-dev
mailing list