This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: Ping [PATCH, Fortran, pr78505, v1] [F08] Coarray source allocation not synchronizing on oversubscribed cores
- From: Andre Vehreschild <vehre at gmx dot de>
- To: Jerry DeLisle <jvdelisle at charter dot net>
- Cc: fortran at gcc dot gnu dot org, GCC-Patches-ML <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 9 Dec 2016 13:47:45 +0100
- Subject: Re: Ping [PATCH, Fortran, pr78505, v1] [F08] Coarray source allocation not synchronizing on oversubscribed cores
- Authentication-results: sourceware.org; auth=none
- References: <20161202164629.7822c479@vepi2> <20161208144316.13d15764@vepi2> <8699c34a-4e61-35eb-6728-658df21ed5ae@charter.net>
Hi Jerry,
thanks for the review. Committed as r243482.
Regards,
Andre
On Thu, 8 Dec 2016 12:12:02 -0800
Jerry DeLisle <jvdelisle@charter.net> wrote:
> On 12/08/2016 05:43 AM, Andre Vehreschild wrote:
> > Ping!
> >
> > On Fri, 2 Dec 2016 16:46:29 +0100
> > Andre Vehreschild <vehre@gmx.de> wrote:
> >
> >> Hi all,
> >>
> >> attached patch adds a call to sync_all after an ALLOCATE allocating a
> >> coarray. This is to adhere to standard wanting:
> >>
> >> ..., execution of the segment (11.6.2) following the statement is delayed
> >> until all other active images in the current team have executed the same
> >> statement the same number of times in this team.
> >>
> >> This, esp. the "statement", means that assigning the SOURCE= is to come
> >> before the sync all, which means we have to do it explicitly after that
> >> assignment. Or the other way around the sync all can be done in library
> >> caf_register().
> >>
> >> Bootstraps and regtests ok on x86_64-linux/F23. Ok for trunk?
> >>
> >> Regards,
> >> Andre
> >
> >
>
> This OK.
>
> Jerry
--
Andre Vehreschild * Email: vehre ad gmx dot de
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog (Revision 243480)
+++ gcc/fortran/ChangeLog (Arbeitskopie)
@@ -1,5 +1,11 @@
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
+ PR fortran/78505
+ * trans-stmt.c (gfc_trans_allocate): Add sync all after the execution
+ of the whole allocate-statement to adhere to the standard.
+
+2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
+
* trans-array.c (gfc_array_deallocate): Remove wrapper.
(gfc_trans_dealloc_allocated): Same.
(structure_alloc_comps): Restructure deallocation of (nested)
Index: gcc/fortran/trans-stmt.c
===================================================================
--- gcc/fortran/trans-stmt.c (Revision 243480)
+++ gcc/fortran/trans-stmt.c (Arbeitskopie)
@@ -5506,7 +5506,7 @@
stmtblock_t block;
stmtblock_t post;
tree nelems;
- bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set;
+ bool upoly_expr, tmp_expr3_len_flag = false, al_len_needs_set, is_coarray ;
gfc_symtree *newsym = NULL;
if (!code->ext.alloc.list)
@@ -5516,6 +5516,7 @@
expr3 = expr3_vptr = expr3_len = expr3_esize = NULL_TREE;
label_errmsg = label_finish = errmsg = errlen = NULL_TREE;
e3_is = E3_UNSET;
+ is_coarray = false;
gfc_init_block (&block);
gfc_init_block (&post);
@@ -5555,9 +5556,10 @@
expression. */
if (code->expr3)
{
- bool vtab_needed = false, temp_var_needed = false,
- is_coarray = gfc_is_coarray (code->expr3);
+ bool vtab_needed = false, temp_var_needed = false;
+ is_coarray = gfc_is_coarray (code->expr3);
+
/* Figure whether we need the vtab from expr3. */
for (al = code->ext.alloc.list; !vtab_needed && al != NULL;
al = al->next)
@@ -6093,6 +6095,9 @@
tree caf_decl, token;
gfc_se caf_se;
+ /* Set flag, to add synchronize after the allocate. */
+ is_coarray = true;
+
gfc_init_se (&caf_se, NULL);
caf_decl = gfc_get_tree_for_caf_expr (expr);
@@ -6114,6 +6119,11 @@
}
else
{
+ /* Allocating coarrays needs a sync after the allocate executed.
+ Set the flag to add the sync after all objects are allocated. */
+ is_coarray = is_coarray || (gfc_caf_attr (expr).codimension
+ && flag_coarray == GFC_FCOARRAY_LIB);
+
if (expr->ts.type == BT_CHARACTER && al_len != NULL_TREE
&& expr3_len != NULL_TREE)
{
@@ -6357,6 +6367,15 @@
gfc_add_modify (&block, se.expr, tmp);
}
+ if (is_coarray && flag_coarray == GFC_FCOARRAY_LIB)
+ {
+ /* Add a sync all after the allocation has been executed. */
+ tmp = build_call_expr_loc (input_location, gfor_fndecl_caf_sync_all,
+ 3, null_pointer_node, null_pointer_node,
+ integer_zero_node);
+ gfc_add_expr_to_block (&post, tmp);
+ }
+
gfc_add_block_to_block (&block, &se.post);
gfc_add_block_to_block (&block, &post);
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (Revision 243480)
+++ gcc/testsuite/ChangeLog (Arbeitskopie)
@@ -1,5 +1,10 @@
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
+ PR fortran/78505
+ * gfortran.dg/coarray_alloc_with_implicit_sync_1.f90: New test.
+
+2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
+
* gfortran.dg/coarray_alloc_comp_3.f08: New test.
* gfortran.dg/coarray_alloc_comp_4.f08: New test.
* gfortran.dg/finalize_18.f90: Add count for additional guard against
Index: gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 (nicht existent)
+++ gcc/testsuite/gfortran.dg/coarray_alloc_with_implicit_sync_1.f90 (Arbeitskopie)
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original -fcoarray=lib" }
+! Check that allocating a coarray adds an implicit sync all.
+
+ implicit none
+ integer, allocatable :: f(:)[:]
+ allocate( f(20)[*], source = 1 )
+end
+
+! { dg-final { scan-tree-dump-times "_gfortran_caf_sync_all \\(" 1 "original" } }