소스 검색

Separate codelets in starpu_fxt_data_trace tool

Joris Pablo 12 년 전
부모
커밋
9d66bc1301

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 93452 - 356126
doc/doxygen/chapters/data_trace.eps


BIN
doc/doxygen/chapters/data_trace.pdf


BIN
doc/doxygen/chapters/data_trace.png


+ 3 - 3
doc/doxygen/chapters/performance_feedback.doxy

@@ -587,9 +587,9 @@ It is possible to get statistics about tasks length and data size by using :
 \verbatim
 $starpu_fxt_data_trace filename
 \endverbatim
-Where filename is the FxT trace file. This will create 2 files : <c>data_total.txt</c> which
-shows each task length and total data size and <c>data_trace.gp</c> which can be plotted to 
-get a .eps image of these results. On the image, each point represents a task.
+Where filename is the FxT trace file. This will create a file, <c>data_trace.gp</c> which
+can be plotted to get a .eps image of these results. On the image, each point represents a 
+task, and each color corresponds to a codelet.
 
 \image html data_trace.png
 \image latex data_trace.eps "" width=\textwidth

+ 60 - 13
src/debug/traces/starpu_fxt.c

@@ -17,6 +17,7 @@
 #include <starpu.h>
 #include <common/config.h>
 #include <common/uthash.h>
+#include <string.h>
 
 #ifdef STARPU_HAVE_POTI
 #include <poti.h>
@@ -1890,25 +1891,52 @@ void starpu_fxt_generate_trace(struct starpu_fxt_options *options)
 	options->nworkers = nworkers;
 }
 
-static FILE *out_data_total_trace_file;
+#define DATA_STR_MAX_SIZE 15
 
 struct parse_task
 {
 	unsigned exec_time;
 	unsigned data_total;
+	char *codelet_name;
 };
 
 static struct parse_task tasks[STARPU_NMAXWORKERS];
 
+struct starpu_data_trace_kernel
+{
+	UT_hash_handle hh;
+	char *name;
+	FILE *file;
+} *kernels;
+
 #define NANO_SEC_TO_MILI_SEC 0.000001
 
+static FILE *codelet_list;
+
 static void write_task(struct parse_task pt)
 {
+	struct starpu_data_trace_kernel *kernel;
+	char *codelet_name = pt.codelet_name;
+	HASH_FIND_STR(kernels, codelet_name, kernel);
+	//fprintf(stderr, "%p %p %s\n", kernel, kernels, codelet_name);
+	if(kernel == NULL)
+	{
+		kernel = malloc(sizeof(*kernel));
+		kernel->name = strdup(codelet_name);
+		//fprintf(stderr, "%s\n", kernel->name);
+		kernel->file = fopen(codelet_name, "w+");
+		if(!kernel->file)
+		{
+			perror("open failed :");
+			exit(-1);
+		}
+		HASH_ADD_STR(kernels, name, kernel); 
+		fprintf(codelet_list, "%s\n", codelet_name);
+	}
 	double time = pt.exec_time * NANO_SEC_TO_MILI_SEC;
-	fprintf(out_data_total_trace_file, "%lf %d\n", time, pt.data_total);
+	fprintf(kernel->file, "%lf %d\n", time, pt.data_total);
 }
 
-
 void starpu_fxt_write_data_trace(char *filename_in)
 {
 	int fd_in;
@@ -1927,17 +1955,21 @@ void starpu_fxt_write_data_trace(char *filename_in)
 	        exit(-1);
 	}
 
+	codelet_list = fopen("codelet_list", "w+");
+	if(!codelet_list)
+	{
+		perror("open failed :");
+		exit(-1);
+	}
+
 	fxt_blockev_t block;
 	block = fxt_blockev_enter(fut);
 
-	out_data_total_trace_file = fopen("data_total.txt", "w+");
-	if(!out_data_total_trace_file)
-        {
-                perror("open failed :");
-                exit(-1);
-        }
-
 	struct fxt_ev_64 ev;
