Преглед изворни кода

fix bug in prediction computation
factorise code

Simon Archipoff пре 12 година
родитељ
комит
bcd3044139

+ 4 - 3
src/Makefile.am

@@ -132,8 +132,8 @@ noinst_HEADERS = 						\
 	sched_policies/node_sched.h				\
 	sched_policies/prio_deque.h				\
 	sched_policies/bitmap.h					\
-	sched_policies/scheduler_maker.h			\
 	sched_policies/node_composed.h
+#	sched_policies/scheduler_maker.h			
 
 libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = 		\
 	common/barrier.c					\
@@ -243,9 +243,10 @@ libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = 		\
 	sched_policies/bitmap.c					\
 	sched_policies/node_random.c				\
 	sched_policies/node_heft.c				\
-	sched_policies/hierarchical_heft.c			\
-	sched_policies/scheduler_maker.c			\
 	sched_policies/node_composed.c
+#	sched_policies/hierarchical_heft.c			\
+	sched_policies/scheduler_maker.c			
+
 if STARPU_USE_CPU
 libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/cpu/driver_cpu.c
 endif

+ 6 - 1
src/sched_policies/node_composed.c

@@ -26,7 +26,12 @@ void _starpu_sched_recipe_add_node(struct _starpu_composed_sched_node_recipe * r
 	e->arg = arg;
 	fun_create_node_list_push_back(recipe->list, e);
 }
