Преглед на файлове

examples/stencil: free allocated memory and release data

Nathalie Furmento преди 11 години
родител
ревизия
d5f831018b
променени са 4 файла, в които са добавени 56 реда и са изтрити 0 реда
  1. 42 0
      examples/stencil/stencil-blocks.c
  2. 7 0
      examples/stencil/stencil-tasks.c
  3. 6 0
      examples/stencil/stencil.c
  4. 1 0
      examples/stencil/stencil.h

+ 42 - 0
examples/stencil/stencil-blocks.c

@@ -265,6 +265,12 @@ static void allocate_block_on_node(starpu_data_handle_t *handleptr, TYPE **ptr,
 	starpu_block_data_register(handleptr, STARPU_MAIN_RAM, (uintptr_t)*ptr, nx, nx*ny, nx, ny, nz, sizeof(TYPE));
 }
 
+static void free_block_on_node(starpu_data_handle_t handleptr)
+{
+	starpu_free((void *)starpu_block_get_local_ptr(handleptr));
+	starpu_data_unregister(handleptr);
+}
+
 void display_memory_consumption(int rank)
 {
 	FPRINTF(stderr, "%lu B of memory were allocated on node %d\n", allocated, rank);
@@ -322,6 +328,42 @@ void allocate_memory_on_node(int rank)
 	}
 }
 
+void free_memory_on_node(int rank)
+{
+	unsigned bz;
+	for (bz = 0; bz < nbz; bz++)
+	{
+		struct block_description *block = get_block_description(bz);
+
+		int node = block->mpi_node;
+
+		unsigned size_bz = block_sizes_z[bz];
+
+		/* Main blocks */
+		if (node == rank)
+		{
+			free_block_on_node(block->layers_handle[0]);
+			free_block_on_node(block->layers_handle[1]);
+		}
+
+		/* Boundary blocks : Top */
+		int top_node = block->boundary_blocks[T]->mpi_node;
+		if ((node == rank) || (top_node == rank))
+		{
+			free_block_on_node(block->boundaries_handle[T][0]);
+			free_block_on_node(block->boundaries_handle[T][1]);
+		}
+
+		/* Boundary blocks : Bottom */
+		int bottom_node = block->boundary_blocks[B]->mpi_node;
+		if ((node == rank) || (bottom_node == rank))
+		{
+			free_block_on_node(block->boundaries_handle[B][0]);
+			free_block_on_node(block->boundaries_handle[B][1]);
+		}
+	}
+}
+
 /* check how many cells are alive */
 void check(int rank)
 {

+ 7 - 0
examples/stencil/stencil-tasks.c

@@ -308,6 +308,13 @@ void wait_end_tasks(int rank)
 			struct block_description *block = get_block_description(bz);
 			starpu_data_acquire(block->layers_handle[0], STARPU_R);
 			starpu_data_acquire(block->layers_handle[1], STARPU_R);
+			/* the data_acquire here is done to make sure
+			 * the data is sent back to the ram memory, we
+			 * can safely do a data_release, to avoid the
+			 * data_unregister to block later on
+			 */
+			starpu_data_release(block->layers_handle[0]);
+			starpu_data_release(block->layers_handle[1]);
 		}
 	}
 }

+ 6 - 0
examples/stencil/stencil.c

@@ -152,6 +152,11 @@ static void init_problem(int argc, char **argv, int rank, int world_size)
 	last_tick = (struct timeval *) calloc(nbz, sizeof(*last_tick));
 }
 
+static void free_problem(int rank)
+{
+     	free_memory_on_node(rank);
+}
+
 /*
  *	Main body
  */
@@ -353,6 +358,7 @@ int main(int argc, char **argv)
 		FPRINTF(stdout, "\tAVG : %f ms\n", sum_timing/(world_size*1000));
 	}
 
+	free_problem(rank);
 	starpu_shutdown();
 
 #ifdef STARPU_USE_MPI

+ 1 - 0
examples/stencil/stencil.h

@@ -100,6 +100,7 @@ void assign_blocks_to_workers(int rank);
 void create_tasks(int rank);
 void wait_end_tasks(int rank);
 void check(int rank);
+void free_memory_on_node(int rank);
 
 void display_memory_consumption(int rank);