public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Chung-Lin Tang <cltang@codesourcery.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>,
	Jakub Jelinek <jakub@redhat.com>,
	Catherine Moore <clm@codesourcery.com>,
	Andrew Stubbs <ams@codesourcery.com>
Subject: Re: [PATCH, v2, OpenMP 5.0, libgomp] Structure element mapping for OpenMP 5.0
Date: Wed, 13 Jan 2021 23:25:21 +0800	[thread overview]
Message-ID: <6495d44e-319f-d09f-ddbf-c3372a619147@codesourcery.com> (raw)
In-Reply-To: <5866fad9-0756-d086-cd37-4bd7c0c52ec5@codesourcery.com>

Ping x2.

Hi Jakub, would like this part of OpenMP 5.0 to be considered for GCC 11.

Thanks,
Chung-Lin

On 2020/12/14 6:32 PM, Chung-Lin Tang wrote:
> Ping.
> 
> On 2020/12/4 10:15 PM, Chung-Lin Tang wrote:
>> Hi Jakub,
>> this is a new version of the structure element mapping patch for OpenMP 5.0 requirement
>> changes.
>>
>> This one uses the approach you've outlined in your concept patch [1], basically to
>> use more special REFCOUNT_* values to mark them, and link following structure element
>> splay_tree_keys back to the first key's refcount.
>> [1] https://gcc.gnu.org/pipermail/gcc-patches/2020-October/557622.html
>>
>> Implementation notes of the attached patch:
>>
>> (1) This patch solves the 5.0 requirements of "not already incremented/decremented
>> because of the effect of a map clause on the construct" by pulling in libgomp/hashtab.h
>> and using htab_t as a pointer set. A "htab_t *refcount_set" is added in map/unmap
>> routines to track the processing status of the uintptr_t* addresses of refcount
>> fields in splay_tree_keys.
>>
>>     * Currently this patch is using the same htab_create/htab_free routines like in task.c.
>>       I toyed with creating a 'htab_alloca' macro (allocating a fixed size htab) to speed
>>       things further, but decided to play it safer for the current patch.
>>
>> (2) Because of the use of pointer-to-refcounts as the basis, and structure element
>> siblings all share a same refcount, uniform increment/decrement without repeating is
>> also naturally achieved.
>>
>> (3) Because of the need to remove whole structure element sibling sequences out of
>> context, it appears we need to mark the first/last of such a sequence. You'll see that
>> the special REFCOUNT_* values have been expanded a bit more than your concept patch
>> (at some point we should think about stop abusing it and add a proper flags word)
>>
>> (4) The new increment/decrement routines combine most of the new refcount_set lookup
>> code with the refcount adjusting. For the decrement routine, "copy" and "removal" are
>> now separate return values, since for structure element sequences, even when signalling
>> "removal" you may still need to finish the "copy" work of following target_var_descs.
>>
>> (5) There are some re-organizing changes to oacc-parallel.c and oacc-mem.c, but most
>> of the code that matters is in target.c.
>>
>> (6) New testcases have been added to reflect the cases discussed on omp-lang list.
>>
>> This patch has been tested for libgomp with no regressions on x86_64-linux with
>> nvptx offloading. Since I submitted the first "v1" patch long ago, is this okay to be
>> considered as committable now after approval?
>>
>> Thanks,
>> Chung-Lin
>>
>> 2020-12-04  Chung-Lin Tang  <cltang@codesourcery.com>
>>
>>      libgomp/
>>      * hashtab.h (htab_clear): New function with initialization code
>>      factored out from...
>>      (htab_create): ...here, adjust to use htab_clear function.
>>
>>      * libgomp.h (REFCOUNT_SPECIAL): New symbol to denote range of
>>      special refcount values, add comments.
>>      (REFCOUNT_INFINITY): Adjust definition to use REFCOUNT_SPECIAL.
>>      (REFCOUNT_LINK): Likewise.
>>      (REFCOUNT_STRUCTELEM): New special refcount range for structure
>>      element siblings.
>>      (REFCOUNT_STRUCTELEM_P): Macro for testing for structure element
>>      sibling maps.
>>      (REFCOUNT_STRUCTELEM_FLAG_FIRST): Flag to indicate first sibling.
>>      (REFCOUNT_STRUCTELEM_FLAG_LAST):  Flag to indicate last sibling.
>>      (REFCOUNT_STRUCTELEM_FIRST_P): Macro to test _FIRST flag.
>>      (REFCOUNT_STRUCTELEM_LAST_P): Macro to test _LAST flag.
>>      (struct splay_tree_key_s): Add structelem_refcount and
>>      structelem_refcount_ptr fields into a union with dynamic_refcount.
>>      Add comments.
>>      (gomp_map_vars): Delete declaration.
>>      (gomp_map_vars_async): Likewise.
>>      (gomp_unmap_vars): Likewise.
>>      (gomp_unmap_vars_async): Likewise.
>>      (goacc_map_vars): New declaration.
>>      (goacc_unmap_vars): Likewise.
>>
>>      * oacc-mem.c (acc_map_data): Adjust to use goacc_map_vars.
>>      (goacc_enter_datum): Likewise.
>>      (goacc_enter_data_internal): Likewise.
>>      * oacc-parallel.c (GOACC_parallel_keyed): Adjust to use goacc_map_vars
>>      and goacc_unmap_vars.
>>      (GOACC_data_start): Adjust to use goacc_map_vars.
>>      (GOACC_data_end): Adjust to use goacc_unmap_vars.
>>
>>      * target.c (hash_entry_type): New typedef.
>>      (htab_alloc): New function hook for hashtab.h.
>>      (htab_free): Likewise.
>>      (htab_hash): Likewise.
>>      (htab_eq): Likewise.
>>      (hashtab.h): Add file include.
>>      (gomp_increment_refcount): New function.
>>      (gomp_decrement_refcount): Likewise.
>>      (gomp_map_vars_existing): Add refcount_set parameter, adjust to use
>>      gomp_increment_refcount.
>>      (gomp_map_fields_existing): Add refcount_set parameter, adjust calls
>>      to gomp_map_vars_existing.
>>
>>      (gomp_map_vars_internal): Add refcount_set parameter, add local openmp_p
>>      variable to guard OpenMP specific paths, adjust calls to
>>      gomp_map_vars_existing, add structure element sibling splay_tree_key
>>      sequence creation code, adjust Fortran map case to avoid increment
>>      under OpenMP.
>>      (gomp_map_vars): Adjust to static, add refcount_set parameter, manage
>>      local refcount_set if caller passed in NULL, adjust call to
>>      gomp_map_vars_internal.
>>      (gomp_map_vars_async): Adjust and rename into...
>>      (goacc_map_vars): ...this new function, adjust call to
>>      gomp_map_vars_internal.
>>
>>      (gomp_remove_splay_tree_key): New function with code factored out from
>>      gomp_remove_var_internal.
>>      (gomp_remove_var_internal): Add code to handle removing multiple
>>      splay_tree_key sequence for structure elements, adjust code to use
>>      gomp_remove_splay_tree_key for splay-tree key removal.
>>      (gomp_unmap_vars_internal): Add refcount_set parameter, adjust to use
>>      gomp_decrement_refcount.
>>      (gomp_unmap_vars): Adjust to static, add refcount_set parameter, manage
>>      local refcount_set if caller passed in NULL, adjust call to
>>      gomp_unmap_vars_internal.
>>      (gomp_unmap_vars_async): Adjust and rename into...
>>      (goacc_unmap_vars): ...this new function, adjust call to
>>      gomp_unmap_vars_internal.
>>      (GOMP_target): Manage refcount_set and adjust calls to gomp_map_vars and
>>      gomp_unmap_vars.
>>      (GOMP_target_ext): Likewise.
>>      (gomp_target_data_fallback): Adjust call to gomp_map_vars.
>>      (GOMP_target_data): Likewise.
>>      (GOMP_target_data_ext): Likewise.
>>      (GOMP_target_end_data): Adjust call to gomp_unmap_vars.
>>      (gomp_exit_data): Add refcount_set parameter, adjust to use
>>      gomp_decrement_refcount, adjust to queue splay-tree keys for removal
>>      after main loop.
>>      (GOMP_target_enter_exit_data): Manage refcount_set and adjust calls to
>>      gomp_map_vars and gomp_exit_data.
>>      (gomp_target_task_fn): Likewise.
>>
>>      * testsuite/libgomp.c-c++-common/refcount-1.c: New testcase.
>>      * testsuite/libgomp.c-c++-common/struct-elem-1.c: New testcase.
>>      * testsuite/libgomp.c-c++-common/struct-elem-2.c: New testcase.
>>      * testsuite/libgomp.c-c++-common/struct-elem-3.c: New testcase.
>>      * testsuite/libgomp.c-c++-common/struct-elem-4.c: New testcase.
>>      * testsuite/libgomp.c-c++-common/struct-elem-5.c: New testcase.

  reply	other threads:[~2021-01-13 15:25 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-04 14:15 Chung-Lin Tang
2020-12-14 10:32 ` Chung-Lin Tang
2021-01-13 15:25   ` Chung-Lin Tang [this message]
2021-01-16  9:45 ` Jakub Jelinek
2021-01-19  8:46   ` Chung-Lin Tang
2021-01-19  9:22     ` Jakub Jelinek
2023-03-24 15:36 ` [og12] In 'libgomp/target.c:gomp_unmap_vars_internal', defer 'gomp_remove_var' (was: [PATCH, v2, OpenMP 5.0, libgomp] Structure element mapping for OpenMP 5.0) Thomas Schwinge

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=6495d44e-319f-d09f-ddbf-c3372a619147@codesourcery.com \
    --to=cltang@codesourcery.com \
    --cc=ams@codesourcery.com \
    --cc=clm@codesourcery.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).