In fact the x86_64 ABI definition requires that unsigned longs are 8 byte aligned:
http://www.x86-64.org/documentation/abi-0.99.pdf (page 12). This is why gcc can make this assumption. Of course different vendors implement the ABI differently, and usually drop the requirement. Bill. 2009/12/10 Bill Hart <goodwillh...@googlemail.com>: > In fact it seems there is plenty of documentary evidence on the web > that GMP also expects 8 byte aligned memory locations for 8 byte limb > arrays. > > Apparently some of the gcc optimisations also expect this (an array of > unsigned longs on a 64 bit machine is assumed to have 8 byte aligned > addresses - unless it is an array of length 1 which is sometimes > handled differently), and as the fundamental unit of currency in trade > for GMP and MPIR is the mp_limb_t * then you can't even guarantee that > the generic C build will work with non-aligned addresses! > > We will document this. > > Section 13 of the documentation also needs to be removed before the release. > > Bill. > > 2009/12/10 Bill Hart <goodwillh...@googlemail.com>: >> Yeah, I see why the test code passes. >> >> Here is how it does alignment. Basically it sets the pointer to the >> source region as follows: >> >> s[i].p = s[i].region.ptr + s[i].align; >> >> Here the s[i].align is supposed to take care of the alignment. Of >> course the type of s[i].p can be determined from the definition of the >> struct: >> >> struct source_t { >> struct region_t region; >> int high; >> mp_size_t align; >> mp_ptr p; >> }; >> >> i.e. it is an mp_ptr, i.e. an mp_limb_t *. >> >> In other words, align tests alignment to different limbs in memory! In >> this case, alignment can have one of 4 values, 0, 1, 2, 3. But SSE is >> only 128 bits, i.e. two limbs, so I just don't get this at all. Yes it >> tests for non-limb aligned stuff which might break SSE code. But it >> doesn't test for different byte alignments, as I had originally >> thought. >> >> On the other hand, destination pointers do test different byte >> alignments, provided that tr->dst_bytes[i] is nonzero for destination >> i. However, this is only set for the get_str function (as one would >> imagine it should be). >> >> Thus the very clear intent of the test code is that for n byte limbs, >> only n byte aligned data is allowed. Thus the conclusion is clear. >> There is no intention to support any other kind of alignment and so >> the documentation must be changed. >> >> I am surprised that I did not know this before now, however it makes >> full sense, as there is no point having a high performance math >> library if the custom memory allocator can basically ruin the >> performance. But Dan is right that the documentation most definitely >> should mention this. >> >> Bill. >> >> 2009/12/10 Bill Hart <goodwillh...@googlemail.com>: >>> But then why test for non-aligned limbs? >>> >>> Currently try test for all possible byte alignments! Or at least it is >>> supposed to. I'm still not sure I see what is going wrong with try. To >>> me this is still a puzzle. >>> >>> I didn't actually look at the assembler yet. I am quite sure it *is* >>> broken, for some suitable definition of broken. But the real question >>> is how can that be? This code passes the tests and most certainly >>> should not! >>> >>> Bill. >>> >>> 2009/12/10 Cactus <rieman...@googlemail.com>: >>>> >>>> >>>> On Dec 10, 3:56 pm, Dan Grayson <d...@math.uiuc.edu> wrote: >>>>> He could also mean that the machine instructions that move 8 byte >>>>> words to vector registers would segfault if you tried to use them on >>>>> nonaligned data, and that he tried to write mpn_lshift to try to avoid >>>>> doing that. Those are the lines of code I pointed to in the original >>>>> report. It would be a bug to write code that depended on alignment, >>>>> as I pointed out, unless you change the documentation about custom >>>>> memory allocators, which should not be done lightly. >>>>> >>>>> On Dec 10, 9:43 am, Bill Hart <goodwillh...@googlemail.com> wrote: >>>>> >>>>> >>>>> >>>>> > I found the following in correspondence with Jason (I can't just ask >>>>> > him, as his internet seems to be offline at the moment): >>>>> >>>>> > "Misaligned data will segfault on some arches and instructions eg K10 >>>>> > and lshift" >>>>> >>>>> > So presumably he has assumed data is aligned on K10, written a fast >>>>> > version of the code for this case, then propagated it to other arches >>>>> > where no segfault will occur. Actually, I am unsure whether that is >>>>> > what he means, but that is what I infer. >>>>> >>>>> > If so, the solution would seem to be to replace the Core2 and Atom >>>>> > code with a safer version and leave the K10 code as is. That's really >>>>> > something Jason should do though, so we probably have to wait for him >>>>> > to pop up again.- Hide quoted text - >>>>> >>>>> - Show quoted text - >>>> >>>> Looking at the code, it seems to me that it has been designed for >>>> doing 16 byte operations that are at least 8 byte aligned. This is >>>> what I would expect in 64-bit assembler code, which an reasonably be >>>> designed to rely on 8-byte alignment. >>>> >>>> Moreover, Jason's code does appear to account for any additional 8- >>>> byte segments are needed at the start or the end of a sequence of 16- >>>> byte aligned operations. >>>> >>>> So it looks to me like a code bug rather than a documentation bug. >>>> >>>> But the Custom Allocation section of tthe manual says nothing at all >>>> about alignment. It doesn't even require that limb allocations are >>>> properly aligned on the target machine - i.e. 4 byte alignment in 32- >>>> bit MPIR and 8 byte alignment in 64-bit MPIR! >>>> >>>> I suspect a lot of the assembler code won't deal well (if at all) with >>>> mis-aligned limbs so we should surely say something about this in the >>>> documentation of Custom Allocation. In my view we should indicate >>>> that use of assembler code is suspect if memory allocation does not >>>> ensure correct limb alignment - i.e. n byte limbs should be at least n >>>> byte aligned. >>>> >>>> Brian >>>> >>>> -- >>>> >>>> You received this message because you are subscribed to the Google Groups >>>> "mpir-devel" group. >>>> To post to this group, send email to mpir-de...@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> mpir-devel+unsubscr...@googlegroups.com. >>>> For more options, visit this group at >>>> http://groups.google.com/group/mpir-devel?hl=en. >>>> >>>> >>>> >>> >> > -- You received this message because you are subscribed to the Google Groups "mpir-devel" group. To post to this group, send email to mpir-de...@googlegroups.com. To unsubscribe from this group, send email to mpir-devel+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/mpir-devel?hl=en.