+
+	unsigned workerid;
+	unsigned long has_name = 0;
+
 	while(1)
 	{
 		int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev);
@@ -1946,8 +1978,6 @@ void starpu_fxt_write_data_trace(char *filename_in)
 			break;
 		}
 		
-		unsigned workerid;
-
 		switch (ev.code)
 		{
 		case _STARPU_FUT_WORKER_INIT_START:
@@ -1957,6 +1987,9 @@ void starpu_fxt_write_data_trace(char *filename_in)
 		case _STARPU_FUT_START_CODELET_BODY:
 			workerid = find_worker_id(ev.param[2]);
 			tasks[workerid].exec_time = ev.time;
+			has_name = ev.param[3];
+			tasks[workerid].codelet_name = strdup(has_name ? (char *) &ev.param[4] : "unknow");
+			//fprintf(stderr, "start codelet :[%d][%s]\n", workerid, tasks[workerid].codelet_name);
 			break;
 			
 		case _STARPU_FUT_END_CODELET_BODY:
@@ -1985,11 +2018,25 @@ void starpu_fxt_write_data_trace(char *filename_in)
 	        exit(-1);
 	}
 	
-	if(fclose(out_data_total_trace_file))
+	if(fclose(codelet_list))
 	{
 		perror("close failed :");
 		exit(-1);
 	}
+	
+	struct starpu_data_trace_kernel *kernel, *tmp;	
 
+	HASH_ITER(hh, kernels, kernel, tmp)
+	{
+		if(fclose(kernel->file))
+		{ 
+			perror("close failed :");
+			exit(-1);
+		}
+		HASH_DEL(kernels, kernel);
+		free(kernel->name);
+		free(kernel);
+	}
+		
 }
 #endif // STARPU_USE_FXT

+ 33 - 3
tools/starpu_fxt_data_trace.c

@@ -1,8 +1,10 @@
 #include <stdio.h>
 #include <config.h>
 #include <starpu.h>
+#include <string.h>
 
 #define PROGNAME "starpu_fxt_data_trace"
+#define MAX_LINE_SIZE 100
 
 static void usage(char *progname)
 {
@@ -11,9 +13,16 @@ static void usage(char *progname)
 }
 
 static void write_plt(){
+	FILE *codelet_list = fopen("codelet_list", "r");
+	if(!codelet_list)
+	{
+		perror("Error while opening codelet list:");
+		exit(-1);
+	}
+	char codelet_name[MAX_LINE_SIZE];
 	FILE *plt = fopen("data_trace.gp", "w+");
 	if(!plt){
-		fprintf(stderr, "Error while creating data_trace.plt");
+		perror("Error while creating data_trace.plt:");
 		exit(-1);
 	}
 
@@ -25,8 +34,29 @@ static void write_plt(){
 	fprintf(plt, "set logscale y\n");
 	fprintf(plt, "set xlabel \"tasks size (ms)\"\n");
 	fprintf(plt, "set ylabel \"data size (B)\"\n");
-	fprintf(plt, "plot \"data_total.txt\" using 1:2 with dots lw 1\n");
-	if(fclose(plt)){
+	fprintf(plt, "plot ");
+	int begin = 1;
+	while(fgets(codelet_name, MAX_LINE_SIZE, codelet_list) != NULL)
+	{
+		if(begin)
+			begin = 0;
+		else
+			fprintf(plt, ", ");
+		int size = strlen(codelet_name);
+		if(size > 0)
+			codelet_name[size-1] = '\0';
+		fprintf(plt, "\"%s\" using 1:2 with dots lw 1 title \"%s\"", codelet_name, codelet_name);
+	}
+	fprintf(plt, "\n");
+
+	if(fclose(codelet_list))
+	{
+		perror("close failed :");
+		exit(-1);
+	}
+
+	if(fclose(plt))
+	{
 		perror("close failed :");
 		exit(-1);
 	}