single.c (_gfortran_caf_register): Store the address of all static coarrays in a...
authorDaniel Carrera <dcarrera@gmail.com>
Thu, 16 Jun 2011 23:09:36 +0000 (23:09 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 16 Jun 2011 23:09:36 +0000 (01:09 +0200)
2011-06-17  Daniel Carrera  <dcarrera@gmail.com>

        * caf/single.c (_gfortran_caf_register): Store the address
        of all static coarrays in a linked list.
        (_gfortran_caf_finalize): Free memory of staic coarrays.
        * caf/mpi.c (_gfortran_caf_register): Store the address
        of all static coarrays in a linked list. Initialize MPI
        if necessary.
        (_gfortran_caf_finalize): Free memory of staic coarrays.
        (_gfortran_caf_init): Check if MPI is already initialized
        before initializing again.
        * caf/libcaf.h: Add a type to caf_register_t to distinguish
        static coarrays and add the type caf_static_t to make the
        linked list of static coarrays.

From-SVN: r175124

libgfortran/ChangeLog
libgfortran/caf/libcaf.h
libgfortran/caf/mpi.c
libgfortran/caf/single.c

index 9d5337513e2dfb1400322f93af6ccdb5b9cdd8ae..bd95cd355c1fb00c7ea977a16e388fa9bdde338f 100644 (file)
@@ -1,3 +1,18 @@
+2011-06-17  Daniel Carrera  <dcarrera@gmail.com>
+
+       * caf/single.c (_gfortran_caf_register): Store the address
+       of all static coarrays in a linked list.
+       (_gfortran_caf_finalize): Free memory of staic coarrays.
+       * caf/mpi.c (_gfortran_caf_register): Store the address
+       of all static coarrays in a linked list. Initialize MPI
+       if necessary.
+       (_gfortran_caf_finalize): Free memory of staic coarrays.
+       (_gfortran_caf_init): Check if MPI is already initialized
+       before initializing again.
+       * caf/libcaf.h: Add a type to caf_register_t to distinguish
+       static coarrays and add the type caf_static_t to make the
+       linked list of static coarrays.
+
 2011-06-11  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * io/unix.c (buf_seek): Return error if file is not seekable.
index 9c20c4e9d781e9d88ef0ad0d2f22e66523cf18a2..4177985536dc7e36c41f9f23565b6a510e056edd 100644 (file)
@@ -38,14 +38,22 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define STAT_LOCKED_OTHER_IMAGE        2
 #define STAT_STOPPED_IMAGE     3
 
-
+/* Describes what type of array we are registerring.  */
 typedef enum caf_register_t {
-  CAF_REGTYPE_COARRAY,
+  CAF_REGTYPE_COARRAY_STATIC,
+  CAF_REGTYPE_COARRAY_ALLOC,
   CAF_REGTYPE_LOCK,
-  CAF_REGTYPE_LOCK_COMP 
+  CAF_REGTYPE_LOCK_COMP
 }
 caf_register_t;
 
+/* Linked list of static coarrays registered.  */
+typedef struct caf_static_t {
+  void **token;
+  struct caf_static_t *prev;
+}
+caf_static_t;
+
 
 void _gfortran_caf_init (int *, char ***, int *, int *);
 void _gfortran_caf_finalize (void);
index e64670ea8cb074e49e38062c0ab2425230372ec7..83f39f6f88c802af65b18dd7d89b6670ada41a6e 100644 (file)
@@ -42,6 +42,8 @@ static int caf_mpi_initialized;
 static int caf_this_image;
 static int caf_num_images;
 
+caf_static_t *caf_static_list = NULL;
+
 
 /* Initialize coarray program.  This routine assumes that no other
    MPI initialization happened before; otherwise MPI_Initialized
@@ -52,16 +54,23 @@ static int caf_num_images;
 void
 _gfortran_caf_init (int *argc, char ***argv, int *this_image, int *num_images)
 {
-  /* caf_mpi_initialized is only true if the main program is not written in
-     Fortran.  */
-  MPI_Initialized (&caf_mpi_initialized);
-  if (!caf_mpi_initialized)
-    MPI_Init (argc, argv);
+  if (caf_num_images == 0)
+    {
+      /* caf_mpi_initialized is only true if the main program is
+       not written in Fortran.  */
+      MPI_Initialized (&caf_mpi_initialized);
+      if (!caf_mpi_initialized)
+       MPI_Init (argc, argv);
+
+      MPI_Comm_size (MPI_COMM_WORLD, &caf_num_images);
+      MPI_Comm_rank (MPI_COMM_WORLD, &caf_this_image);
+      caf_this_image++;
+    }
 
-  MPI_Comm_rank (MPI_COMM_WORLD, &caf_this_image);
-  *this_image = ++caf_this_image;
-  MPI_Comm_size (MPI_COMM_WORLD, &caf_num_images);
-  *num_images = caf_num_images;
+  if (this_image)
+    *this_image = caf_this_image;
+  if (num_images)
+    *num_images = caf_num_images;
 }
 
 
