Andra Hugo пре 13 година
родитељ
комит
e7b1de9441

+ 1 - 0
sched_ctx_hypervisor/include/sched_ctx_hypervisor.h

@@ -8,6 +8,7 @@
 #define HYPERVISOR_MIN_PROCS 4
 #define HYPERVISOR_MAX_PROCS 5
 #define HYPERVISOR_GRANULARITY 6
+#define HYPERVISOR_FIXED_PROCS 7
 
 struct starpu_sched_ctx_hypervisor_criteria* sched_ctx_hypervisor_init(int type);
 

+ 12 - 11
sched_ctx_hypervisor/src/sched_ctx_hypervisor.c

@@ -30,7 +30,7 @@ struct starpu_sched_ctx_hypervisor_criteria* sched_ctx_hypervisor_init(int type)
 	int i;
 	for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++)
 	{
-		hypervisor.sched_ctxs[i] = -1;
+		hypervisor.sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS;
 		hypervisor.sched_ctx_w[i].sched_ctx = STARPU_NMAX_SCHED_CTXS;
 		hypervisor.sched_ctx_w[i].data = NULL;
 		int j;
@@ -65,29 +65,29 @@ static int _get_first_free_sched_ctx(int *sched_ctxs, unsigned nsched_ctxs)
 {
         int i;
         for(i = 0; i < nsched_ctxs; i++)
-                if(sched_ctxs[i] == -1)
+                if(sched_ctxs[i] == STARPU_NMAX_SCHED_CTXS)
                         return i;
 
-        return -1;
+        return STARPU_NMAX_SCHED_CTXS;
 }
 
-/* rearange array of sched_ctxs in order not to have {-1, -1, 5, -1, 7}    
-   and have instead {5, 7, -1, -1, -1}                                    
+/* rearange array of sched_ctxs in order not to have {MAXVAL, MAXVAL, 5, MAXVAL, 7}    
+   and have instead {5, 7, MAXVAL, MAXVAL, MAXVAL}                                    
    it is easier afterwards to iterate the array                           
 */
 static void _rearange_sched_ctxs(int *sched_ctxs, int old_nsched_ctxs)
 {
-        int first_free_id = -1;
+        int first_free_id = STARPU_NMAX_SCHED_CTXS;
         int i;
         for(i = 0; i < old_nsched_ctxs; i++)
         {
-                if(sched_ctxs[i] != -1)
+                if(sched_ctxs[i] != STARPU_NMAX_SCHED_CTXS)
                 {
                         first_free_id = _get_first_free_sched_ctx(sched_ctxs, old_nsched_ctxs);
-                        if(first_free_id != -1)
+                        if(first_free_id != STARPU_NMAX_SCHED_CTXS)
 			{
                                 sched_ctxs[first_free_id] = sched_ctxs[i];
-				sched_ctxs[i] = -1;
+				sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS;
 			}
                 }
 	}
@@ -100,7 +100,7 @@ void sched_ctx_hypervisor_ignore_ctx(unsigned sched_ctx)
         {
                 if(hypervisor.sched_ctxs[i] == sched_ctx)
                 {
-                        hypervisor.sched_ctxs[i] = -1;
+                        hypervisor.sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS;
 			break;
                 }
         }
@@ -132,7 +132,8 @@ void sched_ctx_hypervisor_ioctl(unsigned sched_ctx, ...)
 }
 
 static void _sched_ctx_hypervisor_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int* workers_to_move, unsigned nworkers_to_move)
