|
@@ -21,7 +21,7 @@
|
|
|
#include <common/utils.h>
|
|
|
#include <core/task.h>
|
|
|
|
|
|
-void _starpu_pack_arguments(size_t *current_offset, size_t *arg_buffer_size_, char **arg_buffer_, void *ptr, size_t ptr_size)
|
|
|
+static void _starpu_pack_arguments(size_t *current_offset, size_t *arg_buffer_size_, char **arg_buffer_, void *ptr, size_t ptr_size)
|
|
|
{
|
|
|
if (*current_offset + sizeof(ptr_size) + ptr_size > *arg_buffer_size_)
|
|
|
{
|
|
@@ -209,6 +209,83 @@ void _starpu_task_insert_check_nb_buffers(struct starpu_codelet *cl, struct star
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static inline void starpu_task_insert_process_data_arg(struct starpu_codelet *cl, struct starpu_task **task, int arg_type, starpu_data_handle_t handle, int *current_buffer, int *allocated_buffers)
|
|
|
+{
|
|
|
+ enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type & ~STARPU_SSEND;
|
|
|
+ STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
|
|
|
+
|
|
|
+ STARPU_ASSERT(cl != NULL);
|
|
|
+
|
|
|
+ _starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
|
|
|
+
|
|
|
+ STARPU_TASK_SET_HANDLE((*task), handle, *current_buffer);
|
|
|
+ if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
|
|
|
+ STARPU_TASK_SET_MODE(*task, mode,* current_buffer);
|
|
|
+ else if (STARPU_CODELET_GET_MODE(cl, *current_buffer))
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, *current_buffer) == mode,
|
|
|
+ "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n",
|
|
|
+ cl->name, STARPU_CODELET_GET_MODE(cl, *current_buffer),
|
|
|
+ *current_buffer, mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+#ifdef STARPU_DEVEL
|
|
|
+# warning shall we print a warning to the user
|
|
|
+
|
|
|
+#endif
|
|
|
+ STARPU_CODELET_SET_MODE(cl, mode, *current_buffer);
|
|
|
+ }
|
|
|
+
|
|
|
+ (*current_buffer)++;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void starpu_task_insert_process_data_array_arg(struct starpu_codelet *cl, struct starpu_task **task, int nb_handles, starpu_data_handle_t *handles, int *current_buffer, int *allocated_buffers)
|
|
|
+{
|
|
|
+ STARPU_ASSERT(cl != NULL);
|
|
|
+
|
|
|
+ int i;
|
|
|
+ for(i=0 ; i<nb_handles ; i++)
|
|
|
+ {
|
|
|
+ _starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
|
|
|
+ STARPU_TASK_SET_HANDLE((*task), handles[i], *current_buffer);
|
|
|
+ (*current_buffer)++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static inline void starpu_task_insert_process_data_mode_array_arg(struct starpu_codelet *cl, struct starpu_task **task, int nb_descrs, struct starpu_data_descr *descrs, int *current_buffer, int *allocated_buffers)
|
|
|
+{
|
|
|
+ STARPU_ASSERT(cl != NULL);
|
|
|
+
|
|
|
+ int i;
|
|
|
+ for(i=0 ; i<nb_descrs ; i++)
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || *current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
|
|
|
+ _starpu_task_insert_check_nb_buffers(cl, task, allocated_buffers, *current_buffer);
|
|
|
+ STARPU_TASK_SET_HANDLE((*task), descrs[i].handle, *current_buffer);
|
|
|
+ if ((*task)->dyn_modes)
|
|
|
+ {
|
|
|
+ (*task)->dyn_modes[*current_buffer] = descrs[i].mode;
|
|
|
+ }
|
|
|
+ else if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
|
|
|
+ STARPU_TASK_SET_MODE(*task, descrs[i].mode, *current_buffer);
|
|
|
+ else if (STARPU_CODELET_GET_MODE(cl, *current_buffer))
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, *current_buffer) == descrs[i].mode,
|
|
|
+ "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n",
|
|
|
+ cl->name, STARPU_CODELET_GET_MODE(cl, *current_buffer),
|
|
|
+ *current_buffer, descrs[i].mode);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ STARPU_CODELET_SET_MODE(cl, descrs[i].mode, *current_buffer);
|
|
|
+ }
|
|
|
+
|
|
|
+ (*current_buffer)++;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list)
|
|
|
{
|
|
|
int arg_type;
|
|
@@ -230,86 +307,21 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **t
|
|
|
{
|
|
|
|
|
|
starpu_data_handle_t handle = va_arg(varg_list, starpu_data_handle_t);
|
|
|
- enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type & ~STARPU_SSEND;
|
|
|
- STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
|
|
|
-
|
|
|
- STARPU_ASSERT(cl != NULL);
|
|
|
-
|
|
|
- _starpu_task_insert_check_nb_buffers(cl, task, &allocated_buffers, current_buffer);
|
|
|
-
|
|
|
- STARPU_TASK_SET_HANDLE((*task), handle, current_buffer);
|
|
|
- if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
|
|
|
- STARPU_TASK_SET_MODE(*task, mode, current_buffer);
|
|
|
- else if (STARPU_CODELET_GET_MODE(cl, current_buffer))
|
|
|
- {
|
|
|
- STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, current_buffer) == mode,
|
|
|
- "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n",
|
|
|
- cl->name, STARPU_CODELET_GET_MODE(cl, current_buffer),
|
|
|
- current_buffer, mode);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-#ifdef STARPU_DEVEL
|
|
|
-# warning shall we print a warning to the user
|
|
|
-
|
|
|
-#endif
|
|
|
- STARPU_CODELET_SET_MODE(cl, mode, current_buffer);
|
|
|
- }
|
|
|
-
|
|
|
- current_buffer++;
|
|
|
+ starpu_task_insert_process_data_arg(cl, task, arg_type, handle, ¤t_buffer, &allocated_buffers);
|
|
|
}
|
|
|
else if (arg_type == STARPU_DATA_ARRAY)
|
|
|
{
|
|
|
|
|
|
starpu_data_handle_t *handles = va_arg(varg_list, starpu_data_handle_t *);
|
|
|
int nb_handles = va_arg(varg_list, int);
|
|
|
-
|
|
|
- STARPU_ASSERT(cl != NULL);
|
|
|
-
|
|
|
- int i;
|
|
|
- for(i=0 ; i<nb_handles ; i++)
|
|
|
- {
|
|
|
- _starpu_task_insert_check_nb_buffers(cl, task, &allocated_buffers, current_buffer);
|
|
|
- STARPU_TASK_SET_HANDLE((*task), handles[i], current_buffer);
|
|
|
- current_buffer++;
|
|
|
- }
|
|
|
-
|
|
|
+ starpu_task_insert_process_data_array_arg(cl, task, nb_handles, handles, ¤t_buffer, &allocated_buffers);
|
|
|
}
|
|
|
else if (arg_type==STARPU_DATA_MODE_ARRAY)
|
|
|
{
|
|
|
|
|
|
struct starpu_data_descr *descrs = va_arg(varg_list, struct starpu_data_descr *);
|
|
|
int nb_descrs = va_arg(varg_list, int);
|
|
|
-
|
|
|
- STARPU_ASSERT(cl != NULL);
|
|
|
-
|
|
|
- int i;
|
|
|
- for(i=0 ; i<nb_descrs ; i++)
|
|
|
- {
|
|
|
- STARPU_ASSERT_MSG(cl->nbuffers == STARPU_VARIABLE_NBUFFERS || current_buffer < cl->nbuffers, "Too many data passed to starpu_task_insert");
|
|
|
- _starpu_task_insert_check_nb_buffers(cl, task, &allocated_buffers, current_buffer);
|
|
|
- STARPU_TASK_SET_HANDLE((*task), descrs[i].handle, current_buffer);
|
|
|
- if ((*task)->dyn_modes)
|
|
|
- {
|
|
|
- (*task)->dyn_modes[current_buffer] = descrs[i].mode;
|
|
|
- }
|
|
|
- else if (cl->nbuffers == STARPU_VARIABLE_NBUFFERS || (cl->nbuffers > STARPU_NMAXBUFS && !cl->dyn_modes))
|
|
|
- STARPU_TASK_SET_MODE(*task, descrs[i].mode, current_buffer);
|
|
|
- else if (STARPU_CODELET_GET_MODE(cl, current_buffer))
|
|
|
- {
|
|
|
- STARPU_ASSERT_MSG(STARPU_CODELET_GET_MODE(cl, current_buffer) == descrs[i].mode,
|
|
|
- "The codelet <%s> defines the access mode %d for the buffer %d which is different from the mode %d given to starpu_task_insert\n",
|
|
|
- cl->name, STARPU_CODELET_GET_MODE(cl, current_buffer),
|
|
|
- current_buffer, descrs[i].mode);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- STARPU_CODELET_SET_MODE(cl, descrs[i].mode, current_buffer);
|
|
|
- }
|
|
|
-
|
|
|
- current_buffer++;
|
|
|
- }
|
|
|
-
|
|
|
+ starpu_task_insert_process_data_mode_array_arg(cl, task, nb_descrs, descrs, ¤t_buffer, &allocated_buffers);
|
|
|
}
|
|
|
else if (arg_type==STARPU_VALUE)
|
|
|
{
|
|
@@ -466,3 +478,207 @@ int _starpu_task_insert_create(struct starpu_codelet *cl, struct starpu_task **t
|
|
|
_STARPU_TRACE_TASK_BUILD_END();
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+void fstarpu_insert_task(void ***_arglist)
|
|
|
+{
|
|
|
+ void **arglist = *_arglist;
|
|
|
+ int i = 0;
|
|
|
+ char *arg_buffer_ = NULL;
|
|
|
+ size_t arg_buffer_size_ = 0;
|
|
|
+ size_t current_offset = sizeof(int);
|
|
|
+ int current_buffer = 0;
|
|
|
+ int nargs = 0;
|
|
|
+ int allocated_buffers = 0;
|
|
|
+ struct starpu_task *task = NULL;
|
|
|
+ struct starpu_codelet *cl = arglist[i++];
|
|
|
+ if (cl == NULL)
|
|
|
+ {
|
|
|
+ STARPU_ABORT_MSG("task without codelet");
|
|
|
+ }
|
|
|
+ task = starpu_task_create();
|
|
|
+ task->cl = cl;
|
|
|
+ task->name = NULL;
|
|
|
+ while (arglist[i] != NULL)
|
|
|
+ {
|
|
|
+ const int arg_type = (int)(intptr_t)arglist[i];
|
|
|
+ if (arg_type & STARPU_R
|
|
|
+ || arg_type & STARPU_W
|
|
|
+ || arg_type & STARPU_SCRATCH
|
|
|
+ || arg_type & STARPU_REDUX)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ starpu_data_handle_t handle = arglist[i];
|
|
|
+ starpu_task_insert_process_data_arg(cl, &task, arg_type, handle, ¤t_buffer, &allocated_buffers);
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_DATA_ARRAY)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ starpu_data_handle_t *handles = arglist[i];
|
|
|
+ i++;
|
|
|
+ int nb_handles = *(int *)arglist[i];
|
|
|
+ starpu_task_insert_process_data_array_arg(cl, &task, nb_handles, handles, ¤t_buffer, &allocated_buffers);
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_DATA_MODE_ARRAY)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ struct starpu_data_descr *descrs = arglist[i];
|
|
|
+ i++;
|
|
|
+ int nb_descrs = *(int *)arglist[i];
|
|
|
+ starpu_task_insert_process_data_mode_array_arg(cl, &task, nb_descrs, descrs, ¤t_buffer, &allocated_buffers);
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_VALUE)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ void *ptr = arglist[i];
|
|
|
+ i++;
|
|
|
+ size_t ptr_size = (size_t)(intptr_t)arglist[i];
|
|
|
+ nargs++;
|
|
|
+ _starpu_pack_arguments(¤t_offset, &arg_buffer_size_, &arg_buffer_, ptr, ptr_size);
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_CL_ARGS)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->cl_arg = arglist[i];
|
|
|
+ i++;
|
|
|
+ task->cl_arg_size = (size_t)(intptr_t)arglist[i];
|
|
|
+ task->cl_arg_free = 1;
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_CALLBACK)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->callback_func = (_starpu_callback_func_t)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_CALLBACK_WITH_ARG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->callback_func = (_starpu_callback_func_t)arglist[i];
|
|
|
+ i++;
|
|
|
+ task->callback_arg = arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_CALLBACK_ARG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->callback_arg = arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_PROLOGUE_CALLBACK)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->prologue_callback_func = (_starpu_callback_func_t)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_PROLOGUE_CALLBACK_ARG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->prologue_callback_arg = arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_PROLOGUE_CALLBACK_POP)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->prologue_callback_pop_func = (_starpu_callback_func_t)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_PROLOGUE_CALLBACK_POP_ARG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->prologue_callback_pop_arg = arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_PRIORITY)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->priority = *(int *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_EXECUTE_ON_NODE)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ (void)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_EXECUTE_ON_DATA)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ (void)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_EXECUTE_ON_WORKER)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ int worker = *(int *)arglist[i];
|
|
|
+ if (worker != -1)
|
|
|
+ {
|
|
|
+ task->workerid = worker;
|
|
|
+ task->execute_on_a_specific_worker = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_WORKER_ORDER)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ unsigned order = *(unsigned *)arglist[i];
|
|
|
+ if (order != 0)
|
|
|
+ {
|
|
|
+ STARPU_ASSERT_MSG(task->execute_on_a_specific_worker, "worker order only makes sense if a workerid is provided");
|
|
|
+ task->workerorder = order;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_SCHED_CTX)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->sched_ctx = *(unsigned *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_HYPERVISOR_TAG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->hypervisor_tag = *(int *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_POSSIBLY_PARALLEL)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->possibly_parallel = *(unsigned *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_FLOPS)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->flops = *(double *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_TAG)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->tag_id = *(starpu_tag_t *)arglist[i];
|
|
|
+ task->use_tag = 1;
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_TAG_ONLY)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->tag_id = *(starpu_tag_t *)arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_NAME)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ task->name = arglist[i];
|
|
|
+ }
|
|
|
+ else if (arg_type == STARPU_NODE_SELECTION_POLICY)
|
|
|
+ {
|
|
|
+ i++;
|
|
|
+ (void)arglist[i];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ STARPU_ABORT_MSG("unknown/unsupported argument type");
|
|
|
+ }
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (nargs)
|
|
|
+ {
|
|
|
+ memcpy(arg_buffer_, (int *)&nargs, sizeof(nargs));
|
|
|
+ task->cl_arg = arg_buffer_;
|
|
|
+ task->cl_arg_size = arg_buffer_size_;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ free(arg_buffer_);
|
|
|
+ arg_buffer_ = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ int ret = starpu_task_submit(task);
|
|
|
+ if (ret != 0)
|
|
|
+ {
|
|
|
+ STARPU_ABORT_MSG("starpu_task_submit failed");
|
|
|
+ }
|
|
|
+}
|