Browse Source

Add starpu_data_set_name, starpu_data_set_coordinates_array, and starpu_data_set_coordinates to describe data.

Samuel Thibault 8 years ago
parent
commit
db0acb2486

+ 2 - 0
ChangeLog

@@ -61,6 +61,8 @@ New features:
     models between devices, making calibration much faster.
   * Add modular-heft-prio scheduler.
   * Add starpu_cublas_get_local_handle helper.
+  * Add starpu_data_set_name, starpu_data_set_coordinates_array, and
+    starpu_data_set_coordinates to describe data.
 
 Changes:
   * Fix performance regression of lws for small tasks.

+ 4 - 0
doc/doxygen/chapters/380_offline_performance_tools.doxy

@@ -149,6 +149,10 @@ It can also set the starpu_task::name field of the task (or use \ref STARPU_NAME
 when using starpu_task_insert()), to replace in traces the name of the codelet
 with an arbitrarily chosen name.
 
+Coordinates can also be given to data with the starpu_data_set_coordinates() or
+starpu_data_set_coordinates_array() function. In the trace, tasks will then be
+assigned the coordinates of the first data they write to.
+
 Traces can also be inspected by hand by using the tool <c>fxt_print</c>, for instance:
 
 \verbatim

+ 16 - 0
doc/doxygen/chapters/api/data_management.doxy

@@ -176,6 +176,22 @@ modified, it is automatically transfered into those memory nodes. For
 instance a <c>1<<0</c> write-through mask means that the CUDA workers
 will commit their changes in main memory (node 0).
 
+\fn void starpu_data_set_name(starpu_data_handle_t handle, const char *name)
+\ingroup API_Data_Management
+Set the name of the data, to be shown in various profiling tools.
+
+\fn void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[]);
+\ingroup API_Data_Management
+Set the coordinates of the data, to be shown in various profiling tools.
+\p dimensions is the size of the \dims array
+This can be for instance the tile coordinates within a big matrix.
+
+\fn void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...);
+\ingroup API_Data_Management
+Set the coordinates of the data, to be shown in various profiling tools.
+\p dimensions is the number of subsequent int parameters.
+This can be for instance the tile coordinates within a big matrix.
+
 \fn int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async)
 \ingroup API_Data_Management
 Issue a fetch request for the data \p handle to \p node, i.e.

+ 8 - 0
examples/cholesky/cholesky_implicit.c

@@ -161,6 +161,7 @@ static int _cholesky(starpu_data_handle_t dataA, unsigned nblocks)
 static int cholesky(float *matA, unsigned size, unsigned ld, unsigned nblocks)
 {
 	starpu_data_handle_t dataA;
+	unsigned x, y;
 
 	/* monitor and partition the A matrix into blocks :
 	 * one block is now determined by 2 unsigned (i,j) */
@@ -180,6 +181,13 @@ static int cholesky(float *matA, unsigned size, unsigned ld, unsigned nblocks)
 
 	starpu_data_map_filters(dataA, 2, &f, &f2);
 
+	for (x = 0; x < nblocks; x++)
+		for (y = 0; y < nblocks; y++)
+		{
+			starpu_data_handle_t data = starpu_data_get_sub_data(dataA, 2, x, y);
+			starpu_data_set_coordinates(data, 2, x, y);
+		}
+
 	int ret = _cholesky(dataA, nblocks);
 
 	starpu_data_unpartition(dataA, STARPU_MAIN_RAM);

+ 5 - 1
include/starpu_data.h

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2016  Université de Bordeaux
+ * Copyright (C) 2010-2017  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015  CNRS
  * Copyright (C) 2016  Inria
  *
@@ -53,6 +53,10 @@ struct starpu_data_descr
 
 struct starpu_data_interface_ops;
 
+void starpu_data_set_name(starpu_data_handle_t handle, const char *name);
+void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[]);
+void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...);
+
 void starpu_data_unregister(starpu_data_handle_t handle);
 void starpu_data_unregister_no_coherency(starpu_data_handle_t handle);
 void starpu_data_unregister_submit(starpu_data_handle_t handle);

+ 2 - 1
include/starpu_fxt.h

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2011, 2013, 2015-2016  Université de Bordeaux
+ * Copyright (C) 2010-2011, 2013, 2015-2017  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2013, 2014  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -50,6 +50,7 @@ struct starpu_fxt_options
 	char *activity_path;
 	char *dag_path;
 	char *tasks_path;
+	char *data_path;
 	char *anim_path;
 	char *states_path;
 

+ 16 - 0
src/common/fxt.h

@@ -78,6 +78,9 @@
 
 #define _STARPU_FUT_MODEL_NAME		0x511c
 