-{	
+{
+	printf("resize ctx %d with %d\n", sender_sched_ctx, workers_to_move[0]);
 	starpu_remove_workers_from_sched_ctx(workers_to_move, nworkers_to_move, sender_sched_ctx);
 	starpu_add_workers_to_sched_ctx(workers_to_move, nworkers_to_move, receiver_sched_ctx);
 	

+ 19 - 21
src/core/sched_ctx.c

@@ -155,7 +155,7 @@ static void _starpu_add_workers_to_sched_ctx(struct starpu_sched_ctx *sched_ctx,
 		if(added_workers)
 		{
 			int worker = workers->add(workers, (workerids == NULL ? i : workerids[i]));
-			if(worker > 0)
+			if(worker >= 0)
 				added_workers[(*n_added_workers)++] = worker;		
 		}
 		else
@@ -186,7 +186,7 @@ static void _starpu_remove_workers_from_sched_ctx(struct starpu_sched_ctx *sched
 	for(i = 0; i < nworkers; i++)
 	{
 		int worker = workers->remove(workers, workerids[i]);
-		if(worker > 0)
+		if(worker >= 0)
 			removed_workers[(*n_removed_workers)++] = worker;
 	}
 					   
@@ -237,10 +237,11 @@ struct starpu_sched_ctx*  _starpu_create_sched_ctx(const char *policy_name, int
 	if(is_initial_sched)
 	{
 		int i;
-		for(i = 0; i < nworkers_ctx; i++)
+		for(i = 0; i < nworkers; i++)
 		{
-			struct starpu_worker_s *worker = _starpu_get_worker_struct(workerids[i]);
+			struct starpu_worker_s *worker = _starpu_get_worker_struct(i);
 			worker->sched_ctx[_starpu_worker_get_first_free_sched_ctx(worker)] = sched_ctx;
+			worker->nsched_ctxs++;
 		}
 	}
 	
@@ -288,29 +289,28 @@ static void free_sched_ctx_mem(struct starpu_sched_ctx *sched_ctx)
 
 }
 
-static void _starpu_manage_delete_sched_ctx(struct starpu_sched_ctx *sched_ctx)
-{
-	_starpu_update_workers(sched_ctx->workers->workerids, sched_ctx->workers->nworkers, sched_ctx->id, NULL);
-}
-
 void starpu_delete_sched_ctx(unsigned sched_ctx_id, unsigned inheritor_sched_ctx_id)
 {
 	struct starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
 	struct starpu_sched_ctx *inheritor_sched_ctx = _starpu_get_sched_ctx_struct(inheritor_sched_ctx_id);
-	_starpu_manage_delete_sched_ctx(sched_ctx);
+
+	PTHREAD_MUTEX_LOCK(&sched_ctx->changing_ctx_mutex);
+	_starpu_update_workers(sched_ctx->workers->workerids, sched_ctx->workers->nworkers, sched_ctx->id, NULL);
+	PTHREAD_MUTEX_UNLOCK(&sched_ctx->changing_ctx_mutex);
 
 	/*if both of them have all the ressources is pointless*/
 	/*trying to transfer ressources from one ctx to the other*/
 	struct starpu_machine_config_s *config = (struct starpu_machine_config_s *)_starpu_get_machine_config();
 	int nworkers = config->topology.nworkers;
-	
+
 	if(!(sched_ctx->workers->nworkers == nworkers && sched_ctx->workers->nworkers == inheritor_sched_ctx->workers->nworkers))
 		starpu_add_workers_to_sched_ctx(sched_ctx->workers->workerids, sched_ctx->workers->nworkers, inheritor_sched_ctx_id);
-
+	
 	if(!starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx_id))
 	{
 		free_sched_ctx_mem(sched_ctx);
 	}
+
 	return;	
 }
 
@@ -353,17 +353,16 @@ void starpu_add_workers_to_sched_ctx(int *workers_to_add, int nworkers_to_add,
 	int added_workers[nworkers_to_add];
 	int n_added_workers = 0;
 
-	PTHREAD_MUTEX_LOCK(&sched_ctx->changing_ctx_mutex);
-
 	STARPU_ASSERT(workers_to_add != NULL && nworkers_to_add > 0);
 	_starpu_check_workers(workers_to_add, nworkers_to_add);
 
+	PTHREAD_MUTEX_LOCK(&sched_ctx->changing_ctx_mutex);
 	_starpu_add_workers_to_sched_ctx(sched_ctx, workers_to_add, nworkers_to_add, added_workers, &n_added_workers);
+	PTHREAD_MUTEX_UNLOCK(&sched_ctx->changing_ctx_mutex);
 
 	if(n_added_workers > 0)
 		_starpu_update_workers(added_workers, n_added_workers, -1, sched_ctx);
        
-	PTHREAD_MUTEX_UNLOCK(&sched_ctx->changing_ctx_mutex);
 	return;
 }
 
@@ -374,20 +373,19 @@ void starpu_remove_workers_from_sched_ctx(int *workers_to_remove, int nworkers_t
 	int removed_workers[nworkers_to_remove];
 	int n_removed_workers = 0;
 
-	PTHREAD_MUTEX_LOCK(&sched_ctx->changing_ctx_mutex);
-
 	STARPU_ASSERT(workers_to_remove != NULL && nworkers_to_remove > 0);
 	_starpu_check_workers(workers_to_remove, nworkers_to_remove);
 
+	PTHREAD_MUTEX_LOCK(&sched_ctx->changing_ctx_mutex);
 	_starpu_remove_workers_from_sched_ctx(sched_ctx, workers_to_remove, nworkers_to_remove, removed_workers, &n_removed_workers);
-	
+	PTHREAD_MUTEX_UNLOCK(&sched_ctx->changing_ctx_mutex);	
 	if(n_removed_workers > 0)
 	{
-		sched_ctx->sched_policy->remove_workers(sched_ctx_id, removed_workers, n_removed_workers);
 		_starpu_update_workers(removed_workers, n_removed_workers, sched_ctx->id, NULL);
-	}
+		sched_ctx->sched_policy->remove_workers(sched_ctx_id, removed_workers, n_removed_workers);
+	} 
+
        
-	PTHREAD_MUTEX_UNLOCK(&sched_ctx->changing_ctx_mutex);
 	return;
 }
 

+ 1 - 1
src/core/sched_policy.c

@@ -350,7 +350,7 @@ struct starpu_task *_starpu_pop_task(struct starpu_worker_s *worker)
 		{
 			sched_ctx = worker->sched_ctx[i];
 			
-			if(sched_ctx != NULL)
+			if(sched_ctx != NULL && sched_ctx->id != STARPU_NMAX_SCHED_CTXS)
 			{
 				sched_ctx_mutex = _starpu_get_sched_mutex(sched_ctx, worker->workerid);
 				if(sched_ctx_mutex != NULL)

+ 9 - 6
src/worker_collection/worker_list.c

@@ -3,11 +3,11 @@
 
 static unsigned list_has_next(struct worker_collection *workers)
 {
-	unsigned nworkers = workers->nworkers;
+	int nworkers = (int)workers->nworkers;
 
 	int *cursor = (int*)pthread_getspecific(workers->cursor_key);
 
-	unsigned ret = *cursor < (nworkers - 1);
+	unsigned ret = *cursor < nworkers;
 
 	if(!ret) *cursor = 0;
 
@@ -17,13 +17,15 @@ static unsigned list_has_next(struct worker_collection *workers)
 static int list_get_next(struct worker_collection *workers)
 {
 	int *workerids = (int *)workers->workerids;
-	unsigned nworkers = workers->nworkers;
+	int nworkers = (int)workers->nworkers;
 
 	int *cursor = (int*)pthread_getspecific(workers->cursor_key);
 
-	STARPU_ASSERT(*cursor < (nworkers - 1));
+	STARPU_ASSERT(*cursor < nworkers);
 
-	return workerids[(*cursor)++];
+	int ret = workerids[(*cursor)++];
+
+	return ret;
 }
 
 static unsigned _worker_belongs_to_ctx(struct worker_collection *workers, int workerid)
@@ -50,7 +52,8 @@ static int list_add(struct worker_collection *workers, int worker)
 		workerids[(*nworkers)++] = worker;
 		return worker;
 	}
-	else return -1;
+	else 
+		return -1;
 }
 
 static int _get_first_free_worker(int *workerids, int nworkers)