Selaa lähdekoodia

Fix handling dependencies of tasks regenerated very early

Samuel Thibault 10 vuotta sitten
vanhempi
commit
e787784fac
2 muutettua tiedostoa jossa 12 lisäystä ja 4 poistoa
  1. 12 1
      src/core/dependencies/task_deps.c
  2. 0 3
      tests/main/regenerate_pipeline.c

+ 12 - 1
src/core/dependencies/task_deps.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2013  Université de Bordeaux
+ * Copyright (C) 2010-2014  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013  Centre National de la Recherche Scientifique
  * Copyright (C) 2014  Inria
  *
@@ -86,6 +86,8 @@ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, s
 		struct starpu_task *dep_task = task_array[i];
 
 		struct _starpu_job *dep_job;
+		struct _starpu_cg *back_cg = NULL;
+
 		dep_job = _starpu_get_job_associated_to_task(dep_task);
 
 		STARPU_ASSERT_MSG(dep_job != job, "A task must not depend on itself.");
@@ -97,6 +99,13 @@ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, s
 			STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->regenerate, "For regenerated tasks, dependencies have to be set before first submission");
 		} else
 			STARPU_ASSERT_MSG(dep_job->terminated <= 1, "Task dependencies have to be set before termination (terminated %u)", dep_job->terminated);
+		if (dep_job->task->regenerate)
+		{
+			/* Make sure we don't regenerate the dependency before this task is finished */
+			back_cg = create_cg_task(1, dep_job);
+			/* Just do not take that dependency into account for the first submission */
+			dep_job->job_successors.ndeps_completed++;
+		}
 		STARPU_PTHREAD_MUTEX_UNLOCK(&dep_job->sync_mutex);
 
 		_STARPU_TRACE_TASK_DEPS(dep_job, job);
@@ -110,6 +119,8 @@ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, s
 #endif
 
 		_starpu_task_add_succ(dep_job, cg);
+		if (dep_job->task->regenerate)
+			_starpu_task_add_succ(job, back_cg);
 	}
 }
 

+ 0 - 3
tests/main/regenerate_pipeline.c

@@ -89,9 +89,6 @@ int main(int argc, char **argv)
 	double end;
 	int ret;
 
-	/* disable for now, still buggy */
-	return STARPU_TEST_SKIPPED;
-
 	parse_args(argc, argv);
 
 	ret = starpu_initialize(NULL, &argc, &argv);