+#define _STARPU_FUT_DATA_NAME		0x511d
+#define _STARPU_FUT_DATA_COORDINATES	0x511e
+
 #define _STARPU_FUT_USER_DEFINED_START	0x5120
 #define _STARPU_FUT_USER_DEFINED_END	0x5121
 
@@ -593,6 +596,18 @@ do {										\
 	}									\
 } while(0);
 
+#define _STARPU_TRACE_DATA_NAME(handle, name) \
+	FUT_DO_PROBE1STR(_STARPU_FUT_DATA_NAME, handle, name)
+
+#define _STARPU_TRACE_DATA_COORDINATES(handle, dim, v) \
+	switch (dim) { \
+	case 1: FUT_DO_PROBE3(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0]); break; \
+	case 2: FUT_DO_PROBE4(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1]); break; \
+	case 3: FUT_DO_PROBE5(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2]); break; \
+	case 4: FUT_DO_PROBE6(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2], v[3]); break; \
+	case 5: FUT_DO_PROBE7(_STARPU_FUT_DATA_COORDINATES, handle, dim, v[0], v[1], v[2], v[3], v[4]); break; \
+	}
+
 #define _STARPU_TRACE_DATA_COPY(src_node, dst_node, size)	\
 	FUT_DO_PROBE3(_STARPU_FUT_DATA_COPY, src_node, dst_node, size)
 
@@ -978,6 +993,7 @@ do {										\
 #define _STARPU_TRACE_GHOST_TASK_DEPS(a, b)	do {(void)(a); (void)(b);} while(0)
 #define _STARPU_TRACE_TASK_DONE(a)		do {(void)(a);} while(0)
 #define _STARPU_TRACE_TAG_DONE(a)		do {(void)(a);} while(0)
+#define _STARPU_TRACE_DATA_NAME(a, b)		do ((void)(a); (void)(b);} while(0)
 #define _STARPU_TRACE_DATA_COPY(a, b, c)		do {(void)(a); (void)(b); (void)(c);} while(0)
 #define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d,e,f)	do {(void)(a); (void)(b); (void)(c); (void)(d); (void)(e); (void)(f);} while(0)
 #define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d,e)	do {(void)(a); (void)(b); (void)(c); (void)(d); (void)(e);} while(0)

+ 25 - 0
src/datawizard/interfaces/data_interface.c

@@ -17,6 +17,7 @@
  */
 
 #include <stdint.h>
+#include <stdarg.h>
 
 #include <datawizard/datawizard.h>
 #include <datawizard/memory_nodes.h>
@@ -1055,3 +1056,27 @@ size_t starpu_data_get_size(starpu_data_handle_t handle)
 {
 	return handle->ops->get_size(handle);
 }
+
+void starpu_data_set_name(starpu_data_handle_t handle, const char *name)
+{
+	_STARPU_TRACE_DATA_NAME(handle, name);
+}
+
+void starpu_data_set_coordinates_array(starpu_data_handle_t handle, int dimensions, int dims[])
+{
+	_STARPU_TRACE_DATA_COORDINATES(handle, dimensions, dims);
+}
+
+void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...)
+{
+	int dims[dimensions];
+	unsigned i;
+	va_list varg_list;
+
+	va_start(varg_list, dimensions);
+	for (i = 0; i < dimensions; i++)
+		dims[i] = va_arg(varg_list, int);
+	va_end(varg_list);
+
+	starpu_data_set_coordinates_array(handle, dimensions, dims);
+}

+ 133 - 5
src/debug/traces/starpu_fxt.c

@@ -78,9 +78,10 @@ static FILE *distrib_time;
 static FILE *activity_file;
 static FILE *anim_file;
 static FILE *tasks_file;
+static FILE *data_file;
 static FILE *trace_file;
 
