Browse Source

refactor simgrid transfer submission, pass node numbers

Samuel Thibault 12 years ago
parent
commit
e3830cb1b7
1 changed files with 21 additions and 22 deletions
  1. 21 22
      src/core/simgrid.c

+ 21 - 22
src/core/simgrid.c

@@ -227,8 +227,10 @@ void _starpu_simgrid_execute_job(struct _starpu_job *j, enum starpu_perf_archtyp
 	MSG_task_execute(simgrid_task);
 	MSG_task_execute(simgrid_task);
 }
 }
 
 
-struct completion {
+struct transfer {
 	msg_task_t task;
 	msg_task_t task;
+	unsigned src_node;
+	unsigned dst_node;
 	unsigned *finished;
 	unsigned *finished;
 	_starpu_pthread_mutex_t *mutex;
 	_starpu_pthread_mutex_t *mutex;
 	_starpu_pthread_cond_t *cond;
 	_starpu_pthread_cond_t *cond;
@@ -236,29 +238,17 @@ struct completion {
 
 
 static int transfer_execute(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED)
 static int transfer_execute(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED)
 {
 {
-	struct completion *completion = MSG_process_get_data(MSG_process_self());
-	MSG_task_execute(completion->task);
-	MSG_task_destroy(completion->task);
-	_STARPU_PTHREAD_MUTEX_LOCK(completion->mutex);
-	*completion->finished = 1;
-	_STARPU_PTHREAD_COND_BROADCAST(completion->cond);
-	_STARPU_PTHREAD_MUTEX_UNLOCK(completion->mutex);
-	free(completion);
+	struct transfer *transfer = MSG_process_get_data(MSG_process_self());
+	MSG_task_execute(transfer->task);
+	MSG_task_destroy(transfer->task);
+	_STARPU_PTHREAD_MUTEX_LOCK(transfer->mutex);
+	*transfer->finished = 1;
+	_STARPU_PTHREAD_COND_BROADCAST(transfer->cond);
+	_STARPU_PTHREAD_MUTEX_UNLOCK(transfer->mutex);
+	free(transfer);
 	return 0;
 	return 0;
 }
 }
 
 
-static void _starpu_simgrid_post_task(msg_task_t task, unsigned *finished, _starpu_pthread_mutex_t *mutex, _starpu_pthread_cond_t *cond)
-{
-	struct completion *completion = malloc(sizeof (*completion));
-	completion->task = task;
-	completion->finished = finished;
-	completion->mutex = mutex;
-	completion->cond = cond;
-	xbt_dynar_t hosts = MSG_hosts_as_dynar();
-	MSG_process_create("transfer task", transfer_execute, completion, xbt_dynar_get_as(hosts, 0, msg_host_t));
-	xbt_dynar_free(&hosts);
-}
-
 int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req)
 int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req)
 {
 {
 	msg_task_t task;
 	msg_task_t task;
@@ -283,7 +273,16 @@ int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node,
 	req->async_channel.event.finished = 0;
 	req->async_channel.event.finished = 0;
 	_STARPU_PTHREAD_MUTEX_INIT(&req->async_channel.event.mutex, NULL);
 	_STARPU_PTHREAD_MUTEX_INIT(&req->async_channel.event.mutex, NULL);
 	_STARPU_PTHREAD_COND_INIT(&req->async_channel.event.cond, NULL);
 	_STARPU_PTHREAD_COND_INIT(&req->async_channel.event.cond, NULL);
-	_starpu_simgrid_post_task(task, &req->async_channel.event.finished, &req->async_channel.event.mutex, &req->async_channel.event.cond);
+
+	struct transfer *transfer = malloc(sizeof (*transfer));
+	transfer->task = task;
+	transfer->finished = &req->async_channel.event.finished;
+	transfer->mutex = &req->async_channel.event.mutex;
+	transfer->cond = &req->async_channel.event.cond;
+	transfer->src_node = src_node;
+	transfer->dst_node = dst_node;
+	MSG_process_create("transfer task", transfer_execute, transfer, MSG_get_host_by_name("MAIN"));
+
 	_STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node);
 	_STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node);
 	_STARPU_TRACE_DATA_COPY(src_node, dst_node, size);
 	_STARPU_TRACE_DATA_COPY(src_node, dst_node, size);
 	return -EAGAIN;
 	return -EAGAIN;