Pārlūkot izejas kodu

Add STARPU_WORKER_ORDER to be able to specify workerorder from insert_task calls

Samuel Thibault 10 gadi atpakaļ
vecāks
revīzija
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;
 <li> ::STARPU_DATA_ARRAY followed by an array of data handles and its
 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
 starpu_task::execute_on_a_specific_worker)
 <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
 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
 \ingroup API_Insert_Task
 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_EXECUTE_ON_WORKER (17<<18)
 #define STARPU_TAG_ONLY          (18<<18)
+#define STARPU_WORKER_ORDER      (19<<18)
 
 struct starpu_task *starpu_task_build(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()
 			(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)
 		{
 			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()
 			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)
 		{
 			(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);
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list_copy, unsigned);
+		}
 		else if (arg_type==STARPU_HYPERVISOR_TAG)
 		{
 			(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);
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list, unsigned);
+		}
 		else if (arg_type==STARPU_SCHED_CTX)
 		{
 			(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);
 		}
+		else if (arg_type==STARPU_WORKER_ORDER)
+		{
+			va_arg(varg_list, unsigned);
+		}
 		else if (arg_type==STARPU_SCHED_CTX)
 		{
 			(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;
 			}
 		}
+		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)
 		{
 			unsigned sched_ctx = va_arg(varg_list, unsigned);