Quellcode durchsuchen

Add mode values STARPU_EPILOGUE_CALLBACK and STARPU_EPILOGUE_CALLBACK_ARG for starpu_task_insert

HE Kun vor 4 Jahren
Ursprung
Commit
936489d835

+ 6 - 0
include/starpu_task.h

@@ -825,6 +825,9 @@ struct starpu_task
 	   is executed before task dependencies release. The callback is passed 
 	   the value contained in the starpu_task::epilogue_callback_arg field. 
 	   No callback is executed if the field is set to <c>NULL</c>.
+
+	   With starpu_task_insert() and alike this can be specified thanks to
+	   ::STARPU_EPILOGUE_CALLBACK followed by the function pointer.
 	*/
 	void (*epilogue_callback_func)(void *);
 	/**
@@ -832,6 +835,9 @@ struct starpu_task
 	   the pointer passed to the epilogue callback function. This field is
 	   ignored if the field starpu_task::epilogue_callback_func is set to
 	   <c>NULL</c>.
+
+	   With starpu_task_insert() and alike this can be specified thanks to
+	   ::STARPU_EPILOGUE_CALLBACK_ARG followed by the argument.
 	*/
 	void *epilogue_callback_arg;
 

+ 17 - 1
include/starpu_task_util.h

@@ -343,7 +343,23 @@ extern "C"
 */
 #define STARPU_TASK_LINE	 (43<<STARPU_MODE_SHIFT)
 
-#define STARPU_SHIFTED_MODE_MAX (44<<STARPU_MODE_SHIFT)
+/**
+   Used when calling starpu_task_insert(), must be followed by a
+   pointer to a epilogue callback function
+*/
+#define STARPU_EPILOGUE_CALLBACK   (44<<STARPU_MODE_SHIFT)
+
+/**
+   Used when calling starpu_task_insert(), must be followed by a
+   pointer to be given as an argument to the epilogue callback
+   function
+*/
+#define STARPU_EPILOGUE_CALLBACK_ARG   (45<<STARPU_MODE_SHIFT)
+
+/**
+   This has to be the last mode value plus 1
+*/
+#define STARPU_SHIFTED_MODE_MAX (46<<STARPU_MODE_SHIFT)
 
 /**
    Set the given \p task corresponding to \p cl with the following arguments.

+ 27 - 19
mpi/src/starpu_mpi_task_insert.c

@@ -386,6 +386,14 @@ int _starpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nod
 		{
 			(void)va_arg(varg_list_copy, void *);
 		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK)
+        {
+			(void)va_arg(varg_list_copy, _starpu_callback_func_t);
+		}
+        else if (arg_type==STARPU_EPILOGUE_CALLBACK_ARG)
+        {
+            (void)va_arg(varg_list_copy, void *);
+        }
 		else if (arg_type==STARPU_PRIORITY)
 		{
 			prio = va_arg(varg_list_copy, int);
@@ -411,28 +419,28 @@ int _starpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_nod
 			(void)va_arg(varg_list_copy, unsigned);
 		}
 		else if (arg_type==STARPU_PROLOGUE_CALLBACK)
-                {
+        {
 			(void)va_arg(varg_list_copy, _starpu_callback_func_t);
 		}
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG)
-                {
-                        (void)va_arg(varg_list_copy, void *);
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG_NFREE)
-                {
-                        (void)va_arg(varg_list_copy, void *);
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
-                {
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG)
+        {
+            (void)va_arg(varg_list_copy, void *);
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG_NFREE)
+        {
+            (void)va_arg(varg_list_copy, void *);
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
+        {
 			(void)va_arg(varg_list_copy, _starpu_callback_func_t);
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
-                {
-                        (void)va_arg(varg_list_copy, void *);
-		}
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE)
-                {
-                        (void)va_arg(varg_list_copy, void *);
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
+        {
+            (void)va_arg(varg_list_copy, void *);
+		}
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE)
+        {
+            (void)va_arg(varg_list_copy, void *);
 		}
 		else if (arg_type==STARPU_EXECUTE_WHERE)
 		{

+ 24 - 14
mpi/src/starpu_mpi_task_insert_fortran.c

@@ -225,6 +225,16 @@ int _fstarpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_no
 			arg_i++;
 			/* void* */
 		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK)
+        {
+			arg_i++;
+			/* _starpu_callback_func_t */
+		}
+        else if (arg_type==STARPU_EPILOGUE_CALLBACK_ARG)
+        {
+			arg_i++;
+			/* void* */
+		}
 		else if (arg_type==STARPU_PRIORITY)
 		{
 			arg_i++;
@@ -256,32 +266,32 @@ int _fstarpu_mpi_task_decode_v(struct starpu_codelet *codelet, int me, int nb_no
 			/* unsigned* */
 		}
 		else if (arg_type==STARPU_PROLOGUE_CALLBACK)
-                {
+        {
 			arg_i++;
 			/* _starpu_callback_func_t */
 		}
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG)
-                {
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG)
+        {
 			arg_i++;
 			/* void* */
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG_NFREE)
-                {
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG_NFREE)
+        {
 			arg_i++;
 			/* void* */
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
-                {
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP)
+        {
 			arg_i++;
 			/* _starpu_callback_func_t */
-                }
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
-                {
+        }
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG)
+        {
 			arg_i++;
 			/* void* */
 		}
-                else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE)
-                {
+        else if (arg_type==STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE)
+        {
 			arg_i++;
 			/* void* */
 		}

+ 28 - 0
src/util/starpu_task_insert_utils.c

@@ -196,6 +196,14 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_lis
 		{
 			(void)va_arg(varg_list, void *);
 		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK)
+		{
+			(void)va_arg(varg_list, _starpu_callback_func_t);
+		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK_ARG)
+		{
+			(void)va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_PROLOGUE_CALLBACK)
 		{
 			va_arg(varg_list, _starpu_callback_func_t);
@@ -544,6 +552,15 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *ta
 			task->callback_arg = va_arg(varg_list, void *);
 			task->callback_arg_free = 0;
 		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK)
+		{
+			task->epilogue_callback_func = va_arg(varg_list, _starpu_callback_func_t);
+		}
+		else if (arg_type==STARPU_EPILOGUE_CALLBACK_ARG)
+		{
+			task->epilogue_callback_arg = va_arg(varg_list, void *);
+			task->epilogue_callback_arg_free = 1;
+		}
 		else if (arg_type==STARPU_PROLOGUE_CALLBACK)
 		{
 			task->prologue_callback_func = va_arg(varg_list, _starpu_callback_func_t);
@@ -857,6 +874,17 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *t
 			task->callback_arg = arglist[arg_i];
 			task->callback_arg_free = 0;
 		}
+		else if (arg_type == STARPU_EPILOGUE_CALLBACK)
+		{
+			arg_i++;
+			task->epilogue_callback_func = (_starpu_callback_func_t)arglist[arg_i];
+		}
+		else if (arg_type == STARPU_EPILOGUE_CALLBACK_ARG)
+		{
+			arg_i++;
+			task->epilogue_callback_arg = arglist[arg_i];
+			task->epilogue_callback_arg_free = 1;
+		}
 		else if (arg_type == STARPU_PROLOGUE_CALLBACK)
 		{
 			arg_i++;