On Thu, 14 Jun 2018, Jakub Jelinek wrote: > Hi! > > #pragma omp atomic is now allowed inside of simd regions. > Tested on x86_64-linux, committed to gomp-5_0-branch. > > We will actually not vectorize it then though, so some further work will be > needed in the vectorizer to handle it. Either, if we have hw atomics for both > the size of the scalar accesses and size of the whole vector type, the > accesses are adjacent and known to be aligned, we could replace it with > atomic on the whole vector, or emit as a small loop or unrolled loop doing > the extraction, scalar atomics and if needed insert result back into > vectors. Richard, thoughts on that?
What's the semantic of this? Generally for non-vectorizable stmts we could implement partial vectorization by doing VF number of copies of the scalar stmt: tem10 = vinput1[0]; tem20 = vinput2[0]; ... soutput0 = OP (tem10, tem20,...); ... voutput = { soutput0, ... }; or alternatively specific for the OMP atomic handling, outline the atomic stmts to a OMP simd function? Anyway, still need to have an idea of the semantics of an atomic stmt inside a SIMD loop. Richard. > 2018-06-14 Jakub Jelinek <ja...@redhat.com> > > * omp-low.c (check_omp_nesting_restrictions): Allow OpenMP atomics > inside of simd regions. > > * c-c++-common/gomp/simd7.c: New test. > > --- gcc/omp-low.c.jj 2018-06-08 12:12:34.377111135 +0200 > +++ gcc/omp-low.c 2018-06-14 11:09:55.439824132 +0200 > @@ -2463,9 +2463,13 @@ check_omp_nesting_restrictions (gimple * > return true; > } > } > + else if (gimple_code (stmt) == GIMPLE_OMP_ATOMIC_LOAD > + || gimple_code (stmt) == GIMPLE_OMP_ATOMIC_STORE) > + return true; > error_at (gimple_location (stmt), > "OpenMP constructs other than %<#pragma omp ordered simd%>" > - " may not be nested inside %<simd%> region"); > + " or %<#pragma omp atomic%> may not be nested inside" > + " %<simd%> region"); > return false; > } > else if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS) > --- gcc/testsuite/c-c++-common/gomp/simd7.c.jj 2018-06-14 > 11:19:30.466274188 +0200 > +++ gcc/testsuite/c-c++-common/gomp/simd7.c 2018-06-14 10:55:52.520186067 > +0200 > @@ -0,0 +1,21 @@ > +int a[64]; > + > +#pragma omp declare simd linear(x) > +int > +bar (int x, int y) > +{ > + int v; > + #pragma omp atomic capture > + v = a[x] += y; > + return v; > +} > + > +void > +foo (void) > +{ > + int i; > + #pragma omp simd > + for (i = 0; i < 64; i++) > + #pragma omp atomic > + a[i] += 1; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)