|
@@ -111,6 +111,11 @@ int _starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, va_lis
|
|
|
(void)va_arg(varg_list, unsigned);
|
|
|
(void)va_arg(varg_list, struct starpu_task **);
|
|
|
}
|
|
|
+ else if (arg_type==STARPU_TASK_END_DEPS_ARRAY)
|
|
|
+ {
|
|
|
+ (void)va_arg(varg_list, unsigned);
|
|
|
+ (void)va_arg(varg_list, struct starpu_task **);
|
|
|
+ }
|
|
|
else if (arg_type==STARPU_CALLBACK)
|
|
|
{
|
|
|
(void)va_arg(varg_list, _starpu_callback_func_t);
|
|
@@ -333,7 +338,9 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *ta
|
|
|
int current_buffer;
|
|
|
int allocated_buffers = 0;
|
|
|
unsigned ndeps = 0;
|
|
|
+ unsigned nend_deps = 0;
|
|
|
struct starpu_task **task_deps_array = NULL;
|
|
|
+ struct starpu_task **task_end_deps_array = NULL;
|
|
|
|
|
|
_STARPU_TRACE_TASK_BUILD_START();
|
|
|
|
|
@@ -385,10 +392,16 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *ta
|
|
|
}
|
|
|
else if (arg_type==STARPU_TASK_DEPS_ARRAY)
|
|
|
{
|
|
|
- STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' cannot be set twice");
|
|
|
+ STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' passed twice not supported yet");
|
|
|
ndeps = va_arg(varg_list, unsigned);
|
|
|
task_deps_array = va_arg(varg_list, struct starpu_task **);
|
|
|
}
|
|
|
+ else if (arg_type==STARPU_TASK_END_DEPS_ARRAY)
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(task_end_deps_array == NULL, "Parameter 'STARPU_TASK_END_DEPS_ARRAY' passed twice not supported yet");
|
|
|
+ nend_deps = va_arg(varg_list, unsigned);
|
|
|
+ task_end_deps_array = va_arg(varg_list, struct starpu_task **);
|
|
|
+ }
|
|
|
else if (arg_type==STARPU_CALLBACK)
|
|
|
{
|
|
|
task->callback_func = va_arg(varg_list, _starpu_callback_func_t);
|
|
@@ -540,6 +553,11 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *ta
|
|
|
starpu_task_declare_deps_array(task, ndeps, task_deps_array);
|
|
|
}
|
|
|
|
|
|
+ if (task_end_deps_array)
|
|
|
+ {
|
|
|
+ starpu_task_declare_end_deps_array(task, nend_deps, task_end_deps_array);
|
|
|
+ }
|
|
|
+
|
|
|
_STARPU_TRACE_TASK_BUILD_END();
|
|
|
return 0;
|
|
|
}
|
|
@@ -550,7 +568,9 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *t
|
|
|
int current_buffer = 0;
|
|
|
int allocated_buffers = 0;
|
|
|
unsigned ndeps = 0;
|
|
|
+ unsigned nend_deps = 0;
|
|
|
struct starpu_task **task_deps_array = NULL;
|
|
|
+ struct starpu_task **task_end_deps_array = NULL;
|
|
|
|
|
|
_STARPU_TRACE_TASK_BUILD_START();
|
|
|
|
|
@@ -614,12 +634,20 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *t
|
|
|
}
|
|
|
else if (arg_type==STARPU_TASK_DEPS_ARRAY)
|
|
|
{
|
|
|
- STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' cannot be set twice");
|
|
|
+ STARPU_ASSERT_MSG(task_deps_array == NULL, "Parameter 'STARPU_TASK_DEPS_ARRAY' passed twice not supported yet");
|
|
|
arg_i++;
|
|
|
ndeps = *(unsigned *)arglist[arg_i];
|
|
|
arg_i++;
|
|
|
task_deps_array = arglist[arg_i];
|
|
|
}
|
|
|
+ else if (arg_type==STARPU_TASK_END_DEPS_ARRAY)
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(task_end_deps_array == NULL, "Parameter 'STARPU_TASK_END_DEPS_ARRAY' passed twice not supported yet");
|
|
|
+ arg_i++;
|
|
|
+ nend_deps = *(unsigned *)arglist[arg_i];
|
|
|
+ arg_i++;
|
|
|
+ task_end_deps_array = arglist[arg_i];
|
|
|
+ }
|
|
|
else if (arg_type == STARPU_CALLBACK)
|
|
|
{
|
|
|
arg_i++;
|
|
@@ -789,6 +817,11 @@ int _fstarpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task *t
|
|
|
starpu_task_declare_deps_array(task, ndeps, task_deps_array);
|
|
|
}
|
|
|
|
|
|
+ if (task_end_deps_array)
|
|
|
+ {
|
|
|
+ starpu_task_declare_end_deps_array(task, nend_deps, task_end_deps_array);
|
|
|
+ }
|
|
|
+
|
|
|
_STARPU_TRACE_TASK_BUILD_END();
|
|
|
|
|
|
return 0;
|