Browse Source

Bug fixed for sched_ctx

Andra Hugo 14 years ago
parent
commit
05ae4af6bf

+ 1 - 0
include/starpu_util.h

@@ -179,6 +179,7 @@ int starpu_data_cpy(starpu_data_handle dst_handle, starpu_data_handle src_handle
 
 /* Wrapper to create a task. */
 void starpu_insert_task(starpu_codelet *cl, ...);
+void starpu_insert_task_to_ctx(struct starpu_sched_ctx *sched_ctx,starpu_codelet *cl, ...);
 
 /* Retrieve the arguments of type STARPU_VALUE associated to a task
  * automatically created using starpu_insert_task. */

+ 7 - 5
src/core/sched_policy.c

@@ -98,6 +98,7 @@ static void load_sched_policy(struct starpu_sched_policy_s *sched_policy, struct
 	policy->pop_task = sched_policy->pop_task;
         policy->post_exec_hook = sched_policy->post_exec_hook;
 	policy->pop_every_task = sched_policy->pop_every_task;
+	policy->push_task_notify = sched_policy->push_task_notify;
 	policy->policy_name = sched_policy->policy_name;
 }
 
@@ -244,8 +245,9 @@ static int _starpu_push_task_on_specific_worker(struct starpu_task *task, int wo
 
 	unsigned i;
 	for(i = 0; i < worker->nctxs; i++){
-		if (worker->sched_ctx[i]->sched_policy->push_task_notify)
+		if (worker->sched_ctx[i]->sched_policy->push_task_notify){
 			worker->sched_ctx[i]->sched_policy->push_task_notify(task, workerid);
+		}
 	}
 
 	if (is_basic_worker)
@@ -345,10 +347,10 @@ struct starpu_task *_starpu_pop_task(struct starpu_worker_s *worker)
 		  }
 	  }
 
-	if(task)
-	  {
-		printf("task %s poped by th %d for %d  with strateg %s\n", task->name, worker->workerid, worker->arch, task->sched_ctx->sched_policy->policy_name);
-	  }
+ 	/* if(task) */
+	/*   { */
+	/* 	printf("task poped by th %d for %d  with strateg %s\n", worker->workerid, worker->arch, task->sched_ctx->sched_policy->policy_name); */
+	/*   } */
 
 	/* Note that we may get a NULL task in case the scheduler was unlocked
 	 * for some reason. */

+ 1 - 1
src/drivers/cuda/driver_cuda.c

@@ -299,11 +299,11 @@ void *_starpu_cuda_worker(void *arg)
 
 		task = _starpu_pop_task(args);
 
