aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorDaniel Carrera <dcarrera@gmail.com>2011-06-16 23:09:36 +0000
committerTobias Burnus <burnus@gcc.gnu.org>2011-06-17 01:09:36 +0200
commit0a1138af63725af5098e259237492b819631e05b (patch)
tree1a0780f50a63ba3471f12fc0843bb7bd1dcd422b /libgfortran
parente9f389f0da308bdb9259afc8be4b7b207acd3900 (diff)
downloadgcc-0a1138af63725af5098e259237492b819631e05b.zip
gcc-0a1138af63725af5098e259237492b819631e05b.tar.gz
gcc-0a1138af63725af5098e259237492b819631e05b.tar.bz2
single.c (_gfortran_caf_register): Store the address of all static coarrays in a linked list.
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
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog15
-rw-r--r--libgfortran/caf/libcaf.h14
-rw-r--r--libgfortran/caf/mpi.c60
-rw-r--r--libgfortran/caf/single.c28
4 files changed, 97 insertions, 20 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 9d53375..bd95cd3 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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.
diff --git a/libgfortran/caf/libcaf.h b/libgfortran/caf/libcaf.h
index 9c20c4e..4177985 100644
--- a/libgfortran/caf/libcaf.h
+++ b/libgfortran/caf/libcaf.h
@@ -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);
diff --git a/libgfortran/caf/mpi.c b/libgfortran/caf/mpi.c
index e64670e..83f39f6 100644
--- a/libgfortran/caf/mpi.c
+++ b/libgfortran/caf/mpi.c
@@ -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;
}
diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c
index 4c46e47..5392797 100644
--- a/libgfortran/caf/single.c
+++ b/libgfortran/caf/single.c
@@ -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)),