Explorar o código

fixed parallel greedy

Andra Hugo %!s(int64=13) %!d(string=hai) anos
pai
achega
b5d4d28425
Modificáronse 1 ficheiros con 24 adicións e 17 borrados
  1. 24 17
      src/sched_policies/parallel_greedy.c

+ 24 - 17
src/sched_policies/parallel_greedy.c

@@ -29,6 +29,9 @@ typedef struct pgreedy_data {
 
 	pthread_cond_t sched_cond;
 	pthread_mutex_t sched_mutex;
+
+	pthread_cond_t master_sched_cond[STARPU_NMAXWORKERS];
+	pthread_mutex_t master_sched_mutex[STARPU_NMAXWORKERS];
 } pgreedy_data;
 
 /* XXX instead of 10, we should use some "MAX combination .."*/
@@ -95,6 +98,13 @@ static void pgreedy_add_workers(unsigned sched_ctx_id, int *workerids, unsigned
 	for(i = 0; i < nworkers; i++)
         {
 		workerid = workerids[i];
+		_STARPU_PTHREAD_MUTEX_INIT(&data->master_sched_mutex[workerid], NULL);
+		_STARPU_PTHREAD_COND_INIT(&data->master_sched_cond[workerid], NULL);
+	}
+
+	for(i = 0; i < nworkers; i++)
+        {
+		workerid = workerids[i];
 
 		/* slaves pick up tasks from their local queue, their master
 		 * will put tasks directly in that local list when a parallel
@@ -107,7 +117,7 @@ static void pgreedy_add_workers(unsigned sched_ctx_id, int *workerids, unsigned
 		if (workerid == master)
 			starpu_worker_set_sched_condition(sched_ctx_id, workerid, &data->sched_mutex, &data->sched_cond);
 		else
-			starpu_worker_init_sched_condition(sched_ctx_id, workerid);
+			starpu_worker_set_sched_condition(sched_ctx_id, workerid, &data->master_sched_mutex[master], &data->master_sched_cond[master]);
 	}
 
 #if 0
@@ -130,10 +140,9 @@ static void pgreedy_remove_workers(unsigned sched_ctx_id, int *workerids, unsign
 		workerid = workerids[i];
 		_starpu_destroy_fifo(data->local_fifo[workerid]);
 		unsigned master = data->master_id[workerid];
-		if(workerid != master)
-			starpu_worker_deinit_sched_condition(sched_ctx_id, workerid);
-		else
-			starpu_worker_set_sched_condition(sched_ctx_id, workerid, NULL, NULL);
+		starpu_worker_set_sched_condition(sched_ctx_id, workerid, NULL, NULL);
+		_STARPU_PTHREAD_MUTEX_DESTROY(&data->master_sched_mutex[workerid]);
+		_STARPU_PTHREAD_COND_DESTROY(&data->master_sched_cond[workerid]);
 	}
 }
 
@@ -172,21 +181,21 @@ static int push_task_pgreedy_policy(struct starpu_task *task)
 	unsigned sched_ctx_id = task->sched_ctx;
 	pthread_mutex_t *changing_ctx_mutex = starpu_get_changing_ctx_mutex(sched_ctx_id);
 	unsigned nworkers;
-    int ret_val = -1;
+	int ret_val = -1;
 
 	/* if the context has no workers return */
-    _STARPU_PTHREAD_MUTEX_LOCK(changing_ctx_mutex);
-    nworkers = starpu_get_nworkers_of_sched_ctx(sched_ctx_id);
+	_STARPU_PTHREAD_MUTEX_LOCK(changing_ctx_mutex);
+	nworkers = starpu_get_nworkers_of_sched_ctx(sched_ctx_id);
+
    	if(nworkers == 0)
-    {
+	{
    		_STARPU_PTHREAD_MUTEX_UNLOCK(changing_ctx_mutex);
-        return ret_val;
-    }
+		return ret_val;
+	}
 	struct pgreedy_data *data = (struct pgreedy_data*)starpu_get_sched_ctx_policy_data(sched_ctx_id);
-
 	ret_val = _starpu_fifo_push_task(data->fifo, &data->sched_mutex, &data->sched_cond, task);
 	_STARPU_PTHREAD_MUTEX_UNLOCK(changing_ctx_mutex);
-
+	
 	return ret_val;
 }
 
@@ -267,11 +276,9 @@ static struct starpu_task *pop_task_pgreedy_policy(unsigned sched_ctx_id)
 				struct starpu_task *alias = _starpu_create_task_alias(task);
 				int local_worker = combined_workerid[i];
 
-				pthread_mutex_t *sched_mutex;
-				pthread_cond_t *sched_cond;
-				starpu_worker_get_sched_condition(sched_ctx_id, master, &sched_mutex, &sched_cond);
 				_starpu_fifo_push_task(data->local_fifo[local_worker],
-						       sched_mutex, sched_cond, alias);
+						       &data->master_sched_mutex[master], 
+						       &data->master_sched_cond[master], alias);
 			}
 
 			/* The master also manipulated an alias */