@@ -70,18 +79,43 @@ _gfortran_caf_init (int *argc, char ***argv, int *this_image, int *num_images)
 void
 _gfortran_caf_finalize (void)
 {
+  while (caf_static_list != NULL)
+    {
+      free(caf_static_list->token[caf_this_image-1]);
+      caf_static_list = caf_static_list->prev;
+    }
+
   if (!caf_mpi_initialized)
     MPI_Finalize ();
 }
 
 
 void *
-_gfortran_caf_register (ptrdiff_t size,
-                        caf_register_t type __attribute__ ((unused)),
+_gfortran_caf_register (ptrdiff_t size, caf_register_t type,
                         void **token)
 {
-  *token = NULL;
-  return malloc (size);
+  void *local;
+
+  /* Start MPI if not already started.  */
+  if (caf_num_images == 0)
+    _gfortran_caf_init (NULL, NULL, NULL, NULL);
+
+  /* Token contains only a list of pointers.  */
+  local = malloc (size);
+  token = malloc (sizeof (void*) * caf_num_images);
+
+  /* token[img-1] is the address of the token in image "img".  */
+  MPI_Allgather (&local, sizeof (void*), MPI_BYTE,
+                token,  sizeof (void*), MPI_BYTE, MPI_COMM_WORLD);
+
+  if (type == CAF_REGTYPE_COARRAY_STATIC)
+    {
+      caf_static_t *tmp = malloc (sizeof (caf_static_t));
+      tmp->prev  = caf_static_list;
+      tmp->token = token;
+      caf_static_list = tmp;
+    }
+  return local;
 }
 
 
index 4c46e47d35ccff887882519385def7e94819cc2d..53927977d52515b06200c8e42acc7e7db1dd4fd8 100644 (file)
@@ -35,6 +35,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    Note: For performance reasons -fcoarry=single should be used
    rather than this library.  */
 
+/* Global variables.  */
+caf_static_t *caf_static_list = NULL;
+
 
 void
 _gfortran_caf_init (int *argc __attribute__ ((unused)),
@@ -49,16 +52,32 @@ _gfortran_caf_init (int *argc __attribute__ ((unused)),
 void
 _gfortran_caf_finalize (void)
 {
+  while (caf_static_list != NULL)
+    {
+      free(caf_static_list->token[0]);
+      caf_static_list = caf_static_list->prev;
+    }
 }
 
 
 void *
-_gfortran_caf_register (ptrdiff_t size,
-                       caf_register_t type __attribute__ ((unused)),
+_gfortran_caf_register (ptrdiff_t size, caf_register_t type,
                        void **token)
 {
-  *token = NULL;
-  return malloc (size);
+  void *local;
+
+  local = malloc (size);
+  token = malloc (sizeof (void*) * 1);
+  token[0] = local;
+
+  if (type == CAF_REGTYPE_COARRAY_STATIC)
+    {
+      caf_static_t *tmp = malloc (sizeof (caf_static_t));
+      tmp->prev  = caf_static_list;
+      tmp->token = token;
+      caf_static_list = tmp;
+    }
+  return local;
 }
 
 
@@ -78,6 +97,7 @@ _gfortran_caf_sync_all (int *stat,
     *stat = 0;
 }
 
+
 void
 _gfortran_caf_sync_images (int count __attribute__ ((unused)),
                           int images[] __attribute__ ((unused)),