瀏覽代碼

bug fix in bitmap.c
node_heft.c

make sure that nodes are initialized only once

Simon Archipoff 12 年之前
父節點
當前提交
5ce769b9e1

+ 2 - 1
src/sched_policies/bitmap.c

@@ -104,7 +104,8 @@ void starpu_bitmap_or(struct starpu_bitmap * a, struct starpu_bitmap * b)
 	if(a->size < b->size)
 	{
 		a->bits = realloc(a->bits, b->size * sizeof(unsigned long));
-		a->size = b->size;
+		memset(a->bits + a->size, 0, (b->size - a->size) * sizeof(unsigned long));		a->size = b->size;
+
 	}
 	int i;
 	for(i = 0; i < b->size; i++)

+ 1 - 5
src/sched_policies/node_composed.c

@@ -115,10 +115,6 @@ double composed_node_estimated_load(struct starpu_sched_node * node)
 }
 
 
-static void invalid_second_init_data(struct starpu_sched_node * node STARPU_ATTRIBUTE_UNUSED)
-{
-	STARPU_ABORT();
-}
 
 void composed_node_init_data(struct starpu_sched_node *node)
 {
@@ -132,7 +128,7 @@ void composed_node_init_data(struct starpu_sched_node *node)
 	c->bottom->nchilds = node->nchilds;
 	c->bottom->childs = node->childs;
 
-	node->init_data = invalid_second_init_data;
+	node->init_data = NULL;
 }
 
 void composed_node_deinit_data(struct starpu_sched_node * _node)

+ 2 - 1
src/sched_policies/node_fifo.c

@@ -153,6 +153,7 @@ void init_fifo_data(struct starpu_sched_node * node)
 	_starpu_prio_deque_init(&data->fifo);
 	STARPU_PTHREAD_MUTEX_INIT(&data->mutex,NULL);
 	node->data = data;
+	node->init_data = NULL;
 }
 void deinit_fifo_data(struct starpu_sched_node * node)
 {
@@ -165,7 +166,7 @@ void deinit_fifo_data(struct starpu_sched_node * node)
 
 int starpu_sched_node_is_fifo(struct starpu_sched_node * node)
 {
-	return node->init_data == init_fifo_data;
+	return node->deinit_data == deinit_fifo_data;
 }
 
 struct starpu_sched_node * starpu_sched_node_fifo_create(void * arg STARPU_ATTRIBUTE_UNUSED)

+ 4 - 2
src/sched_policies/node_heft.c

@@ -147,7 +147,7 @@ void init_heft_data(struct starpu_sched_node *node)
 	data->idle_power = idle_power;
 
 	node->data = data;
-
+	node->init_data = NULL;
 }
 
 
@@ -171,7 +171,7 @@ struct starpu_sched_node * starpu_sched_node_heft_create(struct starpu_heft_data
 
 int starpu_sched_node_is_heft(struct starpu_sched_node * node)
 {
-	return node->init_data == init_heft_data;
+	return node->deinit_data == deinit_heft_data;
 }
 
 
@@ -213,6 +213,8 @@ static void initialize_heft_center_policy(unsigned sched_ctx_id)
 	starpu_sched_tree_call_init_data(t);
 	starpu_bitmap_destroy(random->workers_in_ctx);
 	random->workers_in_ctx = t->root->workers_in_ctx;
+	if(random->init_data)
+		random->init_data(random);
 	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
 }
 

+ 2 - 1
src/sched_policies/node_random.c

@@ -36,6 +36,7 @@ static void init_data_random(struct starpu_sched_node * node)
 	int i;
 	for(i = 0; i < node->nchilds; i++)
 		rd->relative_speedup[i] = compute_relative_speedup(node->childs[i]);
+	node->init_data = NULL;
 }
 
 static void deinit_data_random(struct starpu_sched_node * node)
@@ -106,7 +107,7 @@ struct starpu_sched_node * starpu_sched_node_random_create(void * arg STARPU_ATT
 
 int starpu_sched_node_is_random(struct starpu_sched_node *node)
 {
-	return node->init_data == init_data_random;
+	return node->deinit_data == deinit_data_random;
 }
 
 

+ 2 - 1
src/sched_policies/node_sched.c

@@ -412,6 +412,7 @@ void starpu_sched_node_destroy(struct starpu_sched_node *node)
 	}
 	free(node->childs);
 	starpu_bitmap_destroy(node->workers);
+	starpu_bitmap_destroy(node->workers_in_ctx);
 	free(node);
 }
 
@@ -470,7 +471,7 @@ static void helper_starpu_call_init_data(struct starpu_sched_node *node)
 	int i;
 	for(i = 0; i < node->nchilds; i++)
 		helper_starpu_call_init_data(node->childs[i]);
-	if(!node->data)
+	if(node->init_data)
 		node->init_data(node);
 }
 

+ 2 - 1
src/sched_policies/node_work_stealing.c

@@ -211,6 +211,7 @@ static void init_ws_data(struct starpu_sched_node *node)
 		_starpu_prio_deque_init(wsd->fifos + i);
 		STARPU_PTHREAD_MUTEX_INIT(wsd->mutexes + i, NULL);
 	}
+	node->init_data = NULL;
 }
 
 static void deinit_ws_data(struct starpu_sched_node *node)
@@ -241,7 +242,7 @@ struct starpu_sched_node * starpu_sched_node_work_stealing_create(void)
 
 int starpu_sched_node_is_work_stealing(struct starpu_sched_node * node)
 {
-	return node->init_data == init_ws_data;
+	return node->deinit_data == deinit_ws_data;
 }
 
 

+ 1 - 0
src/sched_policies/node_worker.c

@@ -627,6 +627,7 @@ static struct starpu_sched_node  * starpu_sched_node_combined_worker_create(int
 	node->deinit_data = worker_deinit_data;
 	node->workers = starpu_bitmap_create();
 	starpu_bitmap_set(node->workers, workerid);
+	starpu_bitmap_or(node->workers_in_ctx, node->workers);
 	_worker_nodes[workerid] = node;
 
 #ifdef STARPU_HAVE_HWLOC