Browse Source

bug fix, more helpers function for node_worker.c

Simon Archipoff 12 years ago
parent
commit
112373ea3a

+ 1 - 1
src/sched_policies/node_heft.c

@@ -277,7 +277,7 @@ static void initialize_heft_center_policy(unsigned sched_ctx_id)
 	t->root = _starpu_sched_node_heft_create(NULL);
 	
 	unsigned i;
-	for(i = 0; i < starpu_worker_get_count(); i++)
+	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct _starpu_sched_node * worker_node = _starpu_sched_node_worker_get(i);
 		STARPU_ASSERT(worker_node);

+ 8 - 2
src/sched_policies/node_random.c

@@ -9,12 +9,18 @@ struct _starpu_random_data
 
 static double compute_relative_speedup(struct _starpu_sched_node * node)
 {
-	if(_starpu_sched_node_is_worker(node))
+	if(_starpu_sched_node_is_simple_worker(node))
 	{
 		int id = _starpu_sched_node_worker_get_workerid(node);
 		enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(id);
 		return starpu_worker_get_relative_speedup(perf_arch);
 	}
+	if(_starpu_sched_node_is_combined_worker(node))
+	{
+		struct _starpu_combined_worker * c = _starpu_sched_node_combined_worker_get_combined_worker(node);
+		return starpu_worker_get_relative_speedup(c->perf_arch);
+		
+	}
 	double sum = 0.0;
 	int i;
 	for(i = 0; i < node->nchilds; i++)
@@ -103,7 +109,7 @@ static void initialize_random_center_policy(unsigned sched_ctx_id)
 	data->workers = _starpu_bitmap_create();
 
 	unsigned i;
-	for(i = 0; i < starpu_worker_get_count(); i++)
+	for(i = 0; i < starpu_worker_get_count() + starpu_combined_worker_get_count(); i++)
 	{
 		struct _starpu_sched_node * node = _starpu_sched_node_worker_get(i);
 		if(!node)

+ 1 - 1
src/sched_policies/node_sched.c

@@ -411,7 +411,7 @@ static void add_worker_bit(struct _starpu_sched_node * node, int worker)
 void _starpu_set_workers_bitmaps(void)
 {
 	unsigned worker;	
-	for(worker = 0; worker < starpu_worker_get_count(); worker++)
+	for(worker = 0; worker < starpu_worker_get_count() + starpu_combined_worker_get_count(); worker++)
 	{
 		struct _starpu_sched_node * worker_node = _starpu_sched_node_worker_get(worker);
 		add_worker_bit(worker_node, worker);

+ 1 - 0
src/sched_policies/node_sched.h

@@ -159,6 +159,7 @@ int _starpu_sched_node_can_execute_task_with_impl(struct _starpu_sched_node * no
 /* no public create function for workers because we dont want to have several node_worker for a single workerid */
 struct _starpu_sched_node * _starpu_sched_node_worker_get(int workerid);
 struct _starpu_worker * _starpu_sched_node_worker_get_worker(struct _starpu_sched_node * worker_node);
+struct _starpu_combined_worker * _starpu_sched_node_combined_worker_get_combined_worker(struct _starpu_sched_node * combined_worker_node);
 void _starpu_sched_node_worker_destroy(struct _starpu_sched_node *);
 
 /* this function compare the available function of the node with the standard available for worker nodes*/

+ 26 - 9
src/sched_policies/node_worker.c

@@ -196,10 +196,26 @@ struct _starpu_sched_node * _starpu_sched_node_worker_get(int workerid)
 
 struct _starpu_worker * _starpu_sched_node_worker_get_worker(struct _starpu_sched_node * worker_node)
 {
-	STARPU_ASSERT(_starpu_sched_node_is_worker(worker_node));
+	STARPU_ASSERT(_starpu_sched_node_is_simple_worker(worker_node));
 	struct _starpu_worker_node_data * data = worker_node->data;
 	return data->worker;
 }
+struct _starpu_combined_worker * _starpu_sched_node_combined_worker_get_combined_worker(struct _starpu_sched_node * worker_node)
+{
+	STARPU_ASSERT(_starpu_sched_node_is_combined_worker(worker_node));
+	struct _starpu_worker_node_data * data = worker_node->data;
+	return data->combined_worker;
+}
+
+enum starpu_perfmodel_archtype _starpu_sched_node_worker_get_perf_arch(struct _starpu_sched_node * worker_node)
+{
+	STARPU_ASSERT(_starpu_sched_node_is_worker(worker_node));
+	if(_starpu_sched_node_is_simple_worker(worker_node))
+		return _starpu_sched_node_worker_get_worker(worker_node)->perf_arch;
+	else
+		return _starpu_sched_node_combined_worker_get_combined_worker(worker_node)->perf_arch;
+}
+
 
 int _starpu_sched_node_worker_push_task(struct _starpu_sched_node * node, struct starpu_task *task)
 {
@@ -368,12 +384,12 @@ static struct _starpu_task_execute_preds estimated_execute_preds(struct _starpu_
 {
 	STARPU_ASSERT(_starpu_sched_node_is_worker(node));
 	starpu_task_bundle_t bundle = task->bundle;
-	struct _starpu_worker * worker = _starpu_sched_node_worker_get_worker(node);
+       int workerid = _starpu_sched_node_worker_get_workerid(node);
 
 	struct _starpu_task_execute_preds preds =
 		{
 			.state = CANNOT_EXECUTE,
-			.archtype = worker->perf_arch,
+			.archtype = _starpu_sched_node_worker_get_perf_arch(node),
 			.expected_length = DBL_MAX,
 			.expected_finish_time = estimated_finish_time(node),
 			.expected_transfer_length = estimated_transfer_length(node, task),
@@ -383,13 +399,13 @@ static struct _starpu_task_execute_preds estimated_execute_preds(struct _starpu_
 	int nimpl;
 	for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++)
 	{
-		if(starpu_worker_can_execute_task(worker->workerid,task,nimpl))
+		if(starpu_worker_can_execute_task(workerid,task,nimpl))
 		{
 			double d;
 			if(bundle)
-				d = starpu_task_bundle_expected_length(bundle, worker->perf_arch, nimpl);
+				d = starpu_task_bundle_expected_length(bundle, preds.archtype, nimpl);
 			else
-				d = starpu_task_expected_length(task, worker->perf_arch, nimpl);
+				d = starpu_task_expected_length(task, preds.archtype, nimpl);
 			if(isnan(d))
 			{
 				preds.state = CALIBRATING;
@@ -420,9 +436,9 @@ static struct _starpu_task_execute_preds estimated_execute_preds(struct _starpu_
 									  preds.expected_transfer_length);
 
 		if(bundle)
-			preds.expected_power = starpu_task_bundle_expected_power(bundle, worker->perf_arch, preds.impl);
+			preds.expected_power = starpu_task_bundle_expected_power(bundle, preds.archtype, preds.impl);
 		else
-			preds.expected_power = starpu_task_expected_power(task, worker->perf_arch,preds.impl);
+			preds.expected_power = starpu_task_expected_power(task, preds.archtype,preds.impl);
 	}
 
 	return preds;
@@ -646,5 +662,6 @@ int _starpu_sched_node_worker_get_workerid(struct _starpu_sched_node * worker_no
 #ifndef STARPU_NO_ASSERT
 	STARPU_ASSERT(_worker_consistant(worker_node));
 #endif
-	return _starpu_sched_node_worker_get_worker(worker_node)->workerid;
+	STARPU_ASSERT(1 == _starpu_bitmap_cardinal(worker_node->workers));
+	return _starpu_bitmap_first(worker_node->workers);
 }