diff mbox

Ping [PATCH, Fortran, pr78505, v1] [F08] Coarray source allocation not synchronizing on oversubscribed cores

Message ID 20161209134745.47aebfce@vepi2
State New
Headers show

Commit Message

Andre Vehreschild Dec. 9, 2016, 12:47 p.m. UTC
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
diff mbox

Patch

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" } }