-struct data_info {
+struct data_parameter_info {
 	unsigned long handle;
 	unsigned long size;
 	int mode;
@@ -104,7 +105,7 @@ struct task_info {
 	unsigned int ndeps;
 	unsigned long *dependencies;
 	unsigned long ndata;
-	struct data_info *data;
+	struct data_parameter_info *data;
 	int mpi_rank;
 };
 
@@ -216,6 +217,58 @@ out:
 	free(task);
 }
 
+struct data_info {
+	UT_hash_handle hh;
+	unsigned long handle;
+	char *name;
+	unsigned dimensions;
+	unsigned long *dims;
+	int mpi_rank;
+};
+
+struct data_info *data_info;
+
+static struct data_info *get_data(unsigned long handle, int mpi_rank)
+{
+	struct data_info *data;
+
+	HASH_FIND(hh, data_info, &handle, sizeof(handle), data);
+	if (!data)
+	{
+		_STARPU_MALLOC(data, sizeof(*data));
+		data->handle = handle;
+		data->name = NULL;
+		data->dimensions = 0;
+		data->dims = NULL;
+		data->mpi_rank = mpi_rank;
+		HASH_ADD(hh, data_info, handle, sizeof(handle), data);
+	} else
+		STARPU_ASSERT(data->mpi_rank == mpi_rank);
+
+	return data;
+}
+
+static void data_dump(struct data_info *data)
+{
+	fprintf(data_file, "Handle: %lx\n", data->handle);
+	if (data->name)
+	{
+		fprintf(data_file, "Name: %s\n", data->name);
+		free(data->name);
+	}
+	if (data->dimensions)
+	{
+		unsigned i;
+		fprintf(data_file, "Coordinates:");
+		for (i = 0; i < data->dimensions; i++)
+			fprintf(data_file, " %lu", data->dims[i]);
+		fprintf(data_file, "\n");
+	}
+	fprintf(data_file, "\n");
+	HASH_DEL(data_info, data);
+	free(data);
+}
+
 static void set_next_other_worker_color(int workerid)
 {
 	if (workerid >= STARPU_NMAXWORKERS)
@@ -726,7 +779,7 @@ static void thread_pop_state(double time, const char *prefix, long unsigned int
 }
 
 #ifdef STARPU_ENABLE_PAJE_CODELET_DETAILS
-static void worker_set_detailed_state(double time, const char *prefix, long unsigned int workerid, const char *name, unsigned long size, const char *parameters, unsigned long footprint, unsigned long long tag, unsigned long job_id)
+static void worker_set_detailed_state(double time, const char *prefix, long unsigned int workerid, const char *name, unsigned long size, const char *parameters, unsigned long footprint, unsigned long long tag, unsigned long job_id, double gflop, unsigned X, unsigned Y, unsigned Z)
 {
 #ifdef STARPU_HAVE_POTI
 	char container[STARPU_POTI_STR_LEN];
@@ -734,7 +787,7 @@ static void worker_set_detailed_state(double time, const char *prefix, long unsi
 	/* TODO: set detailed state */
 	poti_SetState(time, container, "WS", name);
 #else
-	fprintf(out_paje_file, "20	%.9f	%sw%lu	WS	%s	%lu	%s	%08lx	%016llx	%lu\n", time, prefix, workerid, name, size, parameters, footprint, tag, job_id);
+	fprintf(out_paje_file, "20	%.9f	%sw%lu	WS	%s	%lu	%s	%08lx	%016llx	%lu	%f	%u	%u	%u\n", time, prefix, workerid, name, size, parameters, footprint, tag, job_id, gflop, X, Y, Z);
 #endif
 }
 #endif
@@ -1370,6 +1423,22 @@ static void handle_codelet_details(struct fxt_ev_64 *ev, struct starpu_fxt_optio
 	task->kflops = ev->param[3];
 	task->tag = ev->param[4];
 
+	unsigned i, X = 0, Y = 0, Z = 0;
+	for (i = 0; i < task->ndata; i++)
+	{
+		if (task->data[i].mode & STARPU_W)
+		{
+			struct data_info *data = get_data(task->data[i].handle, options->file_rank);
+			if (data->dimensions >= 1)
+				X = data->dims[0];
+			if (data->dimensions >= 2)
+				Y = data->dims[1];
+			if (data->dimensions >= 3)
+				Z = data->dims[2];
+			break;
+		}
+	}
+
 	if (out_paje_file)
 	{
 
@@ -1377,7 +1446,7 @@ static void handle_codelet_details(struct fxt_ev_64 *ev, struct starpu_fxt_optio
 		char *prefix = options->file_prefix;
 		unsigned sched_ctx = ev->param[0];
 
-		worker_set_detailed_state(last_codelet_start[worker], prefix, worker, _starpu_last_codelet_symbol[worker], ev->param[1], parameters, ev->param[2], ev->param[4], job_id);
+		worker_set_detailed_state(last_codelet_start[worker], prefix, worker, _starpu_last_codelet_symbol[worker], ev->param[1], parameters, ev->param[2], ev->param[4], job_id, ((double) task->kflops) / 1000000, X, Y, Z);
 		if (sched_ctx != 0)
 		{
 #ifdef STARPU_HAVE_POTI
@@ -1785,6 +1854,28 @@ static void handle_data_copy(void)
 {
 }
 
+static void handle_data_name(struct fxt_ev_64 *ev, struct starpu_fxt_options *options)
+{
+	unsigned long handle = ev->param[0];
+	char *name = get_fxt_string(ev, 1);
+	struct data_info *data = get_data(handle, options->file_rank);
+
+	data->name = strdup(name);
+}
+
+static void handle_data_coordinates(struct fxt_ev_64 *ev, struct starpu_fxt_options *options)
+{
+	unsigned long handle = ev->param[0];
+	unsigned dimensions = ev->param[1];
+	struct data_info *data = get_data(handle, options->file_rank);
+	unsigned i;
+
+	data->dimensions = dimensions;
+	data->dims = malloc(dimensions * sizeof(data->dims));
+	for (i = 0; i < dimensions; i++)
+		data->dims[i] = ev->param[i+2];
+}
+
 static const char *copy_link_type(unsigned prefetch)
 {
 	switch (prefetch)
@@ -2933,6 +3024,14 @@ void _starpu_fxt_parse_new_file(char *filename_in, struct starpu_fxt_options *op
 			case _STARPU_FUT_DATA_LOAD:
 			     	break;
 
+			case _STARPU_FUT_DATA_NAME:
+				handle_data_name(&ev, options);
+				break;
+
+			case _STARPU_FUT_DATA_COORDINATES:
+				handle_data_coordinates(&ev, options);
+				break;
+
 			case _STARPU_FUT_START_DRIVER_COPY:
 				if (!options->no_bus)
 					handle_start_driver_copy(&ev, options);
@@ -3275,6 +3374,16 @@ void _starpu_fxt_parse_new_file(char *filename_in, struct starpu_fxt_options *op
 #endif
 	}
 
+	if (data_file)
+	{
+		/* TODO: move to handle_data_unregister */
+		struct data_info *data, *tmp;
+		HASH_ITER(hh, data_info, data, tmp)
+		{
+			data_dump(data);
+		}
+	}
+
 	/* Close the trace file */
 	if (close(fd_in))
 	{
@@ -3294,6 +3403,7 @@ void starpu_fxt_options_init(struct starpu_fxt_options *options)
 	options->out_paje_path = "paje.trace";
 	options->dag_path = "dag.dot";
 	options->tasks_path = "tasks.rec";
+	options->data_path = "data.rec";
 	options->anim_path = "trace.html";
 	options->states_path = "trace.rec";
 	options->distrib_time_path = "distrib.data";
@@ -3361,6 +3471,15 @@ void _starpu_fxt_tasks_file_init(struct starpu_fxt_options *options)
 }
 
 static
+void _starpu_fxt_data_file_init(struct starpu_fxt_options *options)
+{
+	if (options->data_path)
+		data_file = fopen(options->data_path, "w+");
+	else
+		data_file = NULL;
+}
+
+static
 void _starpu_fxt_write_trace_header(FILE *f)
 {
 	fprintf(f, "#\n");
@@ -3412,6 +3531,13 @@ void _starpu_fxt_tasks_file_close(void)
 }
 
 static
+void _starpu_fxt_data_file_close(void)
+{
+	if (data_file)
+		fclose(data_file);
+}
+
+static
 void _starpu_fxt_trace_file_close(void)
 {
 	if (trace_file)
@@ -3499,6 +3625,7 @@ void starpu_fxt_generate_trace(struct starpu_fxt_options *options)
 	_starpu_fxt_activity_file_init(options);
 	_starpu_fxt_anim_file_init(options);
 	_starpu_fxt_tasks_file_init(options);
+	_starpu_fxt_data_file_init(options);
 	_starpu_fxt_trace_file_init(options);
 
 	_starpu_fxt_paje_file_init(options);
@@ -3628,6 +3755,7 @@ void starpu_fxt_generate_trace(struct starpu_fxt_options *options)
 	_starpu_fxt_distrib_file_close(options);
 	_starpu_fxt_anim_file_close();
 	_starpu_fxt_tasks_file_close();
+	_starpu_fxt_data_file_close();
 	_starpu_fxt_trace_file_close();
 
 	_starpu_fxt_dag_terminate();

+ 4 - 0
src/debug/traces/starpu_paje.c

@@ -141,6 +141,10 @@ void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED)
 	fprintf(file, "%%	Footprint	string\n");
 	fprintf(file, "%%	Tag	string\n");
 	fprintf(file, "%%	JobId	string\n");
+	fprintf(file, "%%	GFlop	string\n");
+	fprintf(file, "%%	X	string\n");
+	fprintf(file, "%%	Y	string\n");
+	fprintf(file, "%%	Z	string\n");
 	fprintf(file, "%%EndEventDef\n");
 #endif
 #endif