[llvm-dev] [RFC] Matrix support (take 2)

Adam Nemet via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 6 11:12:45 PST 2018



> On Dec 6, 2018, at 9:57 AM, John McCall <jmccall at apple.com> wrote:
> 
> 
> 
> On 6 Dec 2018, at 1:24, Adam Nemet wrote:
> 
>>> On Dec 5, 2018, at 8:46 PM, John McCall <jmccall at apple.com> wrote:
>>> 
>>> On 5 Dec 2018, at 13:41, Adam Nemet wrote:
>>>> -------------------------
>>>> Proper padding for small matrices
>>>> -------------------------
>>>> 
>>>> We want the individual rows/columns (for row/column-major) to be naturally aligned by no more than the max vector alignment.  E.g. for a 3 x 3 x float with column major order, we should have a single element padding after each column which is a total of 48 bytes.  For option A, since it’s a new type we can just define this in the new ABI.
>>>> 
>>>> For option B and C, on the other hand, vector alignment and padding is already mandated by the VectorType.  This is part of the ABI when people use vector_size or ext_vector_type attributes on the clang side.
>>>> 
>>>> Alignment and allocation size (including padding) is the original size of vector rounded up to the next power-of-2.  So for example a 3 x 3 x float pad(1) or 12 x float is rounded up to 64 bytes.  This is excessive.  I also need to support unpadded matrices that are effectively ABI-compatible with arrays.
>>>> 
>>>> Front-ends could lower to arrays instead of vectors and then cast them to vectors specifying the proper alignment.  This would complicate front-ends and the IR.  A more reasonable solution would be allow reducing the alignment and in turn the padding of the vector type itself.  We could have an align attribute on the type itself:
>>>> 
>>>> For example <12 x float align(16)> for naturally aligned columns or <9 x float align(1)> for the unpadded case.
>>>> 
>>>> In summary, option B and C can be made to work with some IR extensions.
>>> 
>>> In general, IR type alignment is all but meaningless.
>> 
>> Sure, that’s clear.  I may not have been precise above that I actually tried to lower the alignment in other ways but failed.
>> 
>>> A well-behaved frontend should be setting an explicit alignment on every declaration, definition, allocation, and access it generates (if it's ABI, at least), and it must always lower aggregate types in a way that understands that IR type alignment can arbitrarily differ from the actual alignment of the frontend's original type.
>> 
>> I wasn’t able to lower the alignment (and alloc size) for alloca through the align attribute.
> 
> Oh, I see, this is meant to avoid the rounding-up of the alloc size; somehow I missed that part of your post.  Yes, it makes sense that you need to be able to specify that.
> 
>> I assumed that it was meant to only allow increasing alignment.
> 
> Are you talking about the Clang attribute?  Yes, IIRC, that attribute is defined as not lowering alignment unless it's combined with packed.

No, I meant IR.  It obviously works on loads and stores to indicate an unaligned access but not on alloca.  It’s probably bug, I’ll look into it.

> 
>> I am also unclear how lowering the alignment should work for a vector data member of a structure type.  Would I have to make the structure packed and manually fill in the padding?  Is that desirable every time a flattened matrix is used inside a structure?
> 
> That's what Clang does when the IR type for a field is aligned such that it would end up at the wrong offset, yes.

OK, we can adopt that model for now.

Adam

> 
> John.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181206/af886d96/attachment.html>


More information about the llvm-dev mailing list