瀏覽代碼

new starpu_task_insert parameter STARPU_TASK_DEPS_ARRAY, similar behaviour to function starpu_task_declare_deps_array()

Nathalie Furmento 7 年之前
父節點
當前提交
24b4ea25cc

+ 3 - 0
ChangeLog

@@ -63,6 +63,9 @@ Small features:
     extra MPI debug messages.
   * New starpu_task_insert parameter STARPU_CL_ARGS_NFREE which allows
     to set codelet parameters but without freeing them.
+  * New starpu_task_insert parameter STARPU_TASK_DEPS_ARRAY which
+    allows to declare task dependencies similarly to
+    starpu_task_declare_deps_array()
 
 Changes:
   * Vastly improve simgrid simulation time.

+ 8 - 0
doc/doxygen/chapters/api/insert_task.doxy

@@ -32,6 +32,7 @@ starpu_task::execute_on_a_specific_worker)
 <li> the specific values ::STARPU_VALUE, ::STARPU_CALLBACK,
 ::STARPU_CALLBACK_ARG, ::STARPU_CALLBACK_WITH_ARG, ::STARPU_PRIORITY,
 ::STARPU_TAG, ::STARPU_TAG_ONLY, ::STARPU_FLOPS, ::STARPU_SCHED_CTX, ::STARPU_CL_ARGS, ::STARPU_CL_ARGS_NFREE,
+::STARPU_TASK_DEPS_ARRAY,
 followed by the appropriated objects as defined elsewhere.
 </ul>
 
@@ -138,6 +139,13 @@ Used when calling starpu_task_insert(), must
 be followed by the id of the scheduling context to which to submit the
 task to.
 
+\def STARPU_TASK_DEPS_ARRAY
+\ingroup API_Insert_Task
+Used when calling starpu_task_insert(), must
+be followed by a number of tasks, and an array containing these tasks.
+The function starpu_task_declare_deps_array() will be called with the
+given values.
+
 \fn void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...)
 \ingroup API_Insert_Task
 Pack arguments of type ::STARPU_VALUE into a buffer which can be

+ 2 - 0
include/fstarpu_mod.f90

@@ -33,6 +33,7 @@ module fstarpu_mod
         type(c_ptr), bind(C) :: FSTARPU_DATA_MODE_ARRAY
         type(c_ptr), bind(C) :: FSTARPU_CL_ARGS
         type(c_ptr), bind(C) :: FSTARPU_CL_ARGS_NFREE
+        type(c_ptr), bind(C) :: FSTARPU_TASK_DEPS_ARRAY
         type(c_ptr), bind(C) :: FSTARPU_CALLBACK
         type(c_ptr), bind(C) :: FSTARPU_CALLBACK_WITH_ARG
         type(c_ptr), bind(C) :: FSTARPU_CALLBACK_ARG