-
+struct _starpu_composed_sched_node_recipe * _starpu_sched_node_create_recipe_singleton(struct _starpu_sched_node *(*create_node)(void * arg), void * arg)
+{
+	struct _starpu_composed_sched_node_recipe * r = _starpu_sched_node_create_recipe();
+	_starpu_sched_recipe_add_node(r, create_node, arg);
+	return r;
+}
 void _starpu_destroy_composed_sched_node_recipe(struct _starpu_composed_sched_node_recipe * recipe)
 {
 	if(!recipe)

+ 3 - 0
src/sched_policies/node_composed.h

@@ -6,8 +6,11 @@ struct _starpu_composed_sched_node_recipe;
 
 //create empty recipe
 struct _starpu_composed_sched_node_recipe * _starpu_sched_node_create_recipe(void);
+struct _starpu_composed_sched_node_recipe * _starpu_sched_node_create_recipe_singleton(struct _starpu_sched_node *(*create_node)(void * arg), void * arg);
+
 //add a function creation node to recipe
 void _starpu_sched_recipe_add_node(struct _starpu_composed_sched_node_recipe * recipe, struct _starpu_sched_node *(*create_node)(void * arg), void * arg);
+
 void _starpu_destroy_composed_sched_node_recipe(struct _starpu_composed_sched_node_recipe *);
 
 struct _starpu_sched_node * _starpu_sched_node_composed_node_create(struct _starpu_composed_sched_node_recipe * recipe);

+ 1 - 2
src/sched_policies/node_eager.c

@@ -29,8 +29,7 @@ static void initialize_eager_center_policy(unsigned sched_ctx_id)
 static void deinitialize_eager_center_policy(unsigned sched_ctx_id)
 {
 	struct _starpu_sched_tree *tree = (struct _starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
-	_starpu_bitmap_destroy(tree->workers);
-	_starpu_tree_destroy(tree, sched_ctx_id);
+	_starpu_sched_tree_destroy(tree, sched_ctx_id);
 	starpu_sched_ctx_delete_worker_collection(sched_ctx_id);
 }
 

+ 3 - 3
src/sched_policies/node_fifo.c

@@ -27,7 +27,7 @@ static struct _starpu_task_execute_preds estimated_execute_preds(struct _starpu_
 		struct _starpu_task_execute_preds preds = _starpu_sched_node_average_estimated_execute_preds(node, task);
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
 		preds.expected_finish_time = _starpu_compute_expected_time(fifo->exp_start,
-									   preds.expected_finish_time + fifo->exp_end,
+									   preds.expected_finish_time + fifo->exp_len / _starpu_bitmap_cardinal(node->workers),
 									   preds.state == PERF_MODEL ? preds.expected_length + fifo->exp_len : fifo->exp_len,
 									   preds.expected_transfer_length);
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
@@ -40,7 +40,7 @@ static struct _starpu_task_execute_preds estimated_execute_preds(struct _starpu_
 	{
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
 		preds.expected_finish_time = _starpu_compute_expected_time(fifo->exp_start,
-									   preds.expected_finish_time + fifo->exp_end,
+									   preds.expected_finish_time + fifo->exp_len / _starpu_bitmap_cardinal(node->workers),
 									   preds.expected_length + fifo->exp_len,
 									   preds.expected_transfer_length);
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
@@ -99,7 +99,7 @@ static int push_task(struct _starpu_sched_node * node, struct starpu_task * task
 	int ret = _starpu_prio_deque_push_task(fifo, task);
 	if(!isnan(task->predicted))
 	{
-		task->predicted /= _starpu_bitmap_cardinal(node->workers);
+//		task->predicted /= _starpu_bitmap_cardinal(node->workers);
 		fifo->exp_len += task->predicted;
 		fifo->exp_end = fifo->exp_start + fifo->exp_len;
 	}

+ 54 - 0
src/sched_policies/node_heft.c

@@ -266,3 +266,57 @@ int _starpu_sched_node_is_heft(struct _starpu_sched_node * node)
 {
 	return node->init_data == init_heft_data;
 }
+
+
+
+static void initialize_heft_center_policy(unsigned sched_ctx_id)
+{
+	starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST);
+	
+	struct _starpu_sched_tree * t = _starpu_sched_tree_create();
+	t->root = _starpu_sched_node_heft_create(NULL);
+	
+	unsigned i;
+	for(i = 0; i < starpu_worker_get_count(); i++)
+	{
+		struct _starpu_sched_node * worker_node = _starpu_sched_node_worker_get(i);
+		STARPU_ASSERT(worker_node);
+		struct _starpu_sched_node * fifo_node = _starpu_sched_node_fifo_create(NULL);
+		_starpu_sched_node_add_child(fifo_node, worker_node);
+		_starpu_sched_node_set_father(worker_node, fifo_node, sched_ctx_id);
+
+		_starpu_sched_node_add_child(t->root, fifo_node);
+		_starpu_sched_node_set_father(fifo_node, t->root, sched_ctx_id);
+	}
+	
+	_starpu_set_workers_bitmaps();
+	_starpu_tree_call_init_data(t);
+
+	starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)t);
+}
+
+static void deinitialize_heft_center_policy(unsigned sched_ctx_id)
+{
+	struct _starpu_sched_tree *t = (struct _starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
+	_starpu_sched_tree_destroy(t, sched_ctx_id);
+	starpu_sched_ctx_delete_worker_collection(sched_ctx_id);
+}
+
+
+
+
+
+struct starpu_sched_policy _starpu_sched_tree_heft_policy =
+{
+	.init_sched = initialize_heft_center_policy,
+	.deinit_sched = deinitialize_heft_center_policy,
+	.add_workers = _starpu_tree_add_workers,
+	.remove_workers = _starpu_tree_remove_workers,
+	.push_task = _starpu_tree_push_task,
+	.pop_task = _starpu_tree_pop_task,
+	.pre_exec_hook = NULL,
+	.post_exec_hook = NULL,
+	.pop_every_task = NULL,
+	.policy_name = "tree-heft",
+	.policy_description = "heft tree policy"
+};

+ 1 - 2
src/sched_policies/node_random.c

@@ -118,8 +118,7 @@ static void initialize_random_center_policy(unsigned sched_ctx_id)
 static void deinitialize_random_center_policy(unsigned sched_ctx_id)
 {
 	struct _starpu_sched_tree *tree = (struct _starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
-	_starpu_bitmap_destroy(tree->workers);
-	_starpu_tree_destroy(tree, sched_ctx_id);
+	_starpu_sched_tree_destroy(tree, sched_ctx_id);
 	starpu_sched_ctx_delete_worker_collection(sched_ctx_id);
 }
 

+ 14 - 3
src/sched_policies/node_sched.c

@@ -1,7 +1,7 @@
 #include <core/jobs.h>
 #include <core/workers.h>
 #include "node_sched.h"
-
+#include <starpu_thread_util.h>
 double _starpu_compute_expected_time(double now, double predicted_end, double predicted_length, double predicted_transfer)
 {
 
@@ -144,9 +144,20 @@ void _starpu_node_destroy_rec(struct _starpu_sched_node * node, unsigned sched_c
 	}
 	free(stack);
 }
-void _starpu_tree_destroy(struct _starpu_sched_tree * tree, unsigned sched_ctx_id)
+struct _starpu_sched_tree * _starpu_sched_tree_create(void)
+{
+	struct _starpu_sched_tree * t = malloc(sizeof(*t));
+	memset(t, 0, sizeof(*t));
+	t->workers = _starpu_bitmap_create();
+	STARPU_PTHREAD_RWLOCK_INIT(&t->lock,NULL);
+	return t;
+}
+
+void _starpu_sched_tree_destroy(struct _starpu_sched_tree * tree, unsigned sched_ctx_id)
 {
-	_starpu_node_destroy_rec(tree->root, sched_ctx_id);
+	if(tree->root)
+		_starpu_node_destroy_rec(tree->root, sched_ctx_id);
+	_starpu_bitmap_destroy(tree->workers);
 	STARPU_PTHREAD_RWLOCK_DESTROY(&tree->lock);
 	free(tree);
 }

+ 4 - 1
src/sched_policies/node_sched.h

@@ -132,7 +132,10 @@ int _starpu_sched_node_is_heft(struct _starpu_sched_node * node);
  */
 double _starpu_compute_expected_time(double now, double predicted_end, double predicted_length, double predicted_transfer);
 
-void _starpu_tree_destroy(struct _starpu_sched_tree * tree, unsigned sched_ctx_id);
+/*create an empty tree
+ */
+struct _starpu_sched_tree * _starpu_sched_tree_create(void);
+void _starpu_sched_tree_destroy(struct _starpu_sched_tree * tree, unsigned sched_ctx_id);
 
 /* destroy node and all his child
  * except if they are shared between several contexts

+ 1 - 2
src/sched_policies/node_work_stealing.c

@@ -271,8 +271,7 @@ static void initialize_ws_center_policy(unsigned sched_ctx_id)
 static void deinitialize_ws_center_policy(unsigned sched_ctx_id)
 {
 	struct _starpu_sched_tree *t = (struct _starpu_sched_tree*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
-	_starpu_bitmap_destroy(t->workers);
-	_starpu_tree_destroy(t, sched_ctx_id);
+	_starpu_sched_tree_destroy(t, sched_ctx_id);
 	starpu_sched_ctx_delete_worker_collection(sched_ctx_id);
 }