public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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

  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).