Kaynağa Gözat

- merge trunk

Olivier Aumage 11 yıl önce
ebeveyn
işleme
c9029780f2

+ 14 - 0
examples/callback/prologue.c

@@ -17,6 +17,7 @@
 
 #include <starpu.h>
 #include <sys/time.h>
+#include <omp.h>
 
 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0)
 
@@ -27,6 +28,7 @@ void cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args)
 	int *val = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
 
 	*val += 1;
+	printf("task executing \n");
 }
 
 struct starpu_codelet cl =
@@ -55,6 +57,12 @@ void prologue_callback_func(void *callback_arg)
 	printf("x = %lf\n", *x);
 }
 
+void pop_prologue_callback_func(void *args)
+{
+	unsigned val = (unsigned) args;
+	printf("pop_prologue_callback val %d \n", val);
+}
+
 
 int main(int argc, char **argv)
 {
@@ -72,6 +80,10 @@ int main(int argc, char **argv)
 	task->cl = &cl;
 	task->prologue_callback_func = callback_func;
 	task->prologue_callback_arg = NULL;
+
+	task->prologue_callback_pop_func = pop_prologue_callback_func;
+	task->prologue_callback_pop_arg = (void*) 5;
+
 	task->handles[0] = handle;
 
 	ret = starpu_task_submit(task);
@@ -84,6 +96,8 @@ int main(int argc, char **argv)
 				      STARPU_RW, handle,
 				      STARPU_PROLOGUE_CALLBACK, prologue_callback_func,
 				      STARPU_PROLOGUE_CALLBACK_ARG, x,
+				      STARPU_PROLOGUE_CALLBACK_POP, pop_prologue_callback_func,
+				      STARPU_PROLOGUE_CALLBACK_POP_ARG, 5,
 				      0);
 
 

+ 5 - 0
include/starpu_task.h

@@ -142,6 +142,11 @@ struct starpu_task
 	/* must StarPU release prologue_callback_arg ? - 0 by default */
 	unsigned prologue_callback_arg_free;
 
+	void (*prologue_callback_pop_func)(void *);
+	void *prologue_callback_pop_arg;
+	/* must StarPU release prologue_callback_pop_arg ? - 0 by default */
+	unsigned prologue_callback_pop_arg_free;
+
 	unsigned use_tag;
 	starpu_tag_t tag_id;
 

+ 17 - 15
include/starpu_task_util.h

@@ -32,21 +32,23 @@ extern "C"
 
 void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg);
 
-#define STARPU_VALUE		 (1<<16)
-#define STARPU_CALLBACK		 (2<<16)
-#define STARPU_CALLBACK_WITH_ARG (3<<16)
-#define STARPU_CALLBACK_ARG	 (4<<16)
-#define STARPU_PRIORITY		 (5<<16)
-#define STARPU_EXECUTE_ON_NODE	 (6<<16)
-#define STARPU_EXECUTE_ON_DATA	 (7<<16)
-#define STARPU_DATA_ARRAY        (8<<16)
-#define STARPU_TAG               (9<<16)
-#define STARPU_HYPERVISOR_TAG	 (10<<16)
-#define STARPU_FLOPS	         (11<<16)
-#define STARPU_SCHED_CTX	 (12<<16)
-#define STARPU_PROLOGUE_CALLBACK   (13<<16)
-#define STARPU_PROLOGUE_CALLBACK_ARG (14<<16)
-#define STARPU_EXECUTE_ON_WORKER (15<<16)
+#define STARPU_VALUE		 (1<<18)
+#define STARPU_CALLBACK		 (2<<18)
+#define STARPU_CALLBACK_WITH_ARG (3<<18)
+#define STARPU_CALLBACK_ARG	 (4<<18)
+#define STARPU_PRIORITY		 (5<<18)
+#define STARPU_EXECUTE_ON_NODE	 (6<<18)
+#define STARPU_EXECUTE_ON_DATA	 (7<<18)
+#define STARPU_DATA_ARRAY        (8<<18)
+#define STARPU_TAG               (9<<18)
+#define STARPU_HYPERVISOR_TAG	 (10<<18)
+#define STARPU_FLOPS	         (11<<18)
+#define STARPU_SCHED_CTX	 (12<<18)
+#define STARPU_PROLOGUE_CALLBACK   (13<<18)
+#define STARPU_PROLOGUE_CALLBACK_ARG (14<<18)
+#define STARPU_PROLOGUE_CALLBACK_POP   (15<<18)
+#define STARPU_PROLOGUE_CALLBACK_POP_ARG (16<<18)
+#define STARPU_EXECUTE_ON_WORKER (17<<18)
 
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
 int starpu_task_insert(struct starpu_codelet *cl, ...);

+ 8 - 5
src/core/sched_ctx.c

@@ -1645,7 +1645,7 @@ void* starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void* param, uns
 {
 	int *workerids;
 	int nworkers = starpu_sched_ctx_get_workers_list(sched_ctx_id, &workerids);
-	int master = starpu_sched_ctx_book_workers_for_task(sched_ctx_id, workerids, nworkers);
+	_starpu_sched_ctx_get_workers_to_sleep(sched_ctx_id, workerids, nworkers, -1);
 
 	/* bind current thread on all workers of the context */
 	_starpu_sched_ctx_bind_thread_to_ctx_cpus(sched_ctx_id);
@@ -1654,7 +1654,7 @@ void* starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void* param, uns
 	void* ret = func(param);
 
 	/* wake up starpu workers */
-	starpu_sched_ctx_unbook_workers_for_task(sched_ctx_id, master);
+	_starpu_sched_ctx_wake_up_workers(sched_ctx_id, -1);
 
 	return ret;
 }
