diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2017-05-12 11:18:34 +0200 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gcc.gnu.org> | 2017-05-12 11:18:34 +0200 |
commit | b0f271ce56b3a1d3e36c6a24228593f9b8851f8e (patch) | |
tree | e7a1167a4d49115dbd14d780819cc4f8823153e4 /gcc/omp-offload.c | |
parent | 25651634436238d505c586fd308cdd5b6c5db8f9 (diff) | |
download | gcc-b0f271ce56b3a1d3e36c6a24228593f9b8851f8e.zip gcc-b0f271ce56b3a1d3e36c6a24228593f9b8851f8e.tar.gz gcc-b0f271ce56b3a1d3e36c6a24228593f9b8851f8e.tar.bz2 |
[PR middle-end/69921] Use "oacc kernels parallelized" attribute for parallelized OpenACC kernels
gcc/
PR middle-end/69921
* tree-parloops.c (create_parallel_loop): Set "oacc kernels
parallelized" attribute for parallelized OpenACC kernels.
* omp-offload.c (execute_oacc_device_lower): Use it.
gcc/testsuite/
* c-c++-common/goacc/classify-kernels-unparallelized.c: Adjust.
* c-c++-common/goacc/classify-kernels.c: Likewise.
* c-c++-common/goacc/kernels-counter-vars-function-scope.c:
Likewise.
* c-c++-common/goacc/kernels-double-reduction-n.c: Likewise.
* c-c++-common/goacc/kernels-double-reduction.c: Likewise.
* c-c++-common/goacc/kernels-loop-2.c: Likewise.
* c-c++-common/goacc/kernels-loop-3.c: Likewise.
* c-c++-common/goacc/kernels-loop-g.c: Likewise.
* c-c++-common/goacc/kernels-loop-mod-not-zero.c: Likewise.
* c-c++-common/goacc/kernels-loop-n.c: Likewise.
* c-c++-common/goacc/kernels-loop-nest.c: Likewise.
* c-c++-common/goacc/kernels-loop.c: Likewise.
* c-c++-common/goacc/kernels-one-counter-var.c: Likewise.
* c-c++-common/goacc/kernels-reduction.c: Likewise.
* gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise.
* gfortran.dg/goacc/classify-kernels.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-2.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-data-2.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-data-enter-exit-2.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-data-enter-exit.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-data-update.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-data.f95: Likewise.
* gfortran.dg/goacc/kernels-loop-n.f95: Likewise.
* gfortran.dg/goacc/kernels-loop.f95: Likewise.
From-SVN: r247957
Diffstat (limited to 'gcc/omp-offload.c')
-rw-r--r-- | gcc/omp-offload.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c index d24f131..9372f9e 100644 --- a/gcc/omp-offload.c +++ b/gcc/omp-offload.c @@ -1444,6 +1444,13 @@ execute_oacc_device_lower () flag_openacc_dims = (char *)&flag_openacc_dims; } + bool is_oacc_kernels + = (lookup_attribute ("oacc kernels", + DECL_ATTRIBUTES (current_function_decl)) != NULL); + bool is_oacc_kernels_parallelized + = (lookup_attribute ("oacc kernels parallelized", + DECL_ATTRIBUTES (current_function_decl)) != NULL); + /* Discover, partition and process the loops. */ oacc_loop *loops = oacc_loop_discovery (); int fn_level = oacc_fn_attrib_level (attrs); @@ -1453,17 +1460,26 @@ execute_oacc_device_lower () if (fn_level >= 0) fprintf (dump_file, "Function is OpenACC routine level %d\n", fn_level); - else if (lookup_attribute ("oacc kernels", - DECL_ATTRIBUTES (current_function_decl))) - fprintf (dump_file, "Function is OpenACC kernels offload\n"); + else if (is_oacc_kernels) + fprintf (dump_file, "Function is %s OpenACC kernels offload\n", + (is_oacc_kernels_parallelized + ? "parallelized" : "unparallelized")); else fprintf (dump_file, "Function is OpenACC parallel offload\n"); } unsigned outer_mask = fn_level >= 0 ? GOMP_DIM_MASK (fn_level) - 1 : 0; unsigned used_mask = oacc_loop_partition (loops, outer_mask); - int dims[GOMP_DIM_MAX]; + /* OpenACC kernels constructs are special: they currently don't use the + generic oacc_loop infrastructure and attribute/dimension processing. */ + if (is_oacc_kernels && is_oacc_kernels_parallelized) + { + /* Parallelized OpenACC kernels constructs use gang parallelism. See + also tree-parloops.c:create_parallel_loop. */ + used_mask |= GOMP_DIM_MASK (GOMP_DIM_GANG); + } + int dims[GOMP_DIM_MAX]; oacc_validate_dims (current_function_decl, attrs, dims, fn_level, used_mask); if (dump_file) |