Browse Source

Add data details in trace

Samuel Thibault 10 years ago
parent
commit
dd2eae0274
4 changed files with 82 additions and 12 deletions
  1. 1 0
      ChangeLog
  2. 14 0
      doc/doxygen/chapters/13offline_performance_tools.doxy
  3. 2 0
      src/common/fxt.h
  4. 65 12
      src/debug/traces/starpu_fxt.c

+ 1 - 0
ChangeLog

@@ -103,6 +103,7 @@ New features:
     accesses, notably with STARPU_COMMUTE.
   * Add the capability to define specific MPI datatypes for
     StarPU user-defined interfaces.
+  * Add tasks.rec trace output to make scheduling analysis easier.
 
 Small features:
   * Tasks can now have a name (via the field const char *name of

+ 14 - 0
doc/doxygen/chapters/13offline_performance_tools.doxy

@@ -164,6 +164,20 @@ graphical output of the graph by using the graphviz library:
 $ dot -Tpdf dag.dot -o output.pdf
 \endverbatim
 
+\subsection TraceTaskDetails Getting task details
+
+When the FxT trace file <c>filename</c> has been generated, details on the
+executed tasks can be retrieved by calling:
+
+\verbatim
+$ starpu_fxt_tool -i filename
+\endverbatim
+
+This will create a <c>tasks.rec</c> file in the current directory.  This file
+is in the recutils format, i.e. <c>Field: value</c> lines, and empty lines to
+separate each task.  This can be used as a convenient input for various ad-hoc
+analysis tools.
+
 \subsection MonitoringActivity Monitoring Activity
 
 When the FxT trace file <c>filename</c> has been generated, it is possible to

+ 2 - 0
src/common/fxt.h

@@ -72,6 +72,7 @@
 #define _STARPU_FUT_WORKER_SLEEP_END	0x5119
 
 #define _STARPU_FUT_TASK_SUBMIT		0x511a
+#define _STARPU_FUT_CODELET_DATA_HANDLE	0x511b
 
 #define _STARPU_FUT_USER_DEFINED_START	0x5120
 #define _STARPU_FUT_USER_DEFINED_END	0x5121
@@ -445,6 +446,7 @@ do {									\
 					__handle->ops->describe(__interface, __buf, sizeof(__buf));	\
 					_STARPU_FUT_DO_PROBE1STR(_STARPU_FUT_CODELET_DATA, workerid, __buf);	\
 				}					\
+				FUT_DO_PROBE4(_STARPU_FUT_CODELET_DATA_HANDLE, (job)->job_id, (__handle), _starpu_data_get_size(__handle), STARPU_TASK_GET_MODE((job)->task, __i));	\
 			}						\
 		}							\
 		const size_t __job_size = _starpu_job_get_data_size((job)->task->cl?(job)->task->cl->model:NULL, perf_arch, nimpl, (job));	\

+ 65 - 12
src/debug/traces/starpu_fxt.c

@@ -51,6 +51,12 @@ static unsigned mic_index = 0;
 static unsigned scc_index = 0;
 static unsigned other_index = 0;
 
+struct data_info {
+	unsigned long handle;
+	unsigned long size;
+	int mode;
+};
+
 struct task_info {
 	UT_hash_handle hh;
 	char *name;
@@ -65,7 +71,8 @@ struct task_info {
 	char *parameters;
 	unsigned int ndeps;
 	unsigned long *dependencies;
-	/* TODO: handles, datasizes */
+	unsigned long ndata;
+	struct data_info *data;
 };
 
 struct task_info *tasks_info;
@@ -90,8 +97,8 @@ static struct task_info *get_task(unsigned long job_id)
 		task->parameters = NULL;
 		task->ndeps = 0;
 		task->dependencies = NULL;
-		/* task->handles */
-		/* task->datasizes */
+		task->ndata = 0;
+		task->data = NULL;
 		HASH_ADD(hh, tasks_info, job_id, sizeof(task->job_id), task);
 	}
 
@@ -844,6 +851,31 @@ static void handle_codelet_data(struct fxt_ev_64 *ev STARPU_ATTRIBUTE_UNUSED, st
 	snprintf(last_codelet_parameter_description[worker][num], sizeof(last_codelet_parameter_description[worker][num]), "%s", (char*) &ev->param[1]);
 }
 
