bearophile wrote:
Don:
(1) They don't take advantage of fixed-length arrays. In particular, operations on float[4] should be a single SSE instruction (no function call, no loop, nothing). This will make a huge difference to game and graphics programmers, I believe.
[...]
It's issue (1) which is the killer.

In my answer I have forgotten to say another small thing.

The std.gc.malloc() of D returns pointers aligned to 16 bytes (but I may like 
to add a second argument to such GC malloc, to specify the alignment, this can 
be used to save some memory when the alignment isn't necessary), while I think 
the std.c.stdlib.malloc() doesn't give pointers aligned to 16 bytes.

In the following code if you want to implement the last line with one vector 
instruction then a and b arrays have to be aligned to 16 bytes. I think that 
currently LDC doesn't align a and b to 16 bytes.

float[4] a = [1.f, 2., 3., 4.];
float[4] b[] = 10f;
float[4] c[] = a[] + b[];

So you may need a syntax like the following, that's not handy:

align(16) float[4] a = [1.f, 2., 3., 4.];
align(16) float[4] b[] = 10f;
align(16) float[4] c[] = a[] + b[];

A possible solution is to automatically align to 16 (by default, but it can be 
changed to save stack space in specific situations) all static arrays allocated 
on the stack too :-)
A note: in future probably CPU vector instructions will relax their alignment 
requirements... it's already happening.

Bye,
bearophile

That 16bytes alignment is a restriction of the current usage of bit fields. Since every bit in the field indexes a single 16bytes block, a simple shift 4 bits to the right translate a pointer into its index in the bit field. You could align on 4 bytes boundaries but at the cost of doubling the size of bit fields, and possibly having slower collection runs.

Doesn't SSE have aligned and unaligned versions of its move instructions? like MOVAPS and MOVUPS.

Reply via email to