Browse Source

Add STARPU_WORKER_ORDER to be able to specify workerorder from insert_task calls

Samuel Thibault 10 years ago
parent
commit
9d8e413617

+ 7 - 1
doc/doxygen/chapters/api/insert_task.doxy

@@ -23,7 +23,7 @@ The arguments following the codelet can be of the following types:
 ::STARPU_REDUX an access mode followed by a data handle;
 ::STARPU_REDUX an access mode followed by a data handle;
 <li> ::STARPU_DATA_ARRAY followed by an array of data handles and its
 <li> ::STARPU_DATA_ARRAY followed by an array of data handles and its
 number of elements;
 number of elements;
-<li> ::STARPU_EXECUTE_ON_WORKER followed by an integer value
+<li> ::STARPU_EXECUTE_ON_WORKER, ::STARPU_WORKER_ORDER followed by an integer value
 specifying the worker on which to execute the task (as specified by
 specifying the worker on which to execute the task (as specified by
 starpu_task::execute_on_a_specific_worker)
 starpu_task::execute_on_a_specific_worker)
 <li> the specific values ::STARPU_VALUE, ::STARPU_CALLBACK,
 <li> the specific values ::STARPU_VALUE, ::STARPU_CALLBACK,
@@ -80,6 +80,12 @@ this macro is used when calling starpu_task_insert(), and must be
 followed by an integer value specifying the worker on which to execute
 followed by an integer value specifying the worker on which to execute
 the task (as specified by starpu_task::execute_on_a_specific_worker)
 the task (as specified by starpu_task::execute_on_a_specific_worker)
 
 
+\def STARPU_WORKER_ORDER
+\ingroup API_Insert_Task
+this macro is used when calling starpu_task_insert(), and must be
+followed by an integer value specifying the worker order in which to execute
+the tasks (as specified by starpu_task::workerorder)
+
 \def STARPU_TAG
 \def STARPU_TAG
 \ingroup API_Insert_Task
 \ingroup API_Insert_Task
 this macro is used when calling starpu_task_insert(), and must be followed by a tag.
 this macro is used when calling starpu_task_insert(), and must be followed by a tag.

+ 1 - 0
include/starpu_task_util.h

@@ -50,6 +50,7 @@ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t
 #define STARPU_PROLOGUE_CALLBACK_POP_ARG (16<<18)
 #define STARPU_PROLOGUE_CALLBACK_POP_ARG (16<<18)
 #define STARPU_EXECUTE_ON_WORKER (17<<18)
 #define STARPU_EXECUTE_ON_WORKER (17<<18)
 #define STARPU_TAG_ONLY          (18<<18)
 #define STARPU_TAG_ONLY          (18<<18)
+#define STARPU_WORKER_ORDER      (19<<18)
 
 
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
 int starpu_task_insert(struct starpu_codelet *cl, ...);
 int starpu_task_insert(struct starpu_codelet *cl, ...);

+ 16 - 0
mpi/src/starpu_mpi_task_insert.c

@@ -234,6 +234,12 @@ int _starpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nod
 			// calling function _starpu_task_insert_create()
 			// calling function _starpu_task_insert_create()
 			(void)va_arg(varg_list_copy, int);
 			(void)va_arg(varg_list_copy, int);
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			// the flag is decoded and set later when
+			// calling function _starpu_task_insert_create()
+			(void)va_arg(varg_list_copy, unsigned);
+		}
 		else if (arg_type_nocommute==STARPU_R || arg_type_nocommute==STARPU_W || arg_type_nocommute==STARPU_RW || arg_type==STARPU_SCRATCH || arg_type==STARPU_REDUX)
 		else if (arg_type_nocommute==STARPU_R || arg_type_nocommute==STARPU_W || arg_type_nocommute==STARPU_RW || arg_type==STARPU_SCRATCH || arg_type==STARPU_REDUX)
 		{
 		{
 			starpu_data_handle_t data = va_arg(varg_list_copy, starpu_data_handle_t);
 			starpu_data_handle_t data = va_arg(varg_list_copy, starpu_data_handle_t);
@@ -467,6 +473,12 @@ int _starpu_mpi_task_build_v(MPI_Comm comm, struct starpu_codelet *codelet, stru
 			// calling function _starpu_task_insert_create()
 			// calling function _starpu_task_insert_create()
 			va_arg(varg_list_copy, int);
 			va_arg(varg_list_copy, int);
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			// the flag is decoded and set later when
+			// calling function _starpu_task_insert_create()
+			va_arg(varg_list_copy, unsigned);
+		}
 		else if (arg_type==STARPU_HYPERVISOR_TAG)
 		else if (arg_type==STARPU_HYPERVISOR_TAG)
 		{
 		{
 			(void)va_arg(varg_list_copy, int);
 			(void)va_arg(varg_list_copy, int);
@@ -609,6 +621,10 @@ int _starpu_mpi_task_postbuild_v(MPI_Comm comm, struct starpu_codelet *codelet,
 		{
 		{
 			va_arg(varg_list_copy, int);
 			va_arg(varg_list_copy, int);
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list_copy, unsigned);
+		}
 		else if (arg_type==STARPU_HYPERVISOR_TAG)
 		else if (arg_type==STARPU_HYPERVISOR_TAG)
 		{
 		{
 			(void)va_arg(varg_list_copy, int);
 			(void)va_arg(varg_list_copy, int);

+ 17 - 0
src/util/starpu_task_insert_utils.c

@@ -118,6 +118,10 @@ void _starpu_task_insert_get_args_size(va_list varg_list, unsigned *nbuffers, si
 		{
 		{
 			va_arg(varg_list, int);
 			va_arg(varg_list, int);
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list, unsigned);
+		}
 		else if (arg_type==STARPU_SCHED_CTX)
 		else if (arg_type==STARPU_SCHED_CTX)
 		{
 		{
 			(void)va_arg(varg_list, unsigned);
 			(void)va_arg(varg_list, unsigned);
@@ -231,6 +235,10 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 		{
 		{
 			va_arg(varg_list, int);
 			va_arg(varg_list, int);
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list, unsigned);
+		}
 		else if (arg_type==STARPU_SCHED_CTX)
 		else if (arg_type==STARPU_SCHED_CTX)
 		{
 		{
 			(void)va_arg(varg_list, unsigned);
 			(void)va_arg(varg_list, unsigned);
@@ -405,6 +413,15 @@ void _starpu_task_insert_create(void *arg_buffer, size_t arg_buffer_size, struct
 				(*task)->execute_on_a_specific_worker = 1;
 				(*task)->execute_on_a_specific_worker = 1;
 			}
 			}
 		}
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			unsigned order = va_arg(varg_list, unsigned);
+			if (order != 0)
+			{
+				STARPU_ASSERT_MSG((*task)->execute_on_a_specific_worker, "worker order only makes sense if a workerid is provided");
+				(*task)->workerorder = order;
+			}
+		}
 		else if (arg_type==STARPU_SCHED_CTX)
 		else if (arg_type==STARPU_SCHED_CTX)
 		{
 		{
 			unsigned sched_ctx = va_arg(varg_list, unsigned);
 			unsigned sched_ctx = va_arg(varg_list, unsigned);