Browse Source

Add STARPU_CALLBACK_WITH_ARG

Samuel Thibault 13 years ago
parent
commit
81bedff7fa
4 changed files with 49 additions and 5 deletions
  1. 5 0
      doc/starpu.texi
  2. 6 5
      include/starpu_util.h
  3. 20 0
      mpi/starpu_mpi_insert_task.c
  4. 18 0
      src/util/starpu_insert_task_utils.c

+ 5 - 0
doc/starpu.texi

@@ -1482,6 +1482,11 @@ the size of the constant;
 @code{STARPU_CALLBACK_ARG} followed by a pointer to be given as an
 argument to the callback function;
 @item
+@code{STARPU_CALLBACK_WITH_ARG} followed by two pointers: one to a callback
+function, and the other to be given as an argument to the callback
+function; this is equivalent to using both @code{STARPU_CALLBACK} and
+@code{STARPU_CALLBACK_WITH_ARG}
+@item
 @code{STARPU_PRIORITY} followed by a integer defining a priority level.
 @end itemize
 

+ 6 - 5
include/starpu_util.h

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010  Université de Bordeaux 1
+ * Copyright (C) 2010-2011  Université de Bordeaux 1
  * Copyright (C) 2010, 2011  Centre National de la Recherche Scientifique
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -234,10 +234,11 @@ int starpu_data_cpy(starpu_data_handle dst_handle, starpu_data_handle src_handle
 /* Constants used by the starpu_insert_task helper to determine the different types of argument */
 #define STARPU_VALUE		(1<<4)	/* Pointer to a constant value */
 #define STARPU_CALLBACK		(1<<5)	/* Callback function */
-#define STARPU_CALLBACK_ARG	(1<<6)	/* Argument of the callback function (of type void *) */
-#define STARPU_PRIORITY		(1<<7)	/* Priority associated to the task */
-#define STARPU_EXECUTE_ON_NODE	(1<<8)	/* Used by MPI to define which task is going to execute the codelet */
-#define STARPU_EXECUTE_ON_DATA	(1<<9)	/* Used by MPI to define which task is going to execute the codelet */
+#define STARPU_CALLBACK_WITH_ARG	(1<<6)	/* Callback function */
+#define STARPU_CALLBACK_ARG	(1<<7)	/* Argument of the callback function (of type void *) */
+#define STARPU_PRIORITY		(1<<8)	/* Priority associated to the task */
+#define STARPU_EXECUTE_ON_NODE	(1<<9)	/* Used by MPI to define which task is going to execute the codelet */
+#define STARPU_EXECUTE_ON_DATA	(1<<10)	/* Used by MPI to define which task is going to execute the codelet */
 
 /* Wrapper to create a task. */
 int starpu_insert_task(starpu_codelet *cl, ...);

+ 20 - 0
mpi/starpu_mpi_insert_task.c

@@ -148,6 +148,10 @@ int starpu_mpi_insert_task(MPI_Comm comm, starpu_codelet *codelet, ...)
 		else if (arg_type==STARPU_CALLBACK) {
 			va_arg(varg_list, void (*)(void *));
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+			va_arg(varg_list, void (*)(void *));
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			va_arg(varg_list, void *);
 		}
@@ -206,6 +210,10 @@ int starpu_mpi_insert_task(MPI_Comm comm, starpu_codelet *codelet, ...)
 		else if (arg_type==STARPU_CALLBACK) {
 			va_arg(varg_list, void (*)(void *));
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+			va_arg(varg_list, void (*)(void *));
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			va_arg(varg_list, void *);
 		}
@@ -290,6 +298,10 @@ int starpu_mpi_insert_task(MPI_Comm comm, starpu_codelet *codelet, ...)
 		else if (arg_type==STARPU_CALLBACK) {
 			va_arg(varg_list, void (*)(void *));
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+			va_arg(varg_list, void (*)(void *));
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			va_arg(varg_list, void *);
 		}
@@ -341,6 +353,10 @@ int starpu_mpi_insert_task(MPI_Comm comm, starpu_codelet *codelet, ...)
                         else if (arg_type==STARPU_CALLBACK) {
                                 va_arg(varg_list, void (*)(void *));
                         }
+                        else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+                                va_arg(varg_list, void (*)(void *));
+                                va_arg(varg_list, void *);
+                        }
                         else if (arg_type==STARPU_CALLBACK_ARG) {
                                 va_arg(varg_list, void *);
                         }
@@ -404,6 +420,10 @@ int starpu_mpi_insert_task(MPI_Comm comm, starpu_codelet *codelet, ...)
 		else if (arg_type==STARPU_CALLBACK) {
 			va_arg(varg_list, void (*)(void *));
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+			va_arg(varg_list, void (*)(void *));
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			va_arg(varg_list, void *);
 		}

+ 18 - 0
src/util/starpu_insert_task_utils.c

@@ -65,6 +65,10 @@ size_t _starpu_insert_task_get_arg_size(va_list varg_list)
 		else if (arg_type==STARPU_CALLBACK) {
 			(void)va_arg(varg_list, callback_func_t);
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG) {
+			va_arg(varg_list, callback_func_t);
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			(void)va_arg(varg_list, void *);
 		}
@@ -121,6 +125,11 @@ int _starpu_pack_cl_args(size_t arg_buffer_size, char **arg_buffer, va_list varg
 		{
 			(void)va_arg(varg_list, callback_func_t);
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG)
+		{
+			va_arg(varg_list, callback_func_t);
+			va_arg(varg_list, void *);
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			(void)va_arg(varg_list, void *);
 		}
@@ -176,6 +185,15 @@ int _starpu_insert_task_create_and_submit(char *arg_buffer, starpu_codelet *cl,
 			callback_func = va_arg(varg_list, callback_func_t);
 			cl_arg_wrapper->callback_func = callback_func;
 		}
+		else if (arg_type==STARPU_CALLBACK_WITH_ARG)
+		{
+			void (*callback_func)(void *);
+			void *callback_arg;
+			callback_func = va_arg(varg_list, callback_func_t);
+			callback_arg = va_arg(varg_list, void *);
+			cl_arg_wrapper->callback_func = callback_func;
+			cl_arg_wrapper->callback_arg = callback_arg;
+		}
 		else if (arg_type==STARPU_CALLBACK_ARG) {
 			void *callback_arg = va_arg(varg_list, void *);
 			cl_arg_wrapper->callback_arg = callback_arg;