Yes. What you really want is to know that the address of element 0 is 16-byte aligned. So, what I assumed you were proposing is to always allocate the array storage as 16-byte aligned, then use 16 bytes for the size (and any other housekeeping you need). Then element 0 will be 16-bytes behind a 16-byte aligned address, so you're still good. That's the memory cost of this change--you'll burn (16 - (size of your size storage)) bytes at the beginning.
It's not an easy choice. But if this is limited to only those arrays over page-size, then I'm assuming there won't be 1000's of them, and the cost is down around a few hundred bytes at worst for the program. Jason ----- Original Message ---- > From: Steve Schveighoffer <[email protected]> > To: Discuss the phobos library for D <[email protected]> > Sent: Mon, June 28, 2010 12:29:17 PM > Subject: Re: [phobos] byte alignment for arrays > > This only affects arrays that are PAGE size or larger. A question then -- > let's say you have an array of doubles, which are 8 bytes wide, and you want > to > use these SSE instructions. Even if the first one is aligned on a 16-byte > boundary, wouldn't every other double be > misaligned? -Steve ----- Original Message ---- > > From: Jason Spencer < > href="mailto:[email protected]">[email protected]> > To: > Discuss the phobos library for D < > href="mailto:[email protected]">[email protected]> > Sent: > Mon, June 28, 2010 3:00:10 PM > Subject: Re: [phobos] byte alignment for > arrays > > I would recommend changing it to 16-byte aligned. > Lots of SSE instructions > won't work or won't work efficiently at 8-byte > aligned addresses. Even > without SSE, this makes array access more > cache-friendly, and is likely to > help. If we're only talking > about arrays larger than page-size, then it's > not too much memory > overhead. For less-than-page-sized arrays (or > performance-tight > code if you DON'T make the change), you'd have to use > something like > std.c.stdlib or std.<system> _aligned_alloc() to get around > > this. Might be worth verifying this is actually available and works (maybe > > a unit test?. ) Jason ----- Original Message > ---- > > From: Steve Schveighoffer < > href="mailto: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]> > To: Phobos > > < > href="mailto: > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]> > Sent: > > Mon, June 28, 2010 11:36:25 AM > Subject: [phobos] byte alignment > for > arrays > > Recently, this bug has surfaced: > > > http://d.puremagic.com/issues/show_bug.cgi?id=4400 In a > nutshell, > > sometimes the byte alignment of arrays is 8 bytes > instead 16 > bytes. This > was caused by my array append > patch, because in > large arrays, I store the length > at the > front of the array. With > some queries before I created my patch, > I > was told that 8 byte > alignment was fine. However, the > alignment is easy to > change > since it's a couple specific > functions that determine the padding and > > alignment. So > changing to 16 bytes is not an issue technically, and > > > functionally, this is only on PAGE sized arrays and larger, so 16 bytes > > vs. 8 > bytes isn't likely to cause problems. Bearophile's main > > argument stems > from this. I am not a processor or > assembly > expert, so I have no idea > about this at > > all: ----------------- The 16 bytes alignment was > introduced > > because instructions like the SSE2 movapd need 16 byte > > > alignment: http://en.wikipedia.org/wiki/MOVAPD I have > recently used > > it > > > here: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=112670 > > > And some other SSE* instructions work with 8 byte alignment too, > but they > > are slower (future CPUs can remove such alignment > requirements, some > of it > has being removed already, so in > that future the GC can go > back giving 8 > bytes aligned > memory). ----------------- So > should I change > > it? -Steve > > > _______________________________________________ phobos mailing > > list > ymailto="mailto: > href="mailto: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]" > > > href="mailto: > href="mailto: > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]"> > > ymailto="mailto: > href="mailto:[email protected]">[email protected]" > > href="mailto: > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] http://lists.puremagic.com/mailman/listinfo/phobos _______________________________________________ phobos > > mailing list > href="mailto: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]"> > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] > href=" > href="http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank > >http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank > > > > >http://lists.puremagic.com/mailman/listinfo/phobos > _______________________________________________ phobos mailing > list > href="mailto:[email protected]">[email protected] > href="http://lists.puremagic.com/mailman/listinfo/phobos" target=_blank > >http://lists.puremagic.com/mailman/listinfo/phobos _______________________________________________ phobos mailing list [email protected] http://lists.puremagic.com/mailman/listinfo/phobos
