Bladeren bron

Add temanejo support for task-task dependencies and tag dependencies

Samuel Thibault 12 jaren geleden
bovenliggende
commit
9672a315cf
5 gewijzigde bestanden met toevoegingen van 63 en 8 verwijderingen
  1. 2 1
      doc/chapters/perf-feedback.texi
  2. 45 0
      src/core/dependencies/tags.c
  3. 7 0
      src/core/dependencies/task_deps.c
  4. 9 0
      src/core/jobs.c
  5. 0 7
      src/core/task.c

+ 2 - 1
doc/chapters/perf-feedback.texi

@@ -31,7 +31,8 @@ Make sure to specify at least the same number of CPUs in the dialog box as your
 machine has, otherwise an error will happen during execution. Future versions
 of Temanejo should be able to tell StarPU the number of CPUs to use.
 
-Only dependencies detected implicitly are currently shown.
+Tag numbers have to be below @code{4000000000000000000ULL} to be usable for
+Temanejo (so as to distinguish them from tasks).
 
 @node On-line
 @section On-line performance feedback

+ 45 - 0
src/core/dependencies/tags.c

@@ -24,6 +24,9 @@
 #include <core/dependencies/data_concurrency.h>
 #include <profiling/bound.h>
 #include <common/uthash.h>
+#include <core/debug.h>
+
+#define AYUDAME_OFFSET 4000000000000000000ULL
 
 struct _starpu_tag_table
 {
@@ -135,6 +138,13 @@ void starpu_tag_remove(starpu_tag_t id)
 {
 	struct _starpu_tag_table *entry;
 
+#ifdef HAVE_AYUDAME_H
+	if (AYU_event) {
+		int id = -1;
+		AYU_event(AYU_REMOVETASK, id + AYUDAME_OFFSET, NULL);
+	}
+#endif
+
 	_STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock);
 
 	HASH_FIND_UINT64_T(tag_htbl, &id, entry);
@@ -187,6 +197,14 @@ static struct _starpu_tag *gettag_struct(starpu_tag_t id)
 		entry2->tag = tag;
 
 		HASH_ADD_UINT64_T(tag_htbl, id, entry2);
+
+#ifdef HAVE_AYUDAME_H
+		if (AYU_event) {
+			int64_t AYU_data[2] = {-1, 0};
+			STARPU_ASSERT(id < AYUDAME_OFFSET);
+			AYU_event(AYU_ADDTASK, id + AYUDAME_OFFSET, AYU_data);
+		}
+#endif
 	}
 
 	_STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock);
@@ -213,6 +231,13 @@ void _starpu_tag_set_ready(struct _starpu_tag *tag)
 	_starpu_enforce_deps_starting_from_task(j);
 
 	_starpu_spin_lock(&tag->lock);
+#ifdef HAVE_AYUDAME_H
+	if (AYU_event) {
+		int id = -1;
+		AYU_event(AYU_PRERUNTASK, tag->id + AYUDAME_OFFSET, &id);
+		AYU_event(AYU_POSTRUNTASK, tag->id + AYUDAME_OFFSET, NULL);
+	}
+#endif
 }
 
 /* the lock must be taken ! */
@@ -289,6 +314,14 @@ void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job)
 	if (job->task->regenerate || job->submitted == 2 ||
 			tag->state != STARPU_DONE)
 		tag->state = STARPU_ASSOCIATED;
+#ifdef HAVE_AYUDAME_H
+	if (AYU_event) {
+		uintptr_t AYU_data1[3] = {id+AYUDAME_OFFSET, 0, 0};
+		uintptr_t AYU_data2[3] = {job->job_id, 0, 0};
+		AYU_event(AYU_ADDDEPENDENCY, job->job_id, AYU_data1);
+		AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data2);
+	}
+#endif
 	_starpu_spin_unlock(&tag->lock);
 }
 
@@ -318,6 +351,12 @@ void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t
 		_starpu_spin_lock(&tag_dep->lock);
 		_starpu_spin_lock(&tag_child->lock);
 		_starpu_tag_add_succ(tag_dep, cg);
+#ifdef HAVE_AYUDAME_H
+		if (AYU_event) {
+			uintptr_t AYU_data[3] = {dep_id+AYUDAME_OFFSET, 0, 0};
+			AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data);
+		}
+#endif
 		_starpu_spin_unlock(&tag_child->lock);
 		_starpu_spin_unlock(&tag_dep->lock);
 	}
@@ -352,6 +391,12 @@ void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...)
 		_starpu_spin_lock(&tag_dep->lock);
 		_starpu_spin_lock(&tag_child->lock);
 		_starpu_tag_add_succ(tag_dep, cg);
+#ifdef HAVE_AYUDAME_H
+		if (AYU_event) {
+			uintptr_t AYU_data[3] = {dep_id+AYUDAME_OFFSET, 0, 0};
+			AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data);
+		}
+#endif
 		_starpu_spin_unlock(&tag_child->lock);
 		_starpu_spin_unlock(&tag_dep->lock);
 	}

+ 7 - 0
src/core/dependencies/task_deps.c

@@ -24,6 +24,7 @@
 #include <core/sched_policy.h>
 #include <core/dependencies/data_concurrency.h>
 #include <profiling/bound.h>
+#include <core/debug.h>
 
 static struct _starpu_cg *create_cg_task(unsigned ntags, struct _starpu_job *j)
 {
@@ -89,6 +90,12 @@ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, s
 
 		_STARPU_TRACE_TASK_DEPS(dep_job, job);
 		_starpu_bound_task_dep(job, dep_job);
+#ifdef HAVE_AYUDAME_H
+		if (AYU_event && check) {
+			uintptr_t AYU_data[3] = {dep_job->job_id, 0, 0};
+			AYU_event(AYU_ADDDEPENDENCY, job->job_id, AYU_data);
+		}
+#endif
 
 		_starpu_task_add_succ(dep_job, cg);
 	}

+ 9 - 0
src/core/jobs.c

@@ -60,7 +60,16 @@ struct _starpu_job* __attribute__((malloc)) _starpu_job_create(struct starpu_tas
 #endif
 			)
 #endif
+	{
 		job->job_id = STARPU_ATOMIC_ADD(&job_cnt, 1);
+#ifdef HAVE_AYUDAME_H
+		if (AYU_event) {
+			/* Declare task to Ayudame */
+			int64_t AYU_data[2] = {_starpu_ayudame_get_func_id(task->cl), task->priority > STARPU_MIN_PRIO};
+			AYU_event(AYU_ADDTASK, job->job_id, AYU_data);
+		}
+#endif
+	}
 
 	_starpu_cg_list_init(&job->job_successors);
 

+ 0 - 7
src/core/task.c

@@ -373,13 +373,6 @@ int starpu_task_submit(struct starpu_task *task)
 	* allocated. */
 	struct _starpu_job *j = _starpu_get_job_associated_to_task(task);
 
-#ifdef HAVE_AYUDAME_H
-	if (AYU_event) {
-		int64_t AYU_data[2] = {j->exclude_from_dag?-1:_starpu_ayudame_get_func_id(task->cl), task->priority > STARPU_MIN_PRIO};
-		AYU_event(AYU_ADDTASK, j->job_id, AYU_data);
-	}
-#endif
-
 	if (task->cl)
 	{
 		unsigned i;