Message ID | 20200629201653.147326-3-julian@codesourcery.com |
---|---|
State | New |
Headers | show |
Series | [og10] OpenACC: Turn off worker partitioning if num_workers==1 | expand |
Hi! On 2020-06-29T13:16:51-0700, Julian Brown <julian@codesourcery.com> wrote: > 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. ACK, thanks. > --- a/gcc/omp-offload.c > +++ b/gcc/omp-offload.c > @@ -2165,7 +2165,20 @@ public: > /* opt_pass methods: */ > virtual bool gate (function *) > { > - return flag_openacc && targetm.goacc.worker_partitioning; > + if (!flag_openacc || !targetm.goacc.worker_partitioning) > + return false; > + > + tree attr = oacc_get_fn_attrib (current_function_decl); > + > + if (!attr) > + /* Not an offloaded function. */ > + return false; This last check implies that code in 'gcc/omp-oacc-neuter-broadcast.cc:execute_omp_oacc_neuter_broadcast' ought to be simplified which currently does: tree attr = oacc_get_fn_attrib (current_function_decl); if (attr) ..., which now is always-true. > + > + int worker_dim > + = oacc_get_fn_dim_size (current_function_decl, GOMP_DIM_WORKER); > + > + /* No worker partitioning if we know the number of workers is 1. */ > + return worker_dim != 1; > }; Pushed to master branch commit 82792cc407d7a7ab99f37e8501d19be2e6164e50 "openacc: Turn off worker partitioning if num_workers==1", see attached. Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c index bf72782ba4ce..2b730d057781 100644 --- a/gcc/omp-offload.c +++ b/gcc/omp-offload.c @@ -2165,7 +2165,20 @@ public: /* opt_pass methods: */ virtual bool gate (function *) { - return flag_openacc && targetm.goacc.worker_partitioning; + if (!flag_openacc || !targetm.goacc.worker_partitioning) + return false; + + tree attr = oacc_get_fn_attrib (current_function_decl); + + if (!attr) + /* Not an offloaded function. */ + return false; + + int worker_dim + = oacc_get_fn_dim_size (current_function_decl, GOMP_DIM_WORKER); + + /* No worker partitioning if we know the number of workers is 1. */ + return worker_dim != 1; }; virtual unsigned int execute (function *)