aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-offload.c
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2017-05-12 11:18:34 +0200
committerThomas Schwinge <tschwinge@gcc.gnu.org>2017-05-12 11:18:34 +0200
commitb0f271ce56b3a1d3e36c6a24228593f9b8851f8e (patch)
treee7a1167a4d49115dbd14d780819cc4f8823153e4 /gcc/omp-offload.c
parent25651634436238d505c586fd308cdd5b6c5db8f9 (diff)
downloadgcc-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.c24
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)