소스 검색

New function starpu_init_task similar to starpu_insert_task without the submission of the task.
Thanks to Cyril Bordage for submitting the patch.

Nathalie Furmento 11 년 전
부모
커밋
14eddc11c7

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

@@ -95,4 +95,11 @@ starpu_codelet_unpack_args().
 Retrieve the arguments of type ::STARPU_VALUE associated to a
 task automatically created using the function starpu_insert_task().
 
+\fn struct starpu_task *starpu_init_task(struct starpu_codelet *cl, ...)
+\ingroup API_Insert_Task
+Create a task corresponding to \p cl with the following arguments.
+The argument list must be zero-terminated. The arguments
+following the codelet are the same as the ones for the function
+starpu_insert_task().
+
 */

+ 1 - 0
include/starpu_task_util.h

@@ -46,6 +46,7 @@ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t
 #define STARPU_PROLOGUE_CALLBACK   (13<<16)
 #define STARPU_PROLOGUE_CALLBACK_ARG (14<<16)
 
+struct starpu_task *starpu_init_task(struct starpu_codelet *cl, ...);
 int starpu_insert_task(struct starpu_codelet *cl, ...);
 
 void starpu_codelet_unpack_args(void *cl_arg, ...);

+ 28 - 0
src/util/starpu_insert_task.c

@@ -96,3 +96,31 @@ int starpu_insert_task(struct starpu_codelet *cl, ...)
 	}
 	return ret;
 }
+
+struct starpu_task *starpu_init_task(struct starpu_codelet *cl, ...)
+{
+	va_list varg_list;
+	void *arg_buffer = NULL;
+
+	/* Compute the size */
+	size_t arg_buffer_size = 0;
+	va_start(varg_list, cl);
+	arg_buffer_size = _starpu_insert_task_get_arg_size(varg_list);
+
+	if (arg_buffer_size)
+	{
+		va_start(varg_list, cl);
+		_starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list);
+	}
+
+	struct starpu_task *task = starpu_task_create();
+
+	if (cl && cl->nbuffers > STARPU_NMAXBUFS)
+	{
+		task->dyn_handles = malloc(cl->nbuffers * sizeof(starpu_data_handle_t));
+	}
+
+	va_start(varg_list, cl);
+	_starpu_insert_task_create(arg_buffer, arg_buffer_size, cl, &task, varg_list);
+	return task;
+}

+ 6 - 1
src/util/starpu_insert_task_utils.c

@@ -234,7 +234,7 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list
 	return 0;
 }
 
-int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list)
+void _starpu_insert_task_create(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list)
 {
 	int arg_type;
 	unsigned current_buffer = 0;
@@ -382,6 +382,11 @@ int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_si
 	(*task)->prologue_callback_func = starpu_task_insert_callback_wrapper;
 	(*task)->prologue_callback_arg = prologue_cl_arg_wrapper;
 	(*task)->prologue_callback_arg_free = 1;
+}
+
+int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list)
+{
+	_starpu_insert_task_create(arg_buffer, arg_buffer_size, cl, task, varg_list);
 
 	int ret = starpu_task_submit(*task);
 

+ 1 - 0
src/util/starpu_insert_task_utils.h

@@ -23,6 +23,7 @@
 
 size_t _starpu_insert_task_get_arg_size(va_list varg_list);
 int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list varg_list);
+void _starpu_insert_task_create(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list);
 int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list);
 int _starpu_insert_task_create_and_submit_array(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, starpu_data_handle_t *handles, unsigned nb_handles, va_list varg_list);