public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Daniel Carrera <dcarrera@gmail.com>
To: gfortran <fortran@gcc.gnu.org>, gcc-patches@gcc.gnu.org
Subject: [Patch, Fortra, Coarray] Free allocated memory for static coarrays.
Date: Thu, 16 Jun 2011 09:45:00 -0000	[thread overview]
Message-ID: <4DF9CF42.8030501@gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1255 bytes --]

Hello,

This is my second patch for GFortran. This patch adds a linked list to 
keep track of the allocated memory of all static coarrays and ensures 
that at the end of the program the memory is freed.

Additionally, I use MPI_Allgather in mpi.c to ensure that all images 
know the address of the stored memory in the other images. This will be 
needed when the images start sending data to each other.

There is no test case attached because there is no way to automatically 
test for allocated memory.

Here is my ChangeLog to go into libgfortran/ChangeLog:

2011-06-16  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.

Cheers,
Daniel.
-- 
I'm not overweight, I'm undertall.

[-- Attachment #2: caf-free-memory.patch --]
[-- Type: text/x-patch, Size: 4696 bytes --]

Index: libgfortran/caf/single.c
===================================================================
--- libgfortran/caf/single.c	(revision 174944)
+++ libgfortran/caf/single.c	(working copy)
@@ -35,7 +35,10 @@
    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)),
 		    char ***argv __attribute__ ((unused)),
@@ -49,16 +52,31 @@
 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);
+
+  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: libgfortran/caf/libcaf.h
===================================================================
--- libgfortran/caf/libcaf.h	(revision 174944)
+++ libgfortran/caf/libcaf.h	(working copy)
@@ -38,15 +38,23 @@
 #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_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: libgfortran/caf/mpi.c
===================================================================
--- libgfortran/caf/mpi.c	(revision 174944)
+++ libgfortran/caf/mpi.c	(working copy)
@@ -42,7 +42,10 @@
 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
    had to be used.  As the MPI library might modify the command-line
@@ -52,36 +55,68 @@
 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_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;
+      MPI_Comm_size (MPI_COMM_WORLD, &caf_num_images);
+      MPI_Comm_rank (MPI_COMM_WORLD, &caf_this_image);
+      caf_this_image++;
+    }
+
+  if (this_image)
+    this_image = caf_this_image;
+  if (num_images)
+    num_images = caf_num_images; 
 }
 
 
+
 /* Finalize coarray program.   */
 
 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;
+
+  local = malloc (size);
+  token = malloc (sizeof (void*) * caf_num_images);
+
+  /* Start MPI if not already started.  */
+  if (caf_num_images == 0)
+    _gfortran_caf_init (NULL, NULL, NULL, NULL);
+
+  /* token[img-1] is the address of the token in image "img".  */
+  MPI_Allgather (local,    sizeof (void*), MPI_BYTE,
+		 token[0], 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;
 }
 
 

             reply	other threads:[~2011-06-16  9:39 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-16  9:45 Daniel Carrera [this message]
2011-06-16 12:55 Tobias Burnus
2011-06-16 15:17 ` Daniel Carrera
2011-06-16 23:31   ` Tobias Burnus

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=4DF9CF42.8030501@gmail.com \
    --to=dcarrera@gmail.com \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    /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).