|
@@ -1,6 +1,6 @@
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
*
|
|
*
|
|
- * Copyright (C) 2012, 2016 INRIA
|
|
|
|
|
|
+ * Copyright (C) 2012, 2016, 2017 INRIA
|
|
*
|
|
*
|
|
* StarPU is free software; you can redistribute it and/or modify
|
|
* 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
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
@@ -109,6 +109,7 @@ static int _starpu_src_common_process_completed_job(struct _starpu_mp_node *node
|
|
_starpu_set_local_worker_key(old_worker);
|
|
_starpu_set_local_worker_key(old_worker);
|
|
|
|
|
|
worker->current_task = NULL;
|
|
worker->current_task = NULL;
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -147,6 +148,9 @@ static int _starpu_src_common_handle_async(struct _starpu_mp_node *node,
|
|
worker_set = _starpu_get_worker_struct(starpu_worker_get_id())->set;
|
|
worker_set = _starpu_get_worker_struct(starpu_worker_get_id())->set;
|
|
_starpu_src_common_process_completed_job(node, worker_set, arg, arg_size, stored);
|
|
_starpu_src_common_process_completed_job(node, worker_set, arg, arg_size, stored);
|
|
break;
|
|
break;
|
|
|
|
+ case STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED:
|
|
|
|
+ _STARPU_ERROR("Detached execution completed should not arrive here... \n");
|
|
|
|
+ break;
|
|
case STARPU_MP_COMMAND_PRE_EXECUTION:
|
|
case STARPU_MP_COMMAND_PRE_EXECUTION:
|
|
_starpu_src_common_pre_exec(node, arg,arg_size, stored);
|
|
_starpu_src_common_pre_exec(node, arg,arg_size, stored);
|
|
break;
|
|
break;
|
|
@@ -211,6 +215,7 @@ int _starpu_src_common_store_message(struct _starpu_mp_node *node,
|
|
switch(answer)
|
|
switch(answer)
|
|
{
|
|
{
|
|
case STARPU_MP_COMMAND_EXECUTION_COMPLETED:
|
|
case STARPU_MP_COMMAND_EXECUTION_COMPLETED:
|
|
|
|
+ case STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED:
|
|
case STARPU_MP_COMMAND_PRE_EXECUTION:
|
|
case STARPU_MP_COMMAND_PRE_EXECUTION:
|
|
{
|
|
{
|
|
message = mp_message_new();
|
|
message = mp_message_new();
|
|
@@ -284,7 +289,7 @@ static void _starpu_src_common_recv_async(struct _starpu_mp_node * node)
|
|
{
|
|
{
|
|
answer = _starpu_mp_common_recv_command (node, arg, arg_size);
|
|
answer = _starpu_mp_common_recv_command (node, arg, arg_size);
|
|
|
|
|
|
- if(answer == STARPU_MP_COMMAND_EXECUTION_COMPLETED)
|
|
|
|
|
|
+ if(answer == STARPU_MP_COMMAND_EXECUTION_DETACHED_COMPLETED)
|
|
{
|
|
{
|
|
int coreid;
|
|
int coreid;
|
|
STARPU_ASSERT(sizeof(coreid) == *arg_size);
|
|
STARPU_ASSERT(sizeof(coreid) == *arg_size);
|
|
@@ -393,14 +398,14 @@ int _starpu_src_common_execute_kernel(struct _starpu_mp_node *node,
|
|
starpu_data_handle_t *handles,
|
|
starpu_data_handle_t *handles,
|
|
void **interfaces,
|
|
void **interfaces,
|
|
unsigned nb_interfaces,
|
|
unsigned nb_interfaces,
|
|
- void *cl_arg, size_t cl_arg_size)
|
|
|
|
|
|
+ void *cl_arg, size_t cl_arg_size, int detached)
|
|
{
|
|
{
|
|
void *buffer, *arg =NULL;
|
|
void *buffer, *arg =NULL;
|
|
uintptr_t buffer_ptr;
|
|
uintptr_t buffer_ptr;
|
|
int buffer_size = 0, arg_size =0;
|
|
int buffer_size = 0, arg_size =0;
|
|
unsigned i;
|
|
unsigned i;
|
|
|
|
|
|
- buffer_size = sizeof(kernel) + sizeof(coreid) + sizeof(type)
|
|
|
|
|
|
+ buffer_size = sizeof(kernel) + sizeof(coreid) + sizeof(type) + sizeof(detached)
|
|
+ sizeof(nb_interfaces) + nb_interfaces * sizeof(union _starpu_interface) + sizeof(is_parallel_task);
|
|
+ sizeof(nb_interfaces) + nb_interfaces * sizeof(union _starpu_interface) + sizeof(is_parallel_task);
|
|
|
|
|
|
/*if the task is parallel*/
|
|
/*if the task is parallel*/
|
|
@@ -444,6 +449,9 @@ int _starpu_src_common_execute_kernel(struct _starpu_mp_node *node,
|
|
*(unsigned *) buffer_ptr = nb_interfaces;
|
|
*(unsigned *) buffer_ptr = nb_interfaces;
|
|
buffer_ptr += sizeof(nb_interfaces);
|
|
buffer_ptr += sizeof(nb_interfaces);
|
|
|
|
|
|
|
|
+ *(int *) buffer_ptr = detached;
|
|
|
|
+ buffer_ptr += sizeof(detached);
|
|
|
|
+
|
|
/* Message-passing execution is a particular case as the codelet is
|
|
/* Message-passing execution is a particular case as the codelet is
|
|
* executed on a sink with a different memory, whereas a codelet is
|
|
* executed on a sink with a different memory, whereas a codelet is
|
|
* executed on the host part for the other accelerators.
|
|
* executed on the host part for the other accelerators.
|
|
@@ -466,17 +474,23 @@ int _starpu_src_common_execute_kernel(struct _starpu_mp_node *node,
|
|
|
|
|
|
STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex);
|
|
STARPU_PTHREAD_MUTEX_LOCK(&node->connection_mutex);
|
|
|
|
|
|
- _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTE, buffer, buffer_size);
|
|
|
|
|
|
+ if (detached)
|
|
|
|
+ _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTE_DETACHED, buffer, buffer_size);
|
|
|
|
+ else
|
|
|
|
+ _starpu_mp_common_send_command(node, STARPU_MP_COMMAND_EXECUTE, buffer, buffer_size);
|
|
|
|
|
|
enum _starpu_mp_command answer = _starpu_src_common_wait_command_sync(node, &arg, &arg_size);
|
|
enum _starpu_mp_command answer = _starpu_src_common_wait_command_sync(node, &arg, &arg_size);
|
|
|
|
|
|
- if (answer == STARPU_MP_COMMAND_ERROR_EXECUTE)
|
|
|
|
|
|
+ if (answer == STARPU_MP_COMMAND_ERROR_EXECUTE_DETACHED)
|
|
{
|
|
{
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex);
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex);
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
- STARPU_ASSERT(answer == STARPU_MP_COMMAND_EXECUTION_SUBMITTED);
|
|
|
|
|
|
+ if (detached)
|
|
|
|
+ STARPU_ASSERT(answer == STARPU_MP_COMMAND_EXECUTION_DETACHED_SUBMITTED);
|
|
|
|
+ else
|
|
|
|
+ STARPU_ASSERT(answer == STARPU_MP_COMMAND_EXECUTION_SUBMITTED);
|
|
|
|
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex);
|
|
STARPU_PTHREAD_MUTEX_UNLOCK(&node->connection_mutex);
|
|
|
|
|
|
@@ -508,7 +522,7 @@ static int _starpu_src_common_execute(struct _starpu_job *j,
|
|
(j->task_size > 1),
|
|
(j->task_size > 1),
|
|
j->combined_workerid, STARPU_TASK_GET_HANDLES(task),
|
|
j->combined_workerid, STARPU_TASK_GET_HANDLES(task),
|
|
_STARPU_TASK_GET_INTERFACES(task), STARPU_TASK_GET_NBUFFERS(task),
|
|
_STARPU_TASK_GET_INTERFACES(task), STARPU_TASK_GET_NBUFFERS(task),
|
|
- task->cl_arg, task->cl_arg_size);
|
|
|
|
|
|
+ task->cl_arg, task->cl_arg_size, 0);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|