|
@@ -18,14 +18,14 @@
|
|
|
#include "gc.h"
|
|
|
#include "event.h"
|
|
|
|
|
|
-static void task_release_callback(void *arg) {
|
|
|
- cl_command cmd = (cl_command)arg;
|
|
|
+void command_completed(cl_command cmd) {
|
|
|
starpu_task task = cmd->task;
|
|
|
|
|
|
- cl_event ev = command_event_get(cmd);
|
|
|
+ cl_event ev = command_event_get_ex(cmd);
|
|
|
ev->status = CL_COMPLETE;
|
|
|
|
|
|
/* Trigger the tag associated to the command event */
|
|
|
+ DEBUG_MSG("Trigger event %d\n", ev->id);
|
|
|
starpu_tag_notify_from_apps(ev->id);
|
|
|
|
|
|
if (task->profiling_info != NULL && (intptr_t)task->profiling_info != -ENOSYS) {
|
|
@@ -34,12 +34,17 @@ static void task_release_callback(void *arg) {
|
|
|
}
|
|
|
|
|
|
gc_entity_release(ev);
|
|
|
-
|
|
|
- /* Release the command */
|
|
|
- //FIXME
|
|
|
- //free(cmd);
|
|
|
}
|
|
|
|
|
|
+void command_completed_task_callback(void *arg) {
|
|
|
+ cl_command cmd = (cl_command)arg;
|
|
|
+
|
|
|
+ command_completed(cmd);
|
|
|
+
|
|
|
+ /* Release the command stored task callback parameter */
|
|
|
+ gc_entity_release(cmd);
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* Create a StarPU task
|
|
@@ -68,6 +73,7 @@ void task_depends_on(starpu_task task, cl_uint num_events, cl_event *events) {
|
|
|
|
|
|
starpu_tag_t * tags = malloc(num_events * sizeof(starpu_tag_t));
|
|
|
|
|
|
+ DEBUG_MSG("Task %p depends on events:", task);
|
|
|
for (i=0; i<num_events; i++) {
|
|
|
tags[i] = events[i]->id;
|
|
|
DEBUG_MSG_NOHEAD(" %u", events[i]->id);
|
|
@@ -85,14 +91,17 @@ cl_int task_submit_ex(starpu_task task, cl_command cmd) {
|
|
|
/* Associated the task to the command */
|
|
|
cmd->task = task;
|
|
|
|
|
|
- task_depends_on(task, command_num_events_get(cmd), command_events_get(cmd));
|
|
|
+ cl_uint num_events = command_num_events_get_ex(cmd);
|
|
|
+ cl_event * events = command_events_get_ex(cmd);
|
|
|
+
|
|
|
+ task_depends_on(task, num_events, events);
|
|
|
|
|
|
- task->callback_func = task_release_callback;
|
|
|
- task->callback_arg = cmd;
|
|
|
+ task->callback_func = command_completed_task_callback;
|
|
|
+ gc_entity_store(&task->callback_arg, cmd);
|
|
|
|
|
|
/* Submit task */
|
|
|
int ret = (task->cl != NULL && task->cl->where == STARPU_OPENCL ?
|
|
|
- starpu_task_submit_to_ctx(task, cmd->cq->context->sched_ctx) :
|
|
|
+ starpu_task_submit_to_ctx(task, cmd->event->cq->context->sched_ctx) :
|
|
|
starpu_task_submit(task));
|
|
|
|
|
|
if (ret != 0)
|
|
@@ -110,41 +119,52 @@ struct cputask_arg {
|
|
|
void (*callback)(void*);
|
|
|
void * arg;
|
|
|
int free_arg;
|
|
|
+ cl_command cmd;
|
|
|
+ int complete_cmd;
|
|
|
};
|
|
|
|
|
|
-static void cputask_task(__attribute__((unused)) void *descr[], void *args) {
|
|
|
+static void cputask_task(void *args) {
|
|
|
struct cputask_arg * arg = (struct cputask_arg*)args;
|
|
|
|
|
|
arg->callback(arg->arg);
|
|
|
|
|
|
+ if (arg->complete_cmd)
|
|
|
+ command_completed(arg->cmd);
|
|
|
+
|
|
|
if (arg->free_arg) {
|
|
|
assert(arg->arg != NULL);
|
|
|
free(arg->arg);
|
|
|
arg->arg = NULL;
|
|
|
}
|
|
|
|
|
|
+ gc_entity_unstore(&arg->cmd);
|
|
|
free(arg);
|
|
|
|
|
|
}
|
|
|
|
|
|
-void cpu_task_submit_ex(cl_command cmd, void (*callback)(void*), void *arg, int free_arg, struct starpu_codelet * codelet, unsigned num_events, cl_event * events) {
|
|
|
+void cpu_task_submit_ex(cl_command cmd, void (*callback)(void*), void *arg, int free_arg, int complete_cmd, struct starpu_codelet * codelet, unsigned num_events, cl_event * events) {
|
|
|
|
|
|
struct cputask_arg * a = malloc(sizeof(struct cputask_arg));
|
|
|
a->callback = callback;
|
|
|
a->arg = arg;
|
|
|
a->free_arg = free_arg;
|
|
|
+ gc_entity_store(&a->cmd, cmd);
|
|
|
+ a->complete_cmd = complete_cmd;
|
|
|
|
|
|
- codelet->where = STARPU_CPU;
|
|
|
- codelet->cpu_funcs[0] = &cputask_task;
|
|
|
+ codelet->where = STARPU_OPENCL | STARPU_CPU | STARPU_CUDA;
|
|
|
|
|
|
starpu_task task = task_create();
|
|
|
- task->cl = codelet;
|
|
|
- task->cl_arg = a;
|
|
|
-
|
|
|
if (num_events != 0) {
|
|
|
task_depends_on(task, num_events, events);
|
|
|
}
|
|
|
|
|
|
- task_submit(task, cmd);
|
|
|
+ task->callback_func = cputask_task;
|
|
|
+ task->callback_arg = a;
|
|
|
+
|
|
|
+ cmd->task = task;
|
|
|
+
|
|
|
+ int ret = starpu_task_submit(task);
|
|
|
+ if (ret != 0)
|
|
|
+ DEBUG_ERROR("Unable to submit a task. Error %d\n", ret);
|
|
|
}
|
|
|
|