diff options
author | Julian Brown <julian@codesourcery.com> | 2020-06-29 13:16:51 -0700 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2021-09-17 21:04:29 +0200 |
commit | 82792cc407d7a7ab99f37e8501d19be2e6164e50 (patch) | |
tree | 17389c9571d795bbf51eefbdab23dc0d5e6f73ed /gcc | |
parent | 8251f90e87f67e09f5203e8edd77bfe73b68a54d (diff) | |
download | gcc-82792cc407d7a7ab99f37e8501d19be2e6164e50.zip gcc-82792cc407d7a7ab99f37e8501d19be2e6164e50.tar.gz gcc-82792cc407d7a7ab99f37e8501d19be2e6164e50.tar.bz2 |
openacc: Turn off worker partitioning if num_workers==1
This patch turns off the middle-end worker-partitioning support if the
number of workers for an outlined offload function is one. In that case,
we do not need to perform the broadcasting/neutering code transformation.
gcc/
* omp-oacc-neuter-broadcast.cc
(pass_omp_oacc_neuter_broadcast::gate): Disable if num_workers is
1.
(execute_omp_oacc_neuter_broadcast): Adjust.
Co-Authored-By: Thomas Schwinge <thomas@codesourcery.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/omp-oacc-neuter-broadcast.cc | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-broadcast.cc index d48627a..3fe9224 100644 --- a/gcc/omp-oacc-neuter-broadcast.cc +++ b/gcc/omp-oacc-neuter-broadcast.cc @@ -1378,18 +1378,17 @@ execute_omp_oacc_neuter_broadcast () /* If this is a routine, calculate MASK as if the outer levels are already partitioned. */ - tree attr = oacc_get_fn_attrib (current_function_decl); - if (attr) - { - tree dims = TREE_VALUE (attr); - unsigned ix; - for (ix = 0; ix != GOMP_DIM_MAX; ix++, dims = TREE_CHAIN (dims)) - { - tree allowed = TREE_PURPOSE (dims); - if (allowed && integer_zerop (allowed)) - mask |= GOMP_DIM_MASK (ix); - } - } + { + tree attr = oacc_get_fn_attrib (current_function_decl); + tree dims = TREE_VALUE (attr); + unsigned ix; + for (ix = 0; ix != GOMP_DIM_MAX; ix++, dims = TREE_CHAIN (dims)) + { + tree allowed = TREE_PURPOSE (dims); + if (allowed && integer_zerop (allowed)) + mask |= GOMP_DIM_MASK (ix); + } + } parallel_g *par = omp_sese_discover_pars (&bb_stmt_map); populate_single_mode_bitmaps (par, worker_single, vector_single, mask, 0); @@ -1506,11 +1505,27 @@ public: {} /* opt_pass methods: */ - virtual bool gate (function *) + virtual bool gate (function *fun) { - return (flag_openacc - && targetm.goacc.create_worker_broadcast_record); - }; + if (!flag_openacc) + return false; + + if (!targetm.goacc.create_worker_broadcast_record) + return false; + + /* Only relevant for OpenACC offloaded functions. */ + tree attr = oacc_get_fn_attrib (fun->decl); + if (!attr) + return false; + + /* Not relevant for 'num_workers(1)'. */ + int worker_dim + = oacc_get_fn_dim_size (fun->decl, GOMP_DIM_WORKER); + if (worker_dim == 1) + return false; + + return true; + } virtual unsigned int execute (function *) { |