Explorar o código

- add Valgrind support for OpenMP stacks

Olivier Aumage %!s(int64=10) %!d(string=hai) anos
pai
achega
5feb89677f
Modificáronse 3 ficheiros con 20 adicións e 0 borrados
  1. 6 0
      src/common/utils.h
  2. 5 0
      src/util/openmp_runtime_support.c
  3. 9 0
      src/util/openmp_runtime_support.h

+ 6 - 0
src/common/utils.h

@@ -51,6 +51,12 @@
 #ifndef VALGRIND_HG_ENABLE_CHECKING
 #define VALGRIND_HG_ENABLE_CHECKING(start, len) ((void)0)
 #endif
+#ifndef VALGRIND_STACK_REGISTER
+#define VALGRIND_STACK_REGISTER(stackbottom, stacktop) ((void)0)
+#endif
+#ifndef VALGRIND_STACK_DEREGISTER
+#define VALGRIND_STACK_DEREGISTER(stackbottom) ((void)0)
+#endif
 #ifndef RUNNING_ON_VALGRIND
 #define RUNNING_ON_VALGRIND 0
 #endif

+ 5 - 0
src/util/openmp_runtime_support.c

@@ -410,6 +410,7 @@ static void starpu_omp_implicit_task_exec(void *buffers[], void *cl_arg)
 		task->ctx.uc_link                 = NULL;
 		task->ctx.uc_stack.ss_sp          = task->stack;
 		task->ctx.uc_stack.ss_size        = task->stacksize;
+		task->stack_vg_id                 = VALGRIND_STACK_REGISTER(task->stack, task->stack+task->stacksize);
 		makecontext(&task->ctx, (void (*) ()) starpu_omp_implicit_task_entry, 1, task);
 	}
 
@@ -431,6 +432,8 @@ static void starpu_omp_implicit_task_exec(void *buffers[], void *cl_arg)
 	{
 		task->starpu_task->omp_task = NULL;
 		task->starpu_task = NULL;
+		VALGRIND_STACK_DEREGISTER(task->stack_vg_id);
+		task->stack_vg_id = 0;
 		free(task->stack);
 		task->stack = NULL;
 		memset(&task->ctx, 0, sizeof(task->ctx));
@@ -656,6 +659,7 @@ static void omp_initial_thread_setup(void)
 	initial_thread->ctx.uc_link          = NULL;
 	initial_thread->ctx.uc_stack.ss_sp   = initial_thread->initial_thread_stack;
 	initial_thread->ctx.uc_stack.ss_size = _STARPU_INITIAL_THREAD_STACKSIZE;
+	initial_thread->initial_thread_stack_vg_id = VALGRIND_STACK_REGISTER(initial_thread->initial_thread_stack, initial_thread->initial_thread_stack+_STARPU_INITIAL_THREAD_STACKSIZE);
 	makecontext(&initial_thread->ctx, omp_initial_thread_func, 0);
 	/* .starpu_driver */
 	/*
@@ -699,6 +703,7 @@ static void omp_initial_thread_exit()
 	free(_global_state.starpu_cpu_worker_ids);
 	_global_state.starpu_cpu_worker_ids = NULL;
 	_global_state.nb_starpu_cpu_workers = 0;
+	VALGRIND_STACK_DEREGISTER(initial_thread->initial_thread_stack_vg_id);
 	free(initial_thread->initial_thread_stack);
 	initial_thread->initial_thread_stack = NULL;
 	memset(&initial_thread->ctx, 0, sizeof (initial_thread->ctx));

+ 9 - 0
src/util/openmp_runtime_support.h

@@ -248,6 +248,11 @@ LIST_TYPE(starpu_omp_task,
 	 */
 	void *stack;
 
+	/*
+	 * Valgrind stack id
+	 */
+	int stack_vg_id;
+
 	size_t stacksize;
 )
 
@@ -263,6 +268,10 @@ LIST_TYPE(starpu_omp_thread,
 	 * note: should not be used for other threads
 	 */
 	void *initial_thread_stack;
+	/*
+	 * Valgrind stack id
+	 */
+	int initial_thread_stack_vg_id;
 
 	/*
 	 * context to store the 'scheduler' state of the thread,