alignment on stack-allocated arrays/structs
Don
nospam at nospam.com
Wed Nov 18 11:26:45 PST 2009
Trass3r wrote:
> Don schrieb:
>> Well, sort of.
>> It's impossible to align stack-allocated structs with any alignment
>> greater than the alignment of the stack itself (which is 4 bytes).
>> Anything larger than that and you HAVE to use the heap or alloca().
>>
>
> So how do other compilers supporting that alignment syntax do it?
It might only be required on particular CPUs/OSes. Eg requirements for
Sparc are quite different.
Some of them might be doing alloca() under the covers.
>> Nothing on x86 benefits from more than 16 byte alignment, AFAIK, and
>> it's never mandatory to use more than 8 byte alignment. I don't know
>> so much about the recent GPUs, though -- do they really require 16
>> byte alignment or more?
>>
>
> I'm not sure how exactly this works and why they require alignment.
> Couldn't find anything about that in the clEnqueueWriteBuffer
> description where data gets written into GPU memory.
>
>
> The specification for the OpenCL C language itself only states:
>
> A data item declared to be a data type in memory is always aligned to
> the size of the data type in bytes. For example, a float4 variable will
> be aligned to a 16-byte boundary, a char2 variable will be aligned to a
> 2-byte boundary.
>
> A built-in data type that is not a power of two bytes in size must be
> aligned to the next larger power of two. This rule applies to built-in
> types only, not structs or unions.
>
>
>
> They also strangely state:
>
> The components of vector data types with 1 ... 4 components can be
> addressed as <vector_data_type>.xyzw.
>
> float4 c, a, b;
>
> c.xyzw = (float4)(1.0f, 2.0f, 3.0f, 4.0f);
> c.z = 1.0f; // is a float
> c.xy = (float2)(3.0f, 4.0f); // is a float2
>
>
>
> So I wonder why they used arrays in the headers and not structs to be
> consistent with this.
More information about the Digitalmars-d
mailing list