Преглед изворни кода

Distinguish between fetches, prefetches and idle fetches in the paje trace

Samuel Thibault пре 9 година
родитељ
комит
ecc274e4c0

+ 6 - 6
src/common/fxt.h

@@ -547,11 +547,11 @@ do {										\
 #define _STARPU_TRACE_DATA_COPY(src_node, dst_node, size)	\
 	FUT_DO_PROBE3(_STARPU_FUT_DATA_COPY, src_node, dst_node, size)
 
-#define _STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id)	\
-	FUT_DO_PROBE4(_STARPU_FUT_START_DRIVER_COPY, src_node, dst_node, size, com_id)
+#define _STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch)	\
+	FUT_DO_PROBE5(_STARPU_FUT_START_DRIVER_COPY, src_node, dst_node, size, com_id, prefetch)
 
-#define _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id)	\
-	FUT_DO_PROBE4(_STARPU_FUT_END_DRIVER_COPY, src_node, dst_node, size, com_id)
+#define _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch)	\
+	FUT_DO_PROBE5(_STARPU_FUT_END_DRIVER_COPY, src_node, dst_node, size, com_id, prefetch)
 
 #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node)	\
 	FUT_DO_PROBE2(_STARPU_FUT_START_DRIVER_COPY_ASYNC, src_node, dst_node)
@@ -877,8 +877,8 @@ do {										\
 #define _STARPU_TRACE_TASK_DONE(a)		do {} while(0)
 #define _STARPU_TRACE_TAG_DONE(a)		do {} while(0)
 #define _STARPU_TRACE_DATA_COPY(a, b, c)		do {} while(0)
-#define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d)	do {} while(0)
-#define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d)	do {} while(0)
+#define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d,e)	do {} while(0)
+#define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d,e)	do {} while(0)
 #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(a,b)	do {} while(0)
 #define _STARPU_TRACE_END_DRIVER_COPY_ASYNC(a,b)	do {} while(0)
 #define _STARPU_TRACE_WORK_STEALING(a, b)	do {} while(0)

+ 4 - 3
src/datawizard/copy_driver.c

@@ -484,7 +484,8 @@ int STARPU_ATTRIBUTE_WARN_UNUSED_RESULT _starpu_driver_copy_data_1_to_1(starpu_d
 									struct _starpu_data_replicate *dst_replicate,
 									unsigned donotread,
 									struct _starpu_data_request *req,
-									unsigned may_alloc)
+									unsigned may_alloc,
+									unsigned prefetch)
 {
 	if (!donotread)
 	{
@@ -529,11 +530,11 @@ int STARPU_ATTRIBUTE_WARN_UNUSED_RESULT _starpu_driver_copy_data_1_to_1(starpu_d
 
 		dst_replicate->initialized = 1;
 
-		_STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id);
+		_STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch);
 		ret_copy = copy_data_1_to_1_generic(handle, src_replicate, dst_replicate, req);
 		if (!req)
 			/* Synchronous, this is already finished */
-			_STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id);
+			_STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id, prefetch);
 
 		return ret_copy;
 	}

+ 2 - 1
src/datawizard/copy_driver.h

@@ -97,7 +97,8 @@ int _starpu_driver_copy_data_1_to_1(starpu_data_handle_t handle,
 				    struct _starpu_data_replicate *dst_replicate,
 				    unsigned donotread,
 				    struct _starpu_data_request *req,
-				    unsigned may_alloc);
+				    unsigned may_alloc,
+				    unsigned prefetch);
 
 unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel);
 void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel);

+ 3 - 3
src/datawizard/data_request.c

@@ -358,7 +358,7 @@ static void starpu_handle_data_request_completion(struct _starpu_data_request *r
 	unsigned src_node = src_replicate->memory_node;
 	unsigned dst_node = dst_replicate->memory_node;
 	size_t size = _starpu_data_get_size(handle);
-	_STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, r->com_id);
+	_STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, r->com_id, r->prefetch);
 #endif
 
 	/* Once the request has been fulfilled, we may submit the requests that
@@ -429,7 +429,7 @@ static void starpu_handle_data_request_completion(struct _starpu_data_request *r
 }
 
 /* TODO : accounting to see how much time was spent working for other people ... */