@@ -2261,6 +2262,7 @@ module fstarpu_mod
                         FSTARPU_DATA_MODE_ARRAY = fstarpu_get_constant(C_CHAR_"FSTARPU_DATA_MODE_ARRAY"//C_NULL_CHAR)
                         FSTARPU_CL_ARGS = fstarpu_get_constant(C_CHAR_"FSTARPU_CL_ARGS"//C_NULL_CHAR)
                         FSTARPU_CL_ARGS_NFREE = fstarpu_get_constant(C_CHAR_"FSTARPU_CL_ARGS_NFREE"//C_NULL_CHAR)
+                        FSTARPU_TASK_DEPS_ARRAY = fstarpu_get_constant(C_CHAR_"FSTARPU_TASK_DEPS_ARRAY"//C_NULL_CHAR)
                         FSTARPU_CALLBACK        = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK"//C_NULL_CHAR)
                         FSTARPU_CALLBACK_WITH_ARG       = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK_WITH_ARG"//C_NULL_CHAR)
                         FSTARPU_CALLBACK_ARG    = fstarpu_get_constant(C_CHAR_"FSTARPU_CALLBACK_ARG"//C_NULL_CHAR)

+ 2 - 1
include/starpu_task_util.h

@@ -62,7 +62,8 @@ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t
 #define STARPU_NAME		 (24<<STARPU_MODE_SHIFT)
 #define STARPU_CL_ARGS		(25<<STARPU_MODE_SHIFT)
 #define STARPU_CL_ARGS_NFREE	(26<<STARPU_MODE_SHIFT)
-#define STARPU_SHIFTED_MODE_MAX (27<<STARPU_MODE_SHIFT)
+#define STARPU_TASK_DEPS_ARRAY	(27<<STARPU_MODE_SHIFT)
+#define STARPU_SHIFTED_MODE_MAX (28<<STARPU_MODE_SHIFT)
 
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
 int starpu_task_insert(struct starpu_codelet *cl, ...);

+ 5 - 0
mpi/src/starpu_mpi_task_insert.c

@@ -356,6 +356,11 @@ int _starpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nod
 			(void)va_arg(varg_list, void *);
 			(void)va_arg(varg_list, size_t);
 		}
+		else if (arg_type==STARPU_TASK_DEPS_ARRAY)
+		{
+			(void)va_arg(varg_list, unsigned);
+			(void)va_arg(varg_list, struct starpu_task **);
+		}
 		else if (arg_type==STARPU_CALLBACK)
 		{
 			(void)va_arg(varg_list_copy, _starpu_callback_func_t);

+ 7 - 0
mpi/src/starpu_mpi_task_insert_fortran.c

@@ -183,6 +183,13 @@ int _fstarpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_no
 			arg_i++;
 			/* size_t */
 		}
+		else if (arg_type==STARPU_TASK_DEPS_ARRAY)
+		{
+			arg_i++;
+			/* unsigned */
+			arg_i++;
+			/* struct starpu_task ** */
+		}
 		else if (arg_type==STARPU_CALLBACK)
 		{
 			arg_i++;

+ 2 - 0
src/util/fstarpu.c

@@ -35,6 +35,7 @@ static const intptr_t fstarpu_data_array	= STARPU_DATA_ARRAY;
 static const intptr_t fstarpu_data_mode_array	= STARPU_DATA_MODE_ARRAY;
 static const intptr_t fstarpu_cl_args	= STARPU_CL_ARGS;
 static const intptr_t fstarpu_cl_args_nfree	= STARPU_CL_ARGS_NFREE;
+static const intptr_t fstarpu_task_deps_array	= STARPU_TASK_DEPS_ARRAY;
 static const intptr_t fstarpu_callback	= STARPU_CALLBACK;
 static const intptr_t fstarpu_callback_with_arg	= STARPU_CALLBACK_WITH_ARG;
 static const intptr_t fstarpu_callback_arg	= STARPU_CALLBACK_ARG;
@@ -107,6 +108,7 @@ intptr_t fstarpu_get_constant(char *s)
 	else if	(!strcmp(s, "FSTARPU_DATA_MODE_ARRAY"))	{ return fstarpu_data_mode_array; }
 	else if	(!strcmp(s, "FSTARPU_CL_ARGS"))	{ return fstarpu_cl_args; }
 	else if	(!strcmp(s, "FSTARPU_CL_ARGS_NFREE"))	{ return fstarpu_cl_args_nfree; }
+	else if	(!strcmp(s, "FSTARPU_TASK_DEPS_ARRAY"))	{ return fstarpu_task_deps_array; }
 	else if	(!strcmp(s, "FSTARPU_CALLBACK"))	{ return fstarpu_callback; }
 	else if	(!strcmp(s, "FSTARPU_CALLBACK_WITH_ARG"))	{ return fstarpu_callback_with_arg; }
 	else if	(!strcmp(s, "FSTARPU_CALLBACK_ARG"))	{ return fstarpu_callback_arg; }

+ 33 - 0
src/util/starpu_task_insert_utils.c

@@ -83,6 +83,11 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_lis
 			(void)va_arg(varg_list, void *);
 			(void)va_arg(varg_list, size_t);
 		}
+		else if (arg_type==STARPU_TASK_DEPS_ARRAY)
+		{
+			(void)va_arg(varg_list, unsigned);
+			(void)va_arg(varg_list, struct starpu_task **);
+		}
 		else if (arg_type==STARPU_CALLBACK)
 		{
 			(void)va_arg(varg_list, _starpu_callback_func_t);
@@ -306,6 +311,8 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **t
 	int current_buffer;
 	int nargs = 0;
 	int allocated_buffers = 0;
+	unsigned ndeps = 0;
+	struct starpu_task **task_deps_array = NULL;
 
 	_STARPU_TRACE_TASK_BUILD_START();
 
@@ -354,6 +361,12 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **t
 			(*task)->cl_arg_size = va_arg(varg_list, size_t);
 			(*task)->cl_arg_free = 0;
 		}
+		else if (arg_type==STARPU_TASK_DEPS_ARRAY)
+		{
+			STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' cannot be set twice");
+			ndeps = va_arg(varg_list, unsigned);
+			task_deps_array = va_arg(varg_list, struct starpu_task **);
+		}
 		else if (arg_type==STARPU_CALLBACK)
 		{
 			(*task)->callback_func = va_arg(varg_list, _starpu_callback_func_t);
@@ -496,6 +509,11 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **t
 		arg_buffer_ = NULL;
 	}
 
+	if (task_deps_array)
+	{
+		starpu_task_declare_deps_array((*task), ndeps, task_deps_array);
+	}
+
 	_STARPU_TRACE_TASK_BUILD_END();
 	return 0;
 }
@@ -509,6 +527,8 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **
 	int current_buffer = 0;
 	int nargs = 0;
 	int allocated_buffers = 0;
+	unsigned ndeps = 0;
+	struct starpu_task **task_deps_array = NULL;
 
 	_STARPU_TRACE_TASK_BUILD_START();
 
@@ -568,6 +588,14 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **
 			(*task)->cl_arg_size = (size_t)(intptr_t)arglist[arg_i];
 			(*task)->cl_arg_free = 0;
 		}
+		else if (arg_type==STARPU_TASK_DEPS_ARRAY)
+		{
+			STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' cannot be set twice");
+			arg_i++;
+			ndeps = *(unsigned *)arglist[arg_i];
+			arg_i++;
+			task_deps_array = arglist[arg_i];
+		}
 		else if (arg_type == STARPU_CALLBACK)
 		{
 			arg_i++;
@@ -726,6 +754,11 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **
 		arg_buffer_ = NULL;
 	}
 
+	if (task_deps_array)
+	{
+		starpu_task_declare_deps_array(*task, ndeps, task_deps_array);
+	}
+
 	_STARPU_TRACE_TASK_BUILD_END();
 
 	return 0;