@@ -1697,9 +1697,12 @@ int starpu_sched_ctx_book_workers_for_task(unsigned sched_ctx_id, int *workerids
 	{
 		if(current_worker_id == -1)
 		{
-			final_workerids[nfinal_workerids++] = workerids[w];
-			if(nfinal_workerids == nworkers)
-				master = workerids[nfinal_workerids-1];
+			final_workerids[nfinal_workerids++] = workerids[w];                          
+			if(nfinal_workerids == nworkers - 1)                         
+			{
+				master = workerids[nfinal_workerids];  
+				break;  
+			}
 		}
 		else
 		{

+ 3 - 0
src/core/sched_policy.c

@@ -839,6 +839,9 @@ profiling:
 		}
 	}
 
+	if(task->prologue_callback_pop_func)
+		task->prologue_callback_pop_func(task->prologue_callback_pop_arg);
+
 	return task;
 }
 

+ 4 - 0
src/core/task.c

@@ -171,6 +171,10 @@ void _starpu_task_destroy(struct starpu_task *task)
 		if (task->prologue_callback_arg_free)
 			free(task->prologue_callback_arg);
 
+		/* Does user want StarPU release prologue_pop_arg ? */
+		if (task->prologue_callback_pop_arg_free)
+			free(task->prologue_callback_pop_arg);
+
 		free(task);
 	}
 }

+ 36 - 1
src/util/starpu_task_insert_utils.c

@@ -86,7 +86,14 @@ size_t _starpu_task_insert_get_arg_size(va_list varg_list)
 		{
 			(void)va_arg(varg_list, void *);
 		}
-
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
+		{
+			(void)va_arg(varg_list, _starpu_callback_func_t);
+		}
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
+		{
+			(void)va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG)
 		{
 			(void)va_arg(varg_list, void *);
@@ -194,6 +201,14 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 		{
 			(void)va_arg(varg_list, void *);
 		}
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
+		{
+			va_arg(varg_list, _starpu_callback_func_t);
+		}
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
+		{
+			(void)va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_PRIORITY)
 		{
 			(void)va_arg(varg_list, int);
@@ -261,6 +276,11 @@ void _starpu_task_insert_create(void *arg_buffer, size_t arg_buffer_size, struct
 
 	prologue_cl_arg_wrapper->callback_func = NULL;
 
+	struct task_insert_cb_wrapper *prologue_pop_cl_arg_wrapper = (struct task_insert_cb_wrapper *) malloc(sizeof(struct task_insert_cb_wrapper));
+	STARPU_ASSERT(prologue_pop_cl_arg_wrapper);
+
+	prologue_pop_cl_arg_wrapper->callback_func = NULL;
+
 	while((arg_type = va_arg(varg_list, int)) != 0)
 	{
 		if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_SCRATCH || arg_type & STARPU_REDUX)
@@ -341,6 +361,17 @@ void _starpu_task_insert_create(void *arg_buffer, size_t arg_buffer_size, struct
 			void *callback_arg = va_arg(varg_list, void *);
 			prologue_cl_arg_wrapper->callback_arg = callback_arg;
 		}
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
+		{
+			void (*callback_func)(void *);
+			callback_func = va_arg(varg_list, _starpu_callback_func_t);
+			prologue_pop_cl_arg_wrapper->callback_func = callback_func;
+		}
+		else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
+		{
+			void *callback_arg = va_arg(varg_list, void *);
+			prologue_pop_cl_arg_wrapper->callback_arg = callback_arg;
+		}
 		else if (arg_type==STARPU_PRIORITY)
 		{
 			/* Followed by a priority level */
@@ -406,4 +437,8 @@ void _starpu_task_insert_create(void *arg_buffer, size_t arg_buffer_size, struct
 	(*task)->prologue_callback_func = starpu_task_insert_callback_wrapper;
 	(*task)->prologue_callback_arg = prologue_cl_arg_wrapper;
 	(*task)->prologue_callback_arg_free = 1;
+
+	(*task)->prologue_callback_pop_func = starpu_task_insert_callback_wrapper;
+	(*task)->prologue_callback_pop_arg = prologue_pop_cl_arg_wrapper;
+	(*task)->prologue_callback_pop_arg_free = 1;
 }

+ 2 - 2
tools/starpu_paje_draw_histogram.in

@@ -109,8 +109,8 @@ for file in $inputfiles; do
 	exit 5
     fi
 # Sorting traces
-    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\|8\)\>\)\)' $file > start.trace
-    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\|8\)\>\)\)' -v $file > end.trace
+    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace
+    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace
     sort -s -V --key=2,2 end.trace > endSorted.trace
     if grep -q start_profiling endSorted.trace
     then

+ 2 - 2
tools/starpu_paje_state_stats.in

@@ -110,8 +110,8 @@ for file in $inputfiles; do
 	exit 5
     fi
 # Sorting traces
-    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\|8\)\>\)\)' $file > start.trace
-    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\|8\)\>\)\)' -v $file > end.trace
+    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace
+    grep -e '^\(\(%\)\|\(\(1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace
     sort -s -V --key=2,2 end.trace > endSorted.trace
     if grep -q start_profiling endSorted.trace
     then