Hello Dorit, Thank you for the list of references.
What I gathered from reading this is that alignment attributes applied to the base element of an array are causing problems for other legitimate uses of this attribute. It is basically stupid to specify the base type of an array be aligned because this implies that the array elements are scattered in memory. The only examples I can think of where you might want to do that is with multidimensional arrays where you want the start of each subarray to be aligned. That is better solved just by changing the length of the inner array to one that yields the desired alignment. However, specifying pointer alignment (whether this hint is passed through the type system or some other way) is an important piece of information that a programmer may wish to communicate to the optimizer. The obvious semantics for the hint are that the log2(alignment) least significant bits of the pointer value are clear. The size of the pointer base type would be unaffected so that pointer math can still yield unaligned access. I hope I have not oversimplified the issue at hand here. From the point of view of someone passively benefiting from the optimizer, this issue does not matter so much. However, someone who is performance tuning his code may care very much about getting this information through to the vectorizor and without some provision for a hint he is stuck either (1) without the optimization or (2) rewriting the code so that all aligned arrays are passed as pointer-to-struct with the array element in the struct specified with an alignment attribute. I have not tested method 2; it seems like a transformation which may work despite being unaesthetic. Regards, Michael James On 11/5/06, Dorit Nuzman <[EMAIL PROTECTED]> wrote:
Unfortunately there's no way to specify alignment attribute of pointers in GCC - the syntax was allowed in the past but not really supported correctly, and then entirely disallowed (by this patch http://gcc.gnu.org/ml/gcc-patches/2005-04/msg02284.html). This issue was discussed in details in these threads: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20794 http://gcc.gnu.org/ml/gcc/2005-03/msg00483.html (and recently came up again also in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27827#c56). The problem is that "We don't yet implement either attributes on array parameters applying to the array not the pointer, or attributes inside the [] of the array parameter applying to the pointer. (This is documented in "Attribute Syntax".)" (from the above thread). dorit > Hello, > > I have been playing with gcc's new (to me) auto vectorization > optimizations. I have a particular loop for which I have made external > provisions to ensure that the data is 16-byte aligned. I have tried > everything I can think of to give gcc the hint that it is operating on > aligned data, but still the vectorizer warns that it is operating on > unaligned data and generates the less efficient MOVLPS/MOVUPS instead > of MOVAPS. > > The code is like this: > > #define SSE __attribute__((aligned (16))) > > typedef float matrix_t[100][1024]; > > matrix_t aa SSE, bb SSE, cc SSE; > > void calc(float *a, float *b, float *c) { > int i, n = 1024; > > for (i=0; i<n; ++i) { > a[i] = b[i] / (b[i] + c[i]); > } > > } > > int main(void) { > int i, n = 100; > for (i=0; i<n; ++i) { > calc(a[i], b[i], c[i]); > } > } > > gcc rejects if I specify alignment attributes on the formal parameters > (obviously it was dumb to even try that), and there does not seem to > be a way to get the alignment hint to apply to the object referenced > by the pointer instead of the pointer itself. > > In my application it is important that the function doing the > computations remains abstracted away from the data definitions, as > there is over 1G of data dynamically arranged and the actual alignment > provisions are made with mmap(). > > Does anyone have a suggestion? > > Regards, > Michael James