From: Nathan Sidwell <nathan@acm.org>
To: Jakub Jelinek <jakub@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>,
Cesar Philippidis <cesar_philippidis@mentor.com>
Subject: Re: OpenACC Firstprivate
Date: Mon, 09 Nov 2015 13:59:00 -0000 [thread overview]
Message-ID: <5640A6B3.3030409@acm.org> (raw)
In-Reply-To: <20151109134619.GQ5675@tucnak.redhat.com>
On 11/09/15 08:46, Jakub Jelinek wrote:
> On Sat, Nov 07, 2015 at 08:50:28AM -0500, Nathan Sidwell wrote:
>> Index: gcc/gimplify.c
>> ===================================================================
>
> If you want to switch to hexadecimal, you should change all values
> in the enum to hexadecimal for consistency.
ok.
>>
>> /* Gimplify hashtable helper. */
>> @@ -377,6 +383,12 @@ new_omp_context (enum omp_region_type re
>> else
>> c->default_kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
>>
>> + c->combined_loop = false;
>> + c->distribute = false;
>> + c->target_map_scalars_firstprivate = false;
>> + c->target_map_pointers_as_0len_arrays = false;
>> + c->target_firstprivatize_array_bases = false;
>
> Why this? c is XCNEW allocated, so zero initialized.
I presumed it necessary, as it was on the branch. will remove.
>
>> @@ -5667,11 +5682,13 @@ omp_add_variable (struct gimplify_omp_ct
>> /* We shouldn't be re-adding the decl with the same data
>> sharing class. */
>> gcc_assert ((n->value & GOVD_DATA_SHARE_CLASS & flags) == 0);
>> - /* The only combination of data sharing classes we should see is
>> - FIRSTPRIVATE and LASTPRIVATE. */
>> nflags = n->value | flags;
>> - gcc_assert ((nflags & GOVD_DATA_SHARE_CLASS)
>> - == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE)
>> + /* The only combination of data sharing classes we should see is
>> + FIRSTPRIVATE and LASTPRIVATE. However, OpenACC permits
>> + reduction variables to be used in data sharing clauses. */
>> + gcc_assert ((ctx->region_type & ORT_ACC) != 0
>> + || ((nflags & GOVD_DATA_SHARE_CLASS)
>> + == (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE))
>> || (flags & GOVD_DATA_SHARE_CLASS) == 0);
>
> Are you sure you want to give up on any kind of consistency checks for
> OpenACC? If only reduction is special on OpenACC, perhaps you could tweak
> the assert for that instead? Something that can be done incrementally of
> course.
Will investigate (later)
>
>> +
>> + /* OpenMP doesn't look in outer contexts to find an
>> + enclosing data clause. */
>
> I'm puzzled by the comment. OpenMP does look in outer context for clauses
> that need that (pretty much all closes but private), that is the do_outer:
> recursion in omp_notice_variable. Say for firstprivate in order to copy (or
> copy construct) the private variable one needs the access to the outer
> context's var etc.).
> So perhaps it would help to document what you are doing here for OpenACC and
> why.
Ok. It seemed (and it may become clearer with default handling added), that
OpenACC and OpenMP scanned scopes in opposite orders. I remember trying to
get the ACC code to scan in the same order, but came up blank. Anyway, you're
right, it should say what OpenACC is trying.
> The main issue I have is with the omp-low.c changes.
> I see:
> "2.5.9
> private clause
> The private clause is allowed on the parallel construct; it declares that a copy of each
> item on the list will be created for each parallel gang.
>
> 2.5.10
> firstprivate clause
> The firstprivate clause is allowed on the parallel construct; it declares that a copy
> of each item on the list will be created for each parallel gang, and that the copy will be
> initialized with the value of that item on the host when the parallel construct is
> encountered."
>
> but looking at what you actually emit looks like standard present_copyin
> clause I think with a private variable defined in the region where the
> value of the present_copyin mapped variable is assigned to the private one.
> This I'm afraid performs often two copies rather than just one (one to copy
> the host value to the present_copyin mapped value, another one in the
> region),
I don't think that can be avoided. The host doesn't have control over when the
CTAs (a gang) start -- they may even be serialized onto the same physical HW.
So each gang has to initialize its own instance. Or did you mean something else?
> but more importantly, if the var is already mapped, you could
> initialize the private var with old data.
> Say
> int arr[64];
> // initialize arr
> #pragma acc data copyin (arr)
> {
> // modify arr on the host
> # pragma acc parallel firstprivate (arr)
> {
> ...
> }
> }
Hm, I suspect that is either ill formed or the std does not contemplate.
> Is that really what you want? If not, any reason not to implement
> GOMP_MAP_FIRSTPRIVATE and GOMP_MAP_FIRSTPRIVATE_INT on the libgomp oacc-*
> side and just use the OpenMP firstprivate handling in omp-low.c?
I would have to investigate ...
nathan
next prev parent reply other threads:[~2015-11-09 13:59 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-07 13:50 Nathan Sidwell
2015-11-09 13:46 ` Jakub Jelinek
2015-11-09 13:59 ` Nathan Sidwell [this message]
2015-11-09 14:06 ` Nathan Sidwell
2015-11-09 14:10 ` Jakub Jelinek
2015-11-09 14:46 ` Nathan Sidwell
2015-11-10 14:13 ` Nathan Sidwell
2015-11-11 8:05 ` Jakub Jelinek
2015-11-11 13:44 ` Nathan Sidwell
2015-11-12 9:00 ` Thomas Schwinge
2015-11-11 13:52 ` [gomp4] Rework gimplifyier region flags Nathan Sidwell
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=5640A6B3.3030409@acm.org \
--to=nathan@acm.org \
--cc=cesar_philippidis@mentor.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.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).