Browse Source

Add STARPU_MAX_MEMORY_USE environment variable

Samuel Thibault 9 years ago
parent
commit
add5790b43

+ 1 - 0
ChangeLog

@@ -185,6 +185,7 @@ Small features:
   * Add starpu_sleep.
   * Add starpu_task_list_ismember.
   * Add _starpu_fifo_pop_this_task.
+  * Add STARPU_MAX_MEMORY_USE environment variable.
 
 Changes:
   * Data interfaces (variable, vector, matrix and block) now define

+ 3 - 0
doc/doxygen/chapters/05check_list_performance.doxy

@@ -197,6 +197,9 @@ completed among the 10000 that were submitted when submission was blocked. Of
 course this may reduce parallelism if the threshold is set too low. The precise
 balance depends on the application task graph.
 
+An idea of how much memory is used for tasks and data handles can be obtained by
+setting the STARPU_MAX_MEMORY_USE environment variable to 1.
+
 \section HowtoReuseMemory How to reuse memory
 
 When your application needs to allocate more data than the available amount of

+ 8 - 0
doc/doxygen/chapters/40environment_variables.doxy

@@ -740,6 +740,14 @@ When set to 0, disable the display of memory statistics on data which
 have not been unregistered at the end of the execution (\ref MemoryFeedback).
 </dd>
 
+<dt>STARPU_MAX_MEMORY_USE</dt>
+<dd>
+\anchor STARPU_MAX_MEMORY_USE
+\addindex __env__STARPU_MAX_MEMORY_USE
+When set to 1, display at the end of the execution the maximum memory used by
+StarPU for internal data structures during execution.
+</dd>
+
 <dt>STARPU_BUS_STATS</dt>
 <dd>
 \anchor STARPU_BUS_STATS

+ 21 - 0
src/core/jobs.c

@@ -33,6 +33,8 @@
 
 /* we need to identify each task to generate the DAG. */
 static unsigned long job_cnt = 0;
+static int max_memory_use;
+static int njobs, maxnjobs;
 
 #ifdef STARPU_DEBUG
 /* List of all jobs, for debugging */
@@ -42,11 +44,21 @@ static starpu_pthread_mutex_t all_jobs_list_mutex = STARPU_PTHREAD_MUTEX_INITIAL
 
 void _starpu_job_init(void)
 {
+	max_memory_use = starpu_get_env_number_default("STARPU_MAX_MEMORY_USE", 0);
 #ifdef STARPU_DEBUG
 	_starpu_job_list_init(&all_jobs_list);
 #endif
 }
 
+void _starpu_job_fini(void)
+{
+	if (max_memory_use)
+	{
+		_STARPU_DISP("Memory used for tasks: %lu MiB\n", (unsigned long) (maxnjobs * (sizeof(struct starpu_task) + sizeof(struct _starpu_job))) >> 20);
+		STARPU_ASSERT(njobs == 0);
+	}
+}
+
 void _starpu_exclude_task_from_dag(struct starpu_task *task)
 {
 	struct _starpu_job *j = _starpu_get_job_associated_to_task(task);
@@ -92,6 +104,12 @@ struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_tas
 		}
 #endif
 	}
+	if (max_memory_use)
+	{
+		int jobs = STARPU_ATOMIC_ADDL(&njobs, 1);
+		if (jobs > maxnjobs)
+			maxnjobs = jobs;
+	}
 
 	_starpu_cg_list_init(&job->job_successors);
 
@@ -142,6 +160,9 @@ void _starpu_job_destroy(struct _starpu_job *j)
 	if (_starpu_graph_record)
 		_starpu_graph_drop_job(j);
 
+	if (max_memory_use)
+		(void) STARPU_ATOMIC_ADDL(&njobs, -1);
+
 	free(j);
 }
 

+ 1 - 0
src/core/jobs.h

@@ -286,6 +286,7 @@ struct _starpu_job {
 };
 
 void _starpu_job_init(void);
+void _starpu_job_fini(void);
 
 /* Create an internal struct _starpu_job *structure to encapsulate the task. */
 struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_task *task);

+ 2 - 0
src/core/workers.c

@@ -1523,6 +1523,8 @@ void starpu_shutdown(void)
 
 	_starpu_data_interface_shutdown();
 
+	_starpu_job_fini();
+
 	/* Drop all remaining tags */
 	_starpu_tag_clear();
 

+ 10 - 0
src/datawizard/interfaces/data_interface.c

@@ -39,6 +39,7 @@ struct handle_entry
 };
 
 /* Hash table mapping host pointers to data handles.  */
+static int nregistered, maxnregistered;
 static struct handle_entry *registered_handles;
 static struct _starpu_spinlock    registered_handles_lock;
 static int _data_interface_number = STARPU_MAX_INTERFACE_ID;
@@ -69,9 +70,14 @@ void _starpu_data_interface_shutdown()
 	HASH_ITER(hh, registered_handles, entry, tmp)
 	{
 		HASH_DEL(registered_handles, entry);
+		nregistered--;
 		free(entry);
 	}
 
+	if (starpu_get_env_number_default("STARPU_MAX_MEMORY_USE", 0))
+		_STARPU_DISP("Memory used for data handles: %lu MiB\n", (unsigned long) (maxnregistered * sizeof(struct _starpu_data_state)) >> 20);
+
+	STARPU_ASSERT(nregistered == 0);
 	registered_handles = NULL;
 }
 
@@ -169,6 +175,9 @@ void _starpu_data_register_ram_pointer(starpu_data_handle_t handle, void *ptr)
 #endif
 	{
 		_starpu_spin_lock(&registered_handles_lock);
+		nregistered++;
+		if (nregistered > maxnregistered)
+			maxnregistered = nregistered;
 		HASH_ADD_PTR(registered_handles, pointer, entry);
 		_starpu_spin_unlock(&registered_handles_lock);
 	}
@@ -533,6 +542,7 @@ void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle)
 			_starpu_spin_lock(&registered_handles_lock);
 			HASH_FIND_PTR(registered_handles, &ram_ptr, entry);
 			STARPU_ASSERT(entry != NULL);
+			nregistered--;
 			HASH_DEL(registered_handles, entry);
 			_starpu_spin_unlock(&registered_handles_lock);
 		}