On Fri, 26 Sep 2025 15:58:04 GMT, Jatin Bhateja <[email protected]> wrote:

>> The vector support prototype was last updated 5 months ago. 
>> makePrivateBuffer introduces significant complexity into core library code 
>> and JVM. Besides this complexity, the vector prototype also introduces 
>> "multifield", which is also uncertain.
>> 
>> I will reach out to Paul Sandoz and Jatin Bhateja to check on the status of 
>> this prototype - it hasn't been updated since the new lworld model, maybe 
>> our mainline hacks can continue to work after the vector classes are marked 
>> value.
>
> Hi @liach , 
> 
> Currently, Unsafe.put* APIs expect to operate on a mutable value, without 
> Unsafe.makePrivateBuffer, there is no way to transition a value object to 
> larval state.
> 
> <img width="800" height="400" alt="image" 
> src="https://github.com/user-attachments/assets/af826cda-55e1-4b0c-a2ea-62592f7623d6";
>  />
> 
> 
> Here is a typical update kernel for the nary operation fallback 
> implementation. 
> 
> <img width="500" height="200" alt="image" 
> src="https://github.com/user-attachments/assets/4a31baa7-52b8-4e0b-8c42-924407bb5665";
>  />
> 
> 
> 
> **Here are some relevant FAQs on the need for multifield annotation.**
> 
> Q. Why do we need @multifield annotated field in VectorPayloads and not just 
> retain the array-backed backing storage?
> A.  Even currently, Vector instances are immutable, with each modification or 
> application of an operation, a new vector is generated. 
>       Each new vector has a distinct backing storage in the form of an array; 
> thus, no two vector ever share their backing storage, which makes vectors an 
> immutable quantity. 
>       
>      Vector<Float>  newVector  =  Vec1.lanewise(VectorOperators.ADD, Vec2);
>      
> Since arrays are always allocated over the heap, they carry an identity, 
> which is the distinctive heap address for each new backing storage array.
> 
> This contradicts the philosophy of value type instances, which are 
> identity-free; the compiler treats two values with the same contents as 
> equivalent entities and is free to substitute one with another. 
> 
> By replacing existing array-backed storage with a @multifield annotated 
> storage, we ensure that payload adheres to true value semantics, a 
> @multifiled is seen as a bundle of fields, encapsulating payload is a value 
> class, unlike an array, a multifield is never allocated an explicit heap 
> storage. 
> 
> Here is an example code
> 
>  
> <img width="388" height="503" alt="image" 
> src="https://github.com/user-attachments/assets/8f6b5a07-a8e0-4912-b909-9d892f40d92a";
>  />
> 
> 
> Even though Payload is a value class, its two instances with the same backing 
> storage are not equal, because arrays have identity.
> By treating vectors as value objects, we expect that two vectors with the 
> same contents should be equal.
> 
> Q.  Is there any alternative to @multifield?
> A.  All we need to ensure is that the backing storage has no identity.  Thus, 
> we could have multiple primitive type fields in the payload, one for each 
> lane of the vector. 
> 
>  
> <img width="450" height="310" alt="image" 
> src="https://github.com/user-attachments/assets/af977c64-6373-4533-aceb-...

Hi @jatin-bhateja, as I know, the larval bit is completely unused in current 
Valhalla - I believe what we should do with that assert is to simply remove it. 
I am thinking of some internal API that accepts a Consumer that handles the 
"early larval" API via unsafe before returning it.

I thought the merge of lworld into vector would be trivial, but it turned out 
troublesome - can you push the merge as soon as it is ready? I am more than 
happy to help you migrate off makePrivateBuffer and this to-be-removed larval 
bit.

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

PR Comment: https://git.openjdk.org/valhalla/pull/1593#issuecomment-3340696212

Reply via email to