[vector] rearrange with implicit wrapping

Viswanathan, Sandhya sandhya.viswanathan at intel.com
Tue Apr 20 18:02:06 UTC 2021


Doing an "and" as part of rearrange intrinsic should be doable and most efficient, I think. I will experiment and get back to you by tomorrow.

Best Regards,
Sandhya


-----Original Message-----
From: Paul Sandoz <paul.sandoz at oracle.com> 
Sent: Tuesday, April 20, 2021 10:57 AM
To: Viswanathan, Sandhya <sandhya.viswanathan at intel.com>
Cc: panama-dev at openjdk.java.net' <panama-dev at openjdk.java.net>
Subject: Re: [vector] rearrange with implicit wrapping 

Thinking some more about this, I wonder if taking this API approach is a little premature:

- we require conversion from shuffle to a vector for checking or wrapping, which clearly has some cost.

- I don’t think we have fully explored optimizing Shuffle and binding to its internal representation in HS, is that so?

WDYT?

Paul.

> On Apr 19, 2021, at 6:33 PM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
> 
> 
> 
>> On Apr 19, 2021, at 5:38 PM, Viswanathan, Sandhya <sandhya.viswanathan at intel.com> wrote:
>> 
>> Hi Paul,
>> 
>> I think we will need to do an explicit wrap (vector AND) either in Java or in the intrinsic.
>> Doing it in Java in an optimized fashion could be tricky as we only have shuffle -> vector and not vice versa vector -> shuffle method (see wrapIndexes in AbstractShuffle.java).
>> Does this ask for a package private vector->shuffle method, if not public?
>> 
> 
> There is a Vector.toShuffle method, not currently optimized.
> 
> You do mean doing something like shuffle -> vector -> AND with species length - 1 -> shuffle -> input to rearrange? 
> We could just passed in the result of Shuffle.wrapIndexes to rearrange? And optimize that method e.g. push down to the specializations or make an intrinsic?
> 
> 
>> The underlying instructions (.e.g pshufb) uses the bit 8 (MSB) of the shuffle as a special case. 
> 
> Ah!
> 
>> When the MSB is set, the corresponding element is cleared and that is what you are observing.
>> Let me know if you need me to handle it in the intrinsic.
>> 
> 
> I think it may be worth exploring an intrinsic solution to help make the best decision. I am concerned rearrange is fragile with regards to the input shuffle.
> 
> Paul.
> 
>> Best Regards,
>> Sandhya
>> 
>> 
>> 
>> -----Original Message-----
>> From: Paul Sandoz <paul.sandoz at oracle.com> 
>> Sent: Monday, April 19, 2021 4:56 PM
>> To: panama-dev at openjdk.java.net' <panama-dev at openjdk.java.net>
>> Cc: Viswanathan, Sandhya <sandhya.viswanathan at intel.com>
>> Subject: [vector] rearrange with implicit wrapping 
>> 
>> Hi,
>> 
>> I have started work on support rearrange with implicit wrapping, where the rearrange methods accepting a boolean parameter, which if true implicitly wraps the given shuffle:
>> 
>> https://urldefense.com/v3/__https://github.com/openjdk/panama-vector/compare/vectorIntrinsics...PaulSandoz:rearrange-wrap__;!!GqivPVa7Brio!Phx_uvFOKPbYKCBsgyNbCJdiVydvIKHnAHYZ_SEJmNY0vubu_agP80yn_4OTHjeLmQ$ 
>> 
>> This currently results in some test failures on x64 when it hits the intrinsics. I think there is some zeroing going in some cases.
>> 
>> Sandhya, I am unsure how the intrinsics behave, if they are all consistent, how they interrelate with shuffle, and how the Java implementation deviates.
>> 
>> The Java implementation was updated to consistently wrap: 
>> 
>> @ForceInline
>> final
>> <S extends VectorShuffle<Integer>>
>> IntVector rearrangeTemplate(Class<S> shuffletype, S shuffle, boolean wrap) {
>>   if (!wrap) {
>>       shuffle.checkIndexes();
>>   }
>>   return VectorSupport.rearrangeOp(
>>       getClass(), shuffletype, int.class, length(),
>>       this, shuffle,
>>       (v1, s_) -> v1.uOp((i, a) -> {
>>           int ei = s_.laneSource(i);
>>           return v1.lane(s_.wrapIndex(ei));
>>       }));
>> }
>> 
>> AFAICT rearrange is depending on the checks performed on the shuffle, otherwise the rearrange intrinsic fails to unbox it.
>> 
>> Paul.
> 



More information about the panama-dev mailing list