aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-offload.c
diff options
context:
space:
mode:
authorGergö Barany <gergo@codesourcery.com>2019-02-01 00:59:30 +0100
committerThomas Schwinge <thomas@codesourcery.com>2020-11-13 22:58:57 +0100
commite898ce7997733c29dcab9c3c62ca102c7f9fa6eb (patch)
tree332bb0438f3383bc22d777c3b0008c269dba4d8a /gcc/omp-offload.c
parentbd7885755405bc9947ebe805a53d6100c78c8e82 (diff)
downloadgcc-e898ce7997733c29dcab9c3c62ca102c7f9fa6eb.zip
gcc-e898ce7997733c29dcab9c3c62ca102c7f9fa6eb.tar.gz
gcc-e898ce7997733c29dcab9c3c62ca102c7f9fa6eb.tar.bz2
Decompose OpenACC 'kernels' constructs into parts, a sequence of compute constructs
Not yet enabled by default: for now, the current mode of OpenACC 'kernels' constructs handling still remains '-fopenacc-kernels=parloops', but that is to change later. gcc/ * omp-oacc-kernels-decompose.cc: New. * Makefile.in (OBJS): Add it. * passes.def: Instantiate it. * tree-pass.h (make_pass_omp_oacc_kernels_decompose): Declare. * flag-types.h (enum openacc_kernels): Add. * doc/invoke.texi (-fopenacc-kernels): Document. * gimple.h (enum gf_mask): Add 'GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_PARALLELIZED', 'GF_OMP_TARGET_KIND_OACC_PARALLEL_KERNELS_GANG_SINGLE', 'GF_OMP_TARGET_KIND_OACC_DATA_KERNELS'. (is_gimple_omp_oacc, is_gimple_omp_offloaded): Handle these. * gimple-pretty-print.c (dump_gimple_omp_target): Likewise. * omp-expand.c (expand_omp_target, build_omp_regions_1) (omp_make_gimple_edges): Likewise. * omp-low.c (scan_sharing_clauses, scan_omp_for) (check_omp_nesting_restrictions, lower_oacc_reductions) (lower_oacc_head_mark, lower_omp_target): Likewise. * omp-offload.c (execute_oacc_device_lower): Likewise. gcc/c-family/ * c.opt (fopenacc-kernels): Add. gcc/fortran/ * lang.opt (fopenacc-kernels): Add. gcc/testsuite/ * c-c++-common/goacc/kernels-decompose-1.c: New. * c-c++-common/goacc/kernels-decompose-2.c: New. * c-c++-common/goacc/kernels-decompose-ice-1.c: New. * c-c++-common/goacc/kernels-decompose-ice-2.c: New. * gfortran.dg/goacc/kernels-decompose-1.f95: New. * gfortran.dg/goacc/kernels-decompose-2.f95: New. * c-c++-common/goacc/if-clause-2.c: Adjust. * gfortran.dg/goacc/kernels-tree.f95: Likewise. libgomp/ * testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose-ice-1.c: New. * testsuite/libgomp.oacc-c-c++-common/declare-vla-kernels-decompose.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/kernels-decompose-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/declare-vla.c: Adjust. * testsuite/libgomp.oacc-fortran/pr94358-1.f90: Likewise. Co-authored-by: Thomas Schwinge <thomas@codesourcery.com>
Diffstat (limited to 'gcc/omp-offload.c')
-rw-r--r--gcc/omp-offload.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c
index 2158343..9013961 100644
--- a/gcc/omp-offload.c
+++ b/gcc/omp-offload.c
@@ -1771,11 +1771,19 @@ execute_oacc_device_lower ()
bool is_oacc_serial
= (lookup_attribute ("oacc serial",
DECL_ATTRIBUTES (current_function_decl)) != NULL);
+ bool is_oacc_parallel_kernels_parallelized
+ = (lookup_attribute ("oacc parallel_kernels_parallelized",
+ DECL_ATTRIBUTES (current_function_decl)) != NULL);
+ bool is_oacc_parallel_kernels_gang_single
+ = (lookup_attribute ("oacc parallel_kernels_gang_single",
+ DECL_ATTRIBUTES (current_function_decl)) != NULL);
int fn_level = oacc_fn_attrib_level (attrs);
bool is_oacc_routine = (fn_level >= 0);
gcc_checking_assert (is_oacc_parallel
+ is_oacc_kernels
+ is_oacc_serial
+ + is_oacc_parallel_kernels_parallelized
+ + is_oacc_parallel_kernels_gang_single
+ is_oacc_routine
== 1);
@@ -1795,6 +1803,12 @@ execute_oacc_device_lower ()
? "parallelized" : "unparallelized"));
else if (is_oacc_serial)
fprintf (dump_file, "Function is OpenACC serial offload\n");
+ else if (is_oacc_parallel_kernels_parallelized)
+ fprintf (dump_file, "Function is %s OpenACC kernels offload\n",
+ "parallel_kernels_parallelized");
+ else if (is_oacc_parallel_kernels_gang_single)
+ fprintf (dump_file, "Function is %s OpenACC kernels offload\n",
+ "parallel_kernels_gang_single");
else if (is_oacc_routine)
fprintf (dump_file, "Function is OpenACC routine level %d\n",
fn_level);
@@ -1838,6 +1852,11 @@ execute_oacc_device_lower ()
fprintf (dump_file, "]\n");
}
+ /* Verify that for OpenACC 'kernels' decomposed "gang-single" parts we launch
+ a single gang only. */
+ if (is_oacc_parallel_kernels_gang_single)
+ gcc_checking_assert (dims[GOMP_DIM_GANG] == 1);
+
oacc_loop_process (loops);
if (dump_file)
{