Forráskód Böngészése

New function starpu_task_set() similar as starpu_task_build() but with a task object given as the first parameter

Nathalie Furmento 7 éve
szülő
commit
08501ee960

+ 2 - 0
ChangeLog

@@ -80,6 +80,8 @@ Small features:
     the output graph
   * New environment variable STARPU_GENERATE_TRACE_OPTIONS to specify
     fxt options (to be used with STARPU_GENERATE_TRACE)
+  * New function starpu_task_set() similar as starpu_task_build() but
+    with a task object given as the first parameter
 
 Changes:
   * Vastly improve simgrid simulation time.

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

@@ -235,4 +235,13 @@ starpu_task_insert().
 If some arguments of type ::STARPU_VALUE are given, the parameter
 starpu_task::cl_arg_free will be set to 1.
 
+\fn int starpu_task_set(struct starpu_task *task, struct starpu_codelet *cl, ...)
+\ingroup API_Insert_Task
+Set the given \p 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_task_insert().
+If some arguments of type ::STARPU_VALUE are given, the parameter
+starpu_task::cl_arg_free will be set to 1.
+
 */

+ 1 - 0
include/starpu_task_util.h

@@ -66,6 +66,7 @@ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t
 #define STARPU_TASK_COLOR       (28<<STARPU_MODE_SHIFT)
 #define STARPU_SHIFTED_MODE_MAX (29<<STARPU_MODE_SHIFT)
 
+int starpu_task_set(struct starpu_task *task, struct starpu_codelet *cl, ...);
 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
 int starpu_task_insert(struct starpu_codelet *cl, ...);
 /* the function starpu_insert_task has the same semantics as starpu_task_insert, it is kept to avoid breaking old codes */

+ 16 - 7
src/util/starpu_task_insert.c

@@ -2,7 +2,7 @@
  *
  * Copyright (C) 2011-2012,2016                           Inria
  * Copyright (C) 2010-2018                                Université de Bordeaux
- * Copyright (C) 2011-2017                                CNRS
+ * Copyright (C) 2011-2018                                CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -111,13 +111,13 @@ void starpu_codelet_unpack_args(void *_cl_arg, ...)
 }
 
 static
-struct starpu_task *_starpu_task_build_v(struct starpu_codelet *cl, const char* task_name, int cl_arg_free, va_list varg_list)
+struct starpu_task *_starpu_task_build_v(struct starpu_task *ptask, struct starpu_codelet *cl, const char* task_name, int cl_arg_free, va_list varg_list)
 {
 	va_list varg_list_copy;
 	int ret;
 
-	struct starpu_task *task = starpu_task_create();
-	task->name = task_name;
+	struct starpu_task *task = ptask ? ptask : starpu_task_create();
+	task->name = task_name ? task_name : task->name;
 	task->cl_arg_free = cl_arg_free;
 
 	va_copy(varg_list_copy, varg_list);
@@ -132,13 +132,12 @@ struct starpu_task *_starpu_task_build_v(struct starpu_codelet *cl, const char*
 	return (ret == 0) ? task : NULL;
 }
 
-static
 int _starpu_task_insert_v(struct starpu_codelet *cl, va_list varg_list)
 {
 	struct starpu_task *task;
 	int ret;
 
-	task = _starpu_task_build_v(cl, NULL, 1, varg_list);
+	task = _starpu_task_build_v(NULL, cl, NULL, 1, varg_list);
 	ret = starpu_task_submit(task);
 
 	if (STARPU_UNLIKELY(ret == -ENODEV))
@@ -155,6 +154,16 @@ int _starpu_task_insert_v(struct starpu_codelet *cl, va_list varg_list)
 	return ret;
 }
 
+int starpu_task_set(struct starpu_task *task, struct starpu_codelet *cl, ...)
+{
+	va_list varg_list;
+
+	va_start(varg_list, cl);
+	task = _starpu_task_build_v(task, cl, NULL, 1, varg_list);
+	va_end(varg_list);
+	return 0;
+}
+
 int starpu_task_insert(struct starpu_codelet *cl, ...)
 {
 	va_list varg_list;
@@ -183,7 +192,7 @@ struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...)
 	va_list varg_list;
 
 	va_start(varg_list, cl);
-	task = _starpu_task_build_v(cl, "task_build", 0, varg_list);
+	task = _starpu_task_build_v(NULL, cl, "task_build", 0, varg_list);
 	if (task && task->cl_arg)
 	{
 		task->cl_arg_free = 1;