public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "H.J. Lu" <hjl.tools@gmail.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>,
	Tobias Burnus <tobias@codesourcery.com>
Subject: Re: [committed] openmp: Add support for 2 argument num_teams clause
Date: Sat, 13 Nov 2021 08:50:22 -0800	[thread overview]
Message-ID: <CAMe9rOpadN=DStNM7Pndry02qBfVVncYwY2S9jJFh4oyz=JGHg@mail.gmail.com> (raw)
In-Reply-To: <20211111091130.GN2710@tucnak>

On Thu, Nov 11, 2021 at 1:12 AM Jakub Jelinek via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi!
>
> In OpenMP 5.1, num_teams clause can accept either one expression as before,
> but it in that case changed meaning, rather than create <= expression
> teams it is now create == expression teams.  Or it accepts two expressions
> separated by :, with the meaning that the first is low bound and second upper
> bound on how many teams should be created.  The other ways to set number of
> teams are upper bounds with lower bound of 1.
>
> The following patch does parsing of this for C/C++.  For host teams, we
> actually don't need to do anything further right now, we always create
> (pretend to create) exactly the requested number of teams, so we can just
> evaluate and throw away the lower bound for now.
> For teams nested in target, we don't guarantee that though and further
> work will be needed.
> In particular, omplower now turns the teams part of:
> struct S { S (); S (const S &); ~S (); int s; };
> void bar (S &, S &);
> int baz ();
> _Pragma ("omp declare target to (baz)");
>
> void
> foo (void)
> {
>   S a, b;
>   #pragma omp target private (a) map (b)
>   {
>     #pragma omp teams firstprivate (b) num_teams (baz ())
>     {
>       bar (a, b);
>     }
>   }
> }
> into:
>   retval.0 = baz ();
>   retval.1 = retval.0;
>   {
>     unsigned int retval.3;
>     struct S * D.2549;
>     struct S b;
>
>     retval.3 = (unsigned int) retval.1;
>     D.2549 = .omp_data_i->b;
>     S::S (&b, D.2549);
>     #pragma omp teams num_teams(retval.1) firstprivate(b) shared(a)
>     __builtin_GOMP_teams (retval.3, 0);
>     {
>       bar (&a, &b);
>     }
>     S::~S (&b);
>     #pragma omp return(nowait)
>   }
> IMHO we want a new API, say GOMP_teams3 which will take 3 arguments
> instead of 2 (the lower and upper bounds from num_teams and thread_limit)
> and will return a bool whether it should do the teams body or not.
> And, we should add right before outermost {} above
> while (__builtin_GOMP_teams3 ((unsigned) retval.1, (unsigned) retval.1, 0))
> and remove the __builtin_GOMP_teams call.  The current function performs
> exit equivalent (at least on NVPTX) which seems bad because that means
> the destructors of e.g. private variables on target aren't invoked, and
> at the current placement neither destructors of the already constructed
> privatized variables in teams.
> I'll do this next on the compiler side, but I'm afraid I'll need help
> with the nvptx and amdgcn implementations.  E.g. for nvptx, we won't be
> able to use %ctaid.x .  I think ideal would be to use a .shared
> integer variable for the omp_get_team_num value, but I don't have any
> experience with that, are .shared variables zero initialized by default,
> or do they have random value at start?  PTX docs say they aren't initializable.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.
>
> 2021-11-11  Jakub Jelinek  <jakub@redhat.com>
>
> gcc/
>         * tree.h (OMP_CLAUSE_NUM_TEAMS_EXPR): Rename to ...
>         (OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR): ... this.
>         (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR): Define.
>         * tree.c (omp_clause_num_ops): Increase num ops for
>         OMP_CLAUSE_NUM_TEAMS to 2.
>         * tree-pretty-print.c (dump_omp_clause): Print optional lower bound
>         for OMP_CLAUSE_NUM_TEAMS.
>         * gimplify.c (gimplify_scan_omp_clauses): Gimplify
>         OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR if non-NULL.
>         (optimize_target_teams): Use OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR instead
>         of OMP_CLAUSE_NUM_TEAMS_EXPR.  Handle OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR.
>         * omp-low.c (lower_omp_teams): Use OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR
>         instead of OMP_CLAUSE_NUM_TEAMS_EXPR.
>         * omp-expand.c (expand_teams_call, get_target_arguments): Likewise.
> gcc/c/
>         * c-parser.c (c_parser_omp_clause_num_teams): Parse optional
>         lower-bound and store it into OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR.
>         Use OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR instead of
>         OMP_CLAUSE_NUM_TEAMS_EXPR.
>         (c_parser_omp_target): For OMP_CLAUSE_NUM_TEAMS evaluate before
>         combined target teams even lower-bound expression.
> gcc/cp/
>         * parser.c (cp_parser_omp_clause_num_teams): Parse optional
>         lower-bound and store it into OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR.
>         Use OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR instead of
>         OMP_CLAUSE_NUM_TEAMS_EXPR.
>         (cp_parser_omp_target): For OMP_CLAUSE_NUM_TEAMS evaluate before
>         combined target teams even lower-bound expression.
>         * semantics.c (finish_omp_clauses): Handle
>         OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR of OMP_CLAUSE_NUM_TEAMS clause.
>         * pt.c (tsubst_omp_clauses): Likewise.
>         (tsubst_expr): For OMP_CLAUSE_NUM_TEAMS evaluate before
>         combined target teams even lower-bound expression.
> gcc/fortran/
>         * trans-openmp.c (gfc_trans_omp_clauses): Use
>         OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR instead of OMP_CLAUSE_NUM_TEAMS_EXPR.
> gcc/testsuite/
>         * c-c++-common/gomp/clauses-1.c (bar): Supply lower-bound expression
>         to half of the num_teams clauses.
>         * c-c++-common/gomp/num-teams-1.c: New test.
>         * c-c++-common/gomp/num-teams-2.c: New test.
>         * g++.dg/gomp/attrs-1.C (bar): Supply lower-bound expression
>         to half of the num_teams clauses.
>         * g++.dg/gomp/attrs-2.C (bar): Likewise.
>         * g++.dg/gomp/num-teams-1.C: New test.
>         * g++.dg/gomp/num-teams-2.C: New test.
> libgomp/
>         * testsuite/libgomp.c-c++-common/teams-1.c: New test.
>

This caused:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103224

May need bootstrap to reproduce it.

-- 
H.J.

      reply	other threads:[~2021-11-13 16:51 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-11  9:11 Jakub Jelinek
2021-11-13 16:50 ` H.J. Lu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAMe9rOpadN=DStNM7Pndry02qBfVVncYwY2S9jJFh4oyz=JGHg@mail.gmail.com' \
    --to=hjl.tools@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=tobias@codesourcery.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).