ソースを参照

fix perf problem! modularized heft is still slower...
but its behaviour is pretty similar to dmda.
maybe its just an overhead problem ?

Simon Archipoff 12 年 前
コミット
da70e87cde
共有3 個のファイルを変更した13 個の追加9 個の削除を含む
  1. 10 4
      src/sched_policies/node_heft.c
  2. 0 3
      src/sched_policies/node_sched.c
  3. 3 2
      src/sched_policies/node_worker.c

+ 10 - 4
src/sched_policies/node_heft.c

@@ -36,7 +36,7 @@ static int push_task(struct starpu_sched_node * node, struct starpu_task * task)
 	double estimated_transfer_length[node->nchilds];
 	int suitable_nodes[node->nchilds];
 	int nsuitable_nodes = 0;
-	double now = starpu_timing_now();
+
 	int i;
 	for(i = 0; i < node->nchilds; i++)
 	{
@@ -49,6 +49,7 @@ static int push_task(struct starpu_sched_node * node, struct starpu_task * task)
 				return d->no_perf_model_node->push_task(d->no_perf_model_node, task);
 			estimated_transfer_length[i] = starpu_sched_node_transfer_length(c, task);
 			estimated_ends[i] = c->estimated_end(c);
+	double now = starpu_timing_now();
 			estimated_ends_with_task[i] = starpu_sched_compute_expected_time(now,
 											 estimated_ends[i],
 											 estimated_lengths[i],
@@ -86,9 +87,9 @@ static int push_task(struct starpu_sched_node * node, struct starpu_task * task)
 		fprintf(stderr,"%.0f ",estimated_lengths[i]);
 	}
 	fprintf(stderr,"\n\n");
-#endif
-
 
+	fprintf(stderr,"fitness                 ");
+#endif
 	double best_fitness = DBL_MAX;
 	int best_inode = -1;
 	for(i = 0; i < nsuitable_nodes; i++)
@@ -100,13 +101,18 @@ static int push_task(struct starpu_sched_node * node, struct starpu_task * task)
 					     max_exp_end_with_task,
 					     estimated_transfer_length[inode],
 					     0.0);
+#if 0
+		fprintf(stderr,"%.0f ",tmp);
+#endif
 		if(tmp < best_fitness)
 		{
 			best_fitness = tmp;
 			best_inode = inode;
 		}
 	}
-	//	fprintf(stderr,"push on %d\n",best_inode);
+#if 0
+	fprintf(stderr,"push on %d\n",best_inode);
+#endif
 	STARPU_ASSERT(best_inode != -1);
 	best_node = node->childs[best_inode];
 	return best_node->push_task(best_node, task);

+ 0 - 3
src/sched_policies/node_sched.c

@@ -8,9 +8,6 @@
 double starpu_sched_compute_expected_time(double now, double predicted_end, double predicted_length, double predicted_transfer)
 {
 
-	if(now > predicted_end)
-		return predicted_end + predicted_length;
-
 	if (now + predicted_transfer < predicted_end)
 	{
 		/* We may hope that the transfer will be finished by

+ 3 - 2
src/sched_policies/node_worker.c

@@ -291,7 +291,7 @@ int starpu_sched_node_worker_push_task(struct starpu_sched_node * node, struct s
 	t->ntasks = 1;
 
 	task->workerid = starpu_bitmap_first(node->workers);
-#if 0 /* dead lock problem */
+#if 1 /* dead lock problem */
 	if (starpu_get_prefetch_flag())
 	{
 		unsigned memory_node = starpu_worker_get_memory_node(task->workerid);
@@ -471,7 +471,8 @@ static double simple_worker_estimated_end(struct starpu_sched_node * node)
 {
 	struct _starpu_worker_node_data * data = node->data;
 	STARPU_PTHREAD_MUTEX_LOCK(&data->list->mutex);
-	double tmp = data->list->exp_end = starpu_timing_now() + data->list->exp_len;
+	data->list->exp_start = STARPU_MAX(starpu_timing_now(), data->list->exp_start);
+	double tmp = data->list->exp_end = data->list->exp_start + data->list->exp_len;
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->list->mutex);
 	return tmp;
 }