-		if(task) printf("gpu is poping \n");
                 if (task == NULL) 
 		{
 			if (_starpu_worker_can_block(memnode))
 				_starpu_block_worker(workerid, sched_cond, sched_mutex);
+		  
 
 			PTHREAD_MUTEX_UNLOCK(sched_mutex);
 

+ 2 - 0
src/sched_policies/eager_central_policy.c

@@ -102,6 +102,7 @@ struct starpu_sched_policy_s _starpu_sched_eager_policy = {
 	.init_sched = initialize_eager_center_policy,
 	.deinit_sched = deinitialize_eager_center_policy,
 	.push_task = push_task_eager_policy,
+	.push_task_notify = NULL,
 	.push_prio_task = push_prio_task_eager_policy,
 	.pop_task = pop_task_eager_policy,
 	.post_exec_hook = NULL,
@@ -114,6 +115,7 @@ struct starpu_sched_policy_s _starpu_sched_no_prio_policy = {
 	.init_sched = initialize_eager_center_policy,
 	.deinit_sched = deinitialize_eager_center_policy,
 	.push_task = push_task_eager_policy,
+	.push_task_notify = NULL,
 	/* we use the same method in spite of the priority */
 	.push_prio_task = push_task_eager_policy,
 	.pop_task = pop_task_eager_policy,

+ 5 - 2
src/sched_policies/random_policy.c

@@ -20,7 +20,7 @@
 #include <core/workers.h>
 #include <sched_policies/fifo_queues.h>
 
-static unsigned nworkers;
+//static unsigned nworkers;
 
 static pthread_cond_t sched_cond[STARPU_NMAXWORKERS];
 static pthread_mutex_t sched_mutex[STARPU_NMAXWORKERS];
@@ -34,6 +34,8 @@ static int _random_push_task(struct starpu_task *task, unsigned prio, struct sta
 
 	double alpha_sum = 0.0;
 
+	unsigned nworkers = sched_ctx->nworkers_in_ctx;	
+
 	for (worker_in_ctx = 0; worker_in_ctx < nworkers; worker_in_ctx++)
 	{
                 worker = sched_ctx->workerid[worker_in_ctx];
@@ -82,7 +84,7 @@ static void initialize_random_policy(struct starpu_sched_ctx *sched_ctx)
 {
 	starpu_srand48(time(NULL));
 
-	nworkers = sched_ctx->nworkers_in_ctx;	
+	unsigned nworkers = sched_ctx->nworkers_in_ctx;	
 
 	unsigned workerid, workerid_ctx;
 	for (workerid_ctx = 0; workerid_ctx < nworkers; workerid_ctx++)
@@ -101,6 +103,7 @@ struct starpu_sched_policy_s _starpu_sched_random_policy = {
 	.deinit_sched = NULL,
 	.push_task = random_push_task,
 	.push_prio_task = random_push_prio_task,
+	.push_task_notify = NULL,
 	.pop_task = NULL,
 	.post_exec_hook = NULL,
 	.pop_every_task = NULL,

+ 19 - 0
src/util/starpu_insert_task.c

@@ -80,3 +80,22 @@ void starpu_insert_task(starpu_codelet *cl, ...)
         _starpu_insert_task_create_and_submit(arg_buffer, cl, &task, varg_list);
 
 }
+
+void starpu_insert_task_to_ctx(struct starpu_sched_ctx *sched_ctx, starpu_codelet *cl, ...)
+{
+	va_list varg_list;
+
+	/* Compute the size */
+	size_t arg_buffer_size = 0;
+	va_start(varg_list, cl);
+        arg_buffer_size = _starpu_insert_task_get_arg_size(varg_list);
+
+	va_start(varg_list, cl);
+	char *arg_buffer;
+	_starpu_pack_cl_args(arg_buffer_size, &arg_buffer, varg_list);
+
+	va_start(varg_list, cl);
+        struct starpu_task *task = starpu_task_create();
+        _starpu_insert_task_create_and_submit_to_ctx(arg_buffer, cl, &task, varg_list, sched_ctx);
+
+}

+ 18 - 3
src/util/starpu_insert_task_utils.c

@@ -131,8 +131,7 @@ int _starpu_pack_cl_args(size_t arg_buffer_size, char **arg_buffer, va_list varg
 	va_end(varg_list);
 	return 0;
 }
-
-int _starpu_insert_task_create_and_submit(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list) {
+static void _starpu_prepare_task(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list) {
         int arg_type;
 	unsigned current_buffer = 0;
 
@@ -194,7 +193,23 @@ int _starpu_insert_task_create_and_submit(char *arg_buffer, starpu_codelet *cl,
 	(*task)->callback_func = starpu_task_insert_callback_wrapper;
 	(*task)->callback_arg = cl_arg_wrapper;
 
-	int ret = starpu_task_submit(*task);
+}
+int _starpu_insert_task_create_and_submit(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list) {
+	 _starpu_prepare_task(arg_buffer, cl, task, varg_list);
+	
+	 int ret = starpu_task_submit(*task);
+
+	if (STARPU_UNLIKELY(ret == -ENODEV))
+          fprintf(stderr, "No one can execute task %p wih cl %p (symbol %s)\n", *task, (*task)->cl, ((*task)->cl->model && (*task)->cl->model->symbol)?(*task)->cl->model->symbol:"none");
+
+	STARPU_ASSERT(!ret);
+        return ret;
+}
+
+int _starpu_insert_task_create_and_submit_to_ctx(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list, struct starpu_sched_ctx *sched_ctx) {
+	 _starpu_prepare_task(arg_buffer, cl, task, varg_list);
+	
+	 int ret = starpu_task_submit_to_ctx(*task, sched_ctx);
 
 	if (STARPU_UNLIKELY(ret == -ENODEV))
           fprintf(stderr, "No one can execute task %p wih cl %p (symbol %s)\n", *task, (*task)->cl, ((*task)->cl->model && (*task)->cl->model->symbol)?(*task)->cl->model->symbol:"none");

+ 1 - 0
src/util/starpu_insert_task_utils.h

@@ -24,6 +24,7 @@
 size_t _starpu_insert_task_get_arg_size(va_list varg_list);
 int _starpu_pack_cl_args(size_t arg_buffer_size, char **arg_buffer, va_list varg_list);
 int _starpu_insert_task_create_and_submit(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list);
+int _starpu_insert_task_create_and_submit_to_ctx(char *arg_buffer, starpu_codelet *cl, struct starpu_task **task, va_list varg_list, struct starpu_sched_ctx *sched_ctx);
 
 #endif // __STARPU_INSERT_TASK_UTILS_H__