+static void handle_codelet_data_handle(struct fxt_ev_64 *ev STARPU_ATTRIBUTE_UNUSED, struct starpu_fxt_options *options STARPU_ATTRIBUTE_UNUSED)
+{
+	struct task_info *task = get_task(ev->param[0]);
+	unsigned alloc = 0;
+
+	if (task->ndata == 0)
+		/* Start with 8=2^3, should be plenty in most cases */
+		alloc = 8;
+	else if (task->ndata >= 8)
+	{
+		/* Allocate dependencies array by powers of two */
+		if (! ((task->ndata - 1) & task->ndata)) /* Is task->ndata a power of two? */
+		{
+			/* We have filled the previous power of two, get another one */
+			alloc = task->ndata * 2;
+		}
+	}
+	if (alloc)
+		task->data = realloc(task->data, sizeof(*task->data) * alloc);
+	task->data[task->ndata].handle = ev->param[1];
+	task->data[task->ndata].size = ev->param[2];
+	task->data[task->ndata].mode = ev->param[3];
+	task->ndata++;
+}
+
 static void handle_codelet_details(struct fxt_ev_64 *ev STARPU_ATTRIBUTE_UNUSED, struct starpu_fxt_options *options STARPU_ATTRIBUTE_UNUSED)
 {
 	int worker = ev->param[5];
@@ -1774,12 +1806,20 @@ void tasks_output(char *filename_out)
 	{
 		if (!task->exclude_from_dag)
 		{
-			fprintf(f, "JobId: %lu\n", task->job_id);
 			if (task->name)
 			{
 				fprintf(f, "Name: %s\n", task->name);
 				free(task->name);
 			}
+			fprintf(f, "JobId: %lu\n", task->job_id);
+			if (task->dependencies)
+			{
+				fprintf(f, "DependsOn:");
+				for (i = 0; i < task->ndeps; i++)
+					fprintf(f, " %lu", task->dependencies[i]);
+				fprintf(f, "\n");
+				free(task->dependencies);
+			}
 			fprintf(f, "Tag: %"PRIx64"\n", task->tag);
 			if (task->workerid >= 0)
 				fprintf(f, "WorkerId: %d\n", task->workerid);
@@ -1789,22 +1829,32 @@ void tasks_output(char *filename_out)
 				fprintf(f, "StartTime: %f\n", task->start_time);
 			if (task->end_time != 0.)
 				fprintf(f, "EndTime: %f\n", task->end_time);
-			fprintf(f, "DataFootprint: %lx\n", task->footprint);
+			fprintf(f, "Footprint: %lx\n", task->footprint);
 			if (task->parameters)
 			{
 				fprintf(f, "Parameters: %s\n", task->parameters);
 				free(task->parameters);
 			}
-			if (task->dependencies)
+			if (task->data)
 			{
-				fprintf(f, "DependsOn:");
-				for (i = 0; i < task->ndeps; i++)
-					fprintf(f, " %lu", task->dependencies[i]);
+				fprintf(f, "Handles:");
+				for (i = 0; i < task->ndata; i++)
+					fprintf(f, " %lx", task->data[i].handle);
+				fprintf(f, "\n");
+				fprintf(f, "Modes:");
+				for (i = 0; i < task->ndata; i++)
+					fprintf(f, " %s%s%s%s%s",
+						(task->data[i].mode & STARPU_R)?"R":"",
+						(task->data[i].mode & STARPU_W)?"W":"",
+						(task->data[i].mode & STARPU_SCRATCH)?"S":"",
+						(task->data[i].mode & STARPU_REDUX)?"X":"",
+						(task->data[i].mode & STARPU_COMMUTE)?"C":"");
+				fprintf(f, "\n");
+				fprintf(f, "Sizes:");
+				for (i = 0; i < task->ndata; i++)
+					fprintf(f, " %lu", task->data[i].size);
 				fprintf(f, "\n");
-				free(task->dependencies);
 			}
-			/* fprintf(f, "Handles: %lx\n", task->handles); */
-			/* fprintf(f, "DataSizes: %lx\n", task->datasizes); */
 			fprintf(f, "\n");
 		}
 		HASH_DEL(tasks_info, task);
@@ -1900,6 +1950,9 @@ void _starpu_fxt_parse_new_file(char *filename_in, struct starpu_fxt_options *op
 			case _STARPU_FUT_CODELET_DATA:
 				handle_codelet_data(&ev, options);
 				break;
+			case _STARPU_FUT_CODELET_DATA_HANDLE:
+				handle_codelet_data_handle(&ev, options);
+				break;
 			case _STARPU_FUT_CODELET_DETAILS:
 				handle_codelet_details(&ev, options);
 				break;