This is the mail archive of the
mailing list for the GCC project.
Re: [gomp4] Some progress on #pragma omp simd
- From: Aldy Hernandez <aldyh at redhat dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Richard Henderson <rth at redhat dot com>, gcc-patches at gcc dot gnu dot org, "Iyer, Balaji V" <balaji dot v dot iyer at intel dot com>
- Date: Tue, 23 Apr 2013 16:02:40 -0500
- Subject: Re: [gomp4] Some progress on #pragma omp simd
- References: <20130419132957 dot GE12880 at tucnak dot redhat dot com> <5175B40F dot 7040709 at redhat dot com> <20130423135455 dot GN12880 at tucnak dot redhat dot com>
[Balaji, see below]
On 04/23/13 08:54, Jakub Jelinek wrote:
On Mon, Apr 22, 2013 at 05:05:03PM -0500, Aldy Hernandez wrote:
On 04/19/13 08:29, Jakub Jelinek wrote:
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).
Are you sure it's just a hint? (My legalese is very bad). The spec
says "If the vectorlength clause is used, the VL is selected from among
the values of its arguments."
I guess it's not clear what happens if the compiler can't use the
vectorlength argument. Balaji, would this be a hard error? Is this
merely a hint as Jakub says?
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?).
Actually, if it's all the same to you, I would prefer the latter. It
seems the easier approach is to have Cilk use OMP_SIMD, and set a
safelen of 0 or something at parse time. Would this be ok, or would you
prefer a separate CILK_SIMD tree which gets expanded into OMP_FOR with a
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.
int i, j, k;
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...
You obviously didn't look at the plethora of testcases I included with
my patch :). There are quite a few restrictions, thus the need in my
patch to provide a separate parser for the for loop (not totally unlike
what is done for gomp). See c_check_cilk_loop(), but basically...
1. Initialization is required and can only include one variable.
Variable cannot be volatile, extern, global, register (have any storage
2. Condition is required and can only be of the form:
DECL <comparison_op> EXPR
EXPR <comparison_op> DECL
Where comparison_op is one of !=, <, <=, >, >=. (== is not allowed).
3. Increment is a simple expression on the induction variable. It is
required, and can only be one of:
++var, var++, --var, var--, var += incr, var -= incr.
Where incr is a conditional-expression with integral (or enum) type.
Can you take a peek at the patch? Are we in agreement wrt the general
approach here-- lest I go too far down the wrong rabbit hole?