> -----Original Message-----
> From: Jakub Jelinek [mailto:ja...@redhat.com]
> Sent: Tuesday, April 23, 2013 9:55 AM
> To: Aldy Hernandez
> Cc: Richard Henderson; gcc-patches@gcc.gnu.org; Iyer, Balaji V
> Subject: Re: [gomp4] Some progress on #pragma omp simd
> 
> On Mon, Apr 22, 2013 at 05:05:03PM -0500, Aldy Hernandez wrote:
> > On 04/19/13 08:29, Jakub Jelinek wrote:
> > >I've committed the following patch to gomp4 branch.
> > >#pragma omp simd loops now are handled with all its clauses from
> > >parsing up to and including omp expansion, so should actually run
> > >correctly, though haven't added any runtime testcases yet.
> >
> > I like it.  Thanks for working on this.
> >
> > I've been working on rewriting the <#pragma simd> support on the
> > cilkplus branch to use a similar approach to what you do for openmp,
> > especially since both constructs seem to behave similarly, with the
> > exception of the "vectorlength" clause in Cilk Plus.  Attached is a
> > patch against yours, doing so.
> >
> > The idea is that <#prama omp simd> and <#pragma simd> are pretty much
> > the same thing, so we can probably get away with outputting the same
> > OMP_SIMD tree code and letting omp do it's thing.
> 
> I don't think you can use OMP_SIMD resp. GF_OMP_FOR_KIND_SIMD for
> #pragma simd, given that it has different semantics wrt. aliasing.
> 
> Like:
> void
> foo (int *p, int *q)
> {
>   int i;
>   #pragma omp simd
>   for (i = 0; i < 1024; i++)
>     p[i] = q[i] + 1;
> }
> vs.
> void
> bar (int *p, int *q)
> {
>   int i;
>   #pragma simd
>   for (i = 0; i < 1024; i++)
>     p[i] = q[i] + 1;
> }
> 
> It is a user error if one calls foo say with int arr[1028]; ... foo (arr + 4, 
> arr);
> because through #pragma omp simd without safelen the programmer has
> asserted that all iterations can be executed in the same simd chunk (think 
> about
> 4096 bytes long vectors in this case).  So, #pragma omp simd expansion should
> be able to tell the vectorizer that it can ignore all inter-iteration 
> dependencies
> during analysis.
> 
> If I understood right, vectorlength isn't anything close to it, it is just a 
> hint, if you
> vectorize, prefer this vector length, but the compiler is still responsible 
> for doing
> the analysis, and punting if it can't prove there is no aliasing (or go for 
> runtime
> checks).

Hi Jakub,
        My apologies if the documentation did not explain this correctly. It 
was written by compiler developers and not language developers. #pragma simd is 
the guarantee the user gives the compiler that the inter-iteration dependencies 
do not matter. So, if the user omits the vectorlength the clause then the 
compiler can, in effect, choose N, where N is the number of loop iterations. 

Thanks,

Balaji V. Iyer.


> 
> There is #pragma ivdep in ICC, but it's definition is vague - the compiler is 
> still
> supposed to do analysis, but if some dependency isn't certain, it can assume 
> it
> doesn't happen (which is the fuzzy thing about it, if the compiler can prove 
> there
> is some dependency, then the code is valid and vectorization can't be done).
> 
> So, IMHO you want CILK_SIMD tree (but it can use OMP and CILK clauses etc.),
> and GF_OMP_FOR_KIND_CILK_SIMD or so, and perhaps it can be expanded etc.
> exactly the same as #pragma omp simd, except for not telling the loop
> optimizers that it should imply safelen(+infinity).  Or another option is let 
> the
> C/C++ FEs, when seeing #pragma omp simd without safelen clause just add one
> with some very large value (unsigned TYPE_MAX_VALUE of a type with precision
> > precision of the loop iterator?).
> 
> BTW, what restrictions has Cilk+ on the for stmt after the pragma?
> OpenMP has lots of restrictions, it doesn't allow arbitrary for stmt there.
> 
> Like is
> int i, j, k;
> #pragma simd
> for (i = 0, j = 4, k = 5; i < 10 && j < 12; i++, j += 2, k += 3)
>   ...
> valid Cilk+?  It isn't valid with #pragma omp simd...
> 
>       Jakub

Reply via email to