-static int starpu_handle_data_request(struct _starpu_data_request *r, unsigned may_alloc, int prefetch STARPU_ATTRIBUTE_UNUSED)
+static int starpu_handle_data_request(struct _starpu_data_request *r, unsigned may_alloc, int prefetch)
 {
 	starpu_data_handle_t handle = r->handle;
 
@@ -468,7 +468,7 @@ static int starpu_handle_data_request(struct _starpu_data_request *r, unsigned m
 
 	if (dst_replicate->state == STARPU_INVALID)
 		r->retval = _starpu_driver_copy_data_1_to_1(handle, src_replicate,
-						    dst_replicate, !(r_mode & STARPU_R), r, may_alloc);
+						    dst_replicate, !(r_mode & STARPU_R), r, may_alloc, prefetch);
 	else
 		/* Already valid actually, no need to transfer anything */
 		r->retval = 0;

+ 18 - 4
src/debug/traces/starpu_fxt.c

@@ -1232,12 +1232,24 @@ static void handle_data_copy(void)
 {
 }
 
+static const char *copy_link_type(unsigned prefetch)
+{
+	switch (prefetch)
+	{
+		case 0: return "F";
+		case 1: return "PF";
+		case 2: return "IF";
+	}
+}
+
 static void handle_start_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_options *options)
 {
 	unsigned src = ev->param[0];
 	unsigned dst = ev->param[1];
 	unsigned size = ev->param[2];
 	unsigned comid = ev->param[3];
+	unsigned prefetch = ev->param[4];
+	const char *link_type = copy_link_type(prefetch);
 
 	char *prefix = options->file_prefix;
 
@@ -1254,9 +1266,9 @@ static void handle_start_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_opt
 			snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid);
 			program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix);
 			memmanager_container_alias(src_memnode_container, STARPU_POTI_STR_LEN, prefix, src);
-			poti_StartLink(time, program_container, "L", src_memnode_container, paje_value, paje_key);
+			poti_StartLink(time, program_container, link_type, src_memnode_container, paje_value, paje_key);
 #else
-			fprintf(out_paje_file, "18	%.9f	L	%sp	%u	%smm%u	com_%u\n", time, prefix, size, prefix, src, comid);
+			fprintf(out_paje_file, "18	%.9f	%s	%sp	%u	%smm%u	com_%u\n", time, link_type, prefix, size, prefix, src, comid);
 #endif
 		}
 
@@ -1312,6 +1324,8 @@ static void handle_end_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_optio
 	unsigned dst = ev->param[1];
 	unsigned size = ev->param[2];
 	unsigned comid = ev->param[3];
+	unsigned prefetch = ev->param[4];
+	const char *link_type = copy_link_type(prefetch);
 
 	char *prefix = options->file_prefix;
 
@@ -1328,9 +1342,9 @@ static void handle_end_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_optio
 			snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid);
 			program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix);
 			memmanager_container_alias(dst_memnode_container, STARPU_POTI_STR_LEN, prefix, dst);
-			poti_EndLink(time, program_container, "L", dst_memnode_container, paje_value, paje_key);
+			poti_EndLink(time, program_container, link_type, dst_memnode_container, paje_value, paje_key);
 #else
-			fprintf(out_paje_file, "19	%.9f	L	%sp	%u	%smm%u	com_%u\n", time, prefix, size, prefix, dst, comid);
+			fprintf(out_paje_file, "19	%.9f	%s	%sp	%u	%smm%u	com_%u\n", time, link_type, prefix, size, prefix, dst, comid);
 #endif
 		}
 

+ 6 - 2
src/debug/traces/starpu_paje.c

@@ -240,7 +240,9 @@ void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED)
 
 	/* Link types */
 	poti_DefineLinkType("MPIL", "P", "MPICt", "MPICt", "MPI communications");
-	poti_DefineLinkType("L", "P", "Mm", "Mm", "Intra-node communications");
+	poti_DefineLinkType("F", "P", "Mm", "Mm", "Intra-node data Fetch");
+	poti_DefineLinkType("PF", "P", "Mm", "Mm", "Intra-node data PreFetch");
+	poti_DefineLinkType("IF", "P", "Mm", "Mm", "Intra-node data IdleFetch");
 	poti_DefineLinkType("WSL", "P", "W", "W", "Work steals");
 
 	/* Creating the MPI Program */
@@ -330,7 +332,9 @@ void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED)
 6       CoA      MS     DriverCopyAsync         \".1 .3 .1\"		\n\
 6       No       MS     Nothing         \".0 .0 .0\"		\n\
 5       MPIL     P	MPICt	MPICt   MPIL			\n\
-5       L       P	Mm	Mm      L\n\
+5       F       P	Mm	Mm      F\n\
+5       PF      P	Mm	Mm      PF\n\
+5       IF      P	Mm	Mm      IF\n\
 5       WSL     P	W	W       WSL\n");
 
 	fprintf(file, "7      0.0 MPIroot      MPIP      0       root\n");