Переглянути джерело

mpi: call _starpu_mpi_coop_sends_optimize only on a real coop and disable _starpu_mpi_coop_sends_build_tree

Philippe SWARTVAGHER 5 роки тому
батько
коміт
9ab2dcf68f

+ 2 - 0
mpi/src/mpi/starpu_mpi_mpi.c

@@ -137,11 +137,13 @@ void _starpu_mpi_submit_ready_request_inc(struct _starpu_mpi_req *req)
 	_starpu_mpi_submit_ready_request(req);
 }
 
+#if 0
 void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends)
 {
 	(void)coop_sends;
 	/* TODO: turn them into redirects & forwards */
 }
+#endif
 
 void _starpu_mpi_submit_coop_sends(struct _starpu_mpi_coop_sends *coop_sends, int submit_control, int submit_data)
 {

+ 2 - 0
mpi/src/nmad/starpu_mpi_nmad.c

@@ -368,10 +368,12 @@ void _starpu_mpi_handle_pending_request(struct _starpu_mpi_req *req)
 	nm_sr_request_monitor(req->backend->session, &(req->backend->data_request), NM_SR_EVENT_FINALIZED,_starpu_mpi_handle_request_termination_callback);
 }
 
+#if 0
 void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends)
 {
 	/* TODO: turn them into redirects & forwards */
 }
+#endif
 
 void _starpu_mpi_submit_coop_sends(struct _starpu_mpi_coop_sends *coop_sends, int submit_control, int submit_data)
 {

+ 7 - 11
mpi/src/starpu_mpi_coop_sends.c

@@ -68,9 +68,7 @@ static int _starpu_mpi_reqs_prio_compare(const void *a, const void *b)
 /* Sort the requests by priority and build a diffusion tree. Actually does something only once per coop_sends bag. */
 static void _starpu_mpi_coop_sends_optimize(struct _starpu_mpi_coop_sends *coop_sends)
 {
-	if (coop_sends->n == 1)
-		/* Trivial case, don't optimize */
-		return;
+	STARPU_ASSERT(coop_sends->n > 1);
 
 	_starpu_spin_lock(&coop_sends->lock);
 	if (!coop_sends->reqs_array)
@@ -92,8 +90,10 @@ static void _starpu_mpi_coop_sends_optimize(struct _starpu_mpi_coop_sends *coop_
 		/* Sort them */
 		qsort(reqs, n, sizeof(*reqs), _starpu_mpi_reqs_prio_compare);
 
+#if 0
 		/* And build the diffusion tree */
 		_starpu_mpi_coop_sends_build_tree(coop_sends);
+#endif
 	}
 	_starpu_spin_unlock(&coop_sends->lock);
 }
@@ -114,9 +114,6 @@ static void _starpu_mpi_coop_sends_data_ready(void *arg)
 		_starpu_spin_unlock(&mpi_data->coop_lock);
 	}
 
-	/* Build diffusion tree */
-	_starpu_mpi_coop_sends_optimize(coop_sends);
-
 	if (coop_sends->n == 1)
 	{
 		/* Trivial case, just submit it */
@@ -124,6 +121,9 @@ static void _starpu_mpi_coop_sends_data_ready(void *arg)
 	}
 	else
 	{
+		/* Build diffusion tree */
+		_starpu_mpi_coop_sends_optimize(coop_sends);
+
 		/* And submit them */
 		if (STARPU_TEST_AND_SET(&coop_sends->redirects_sent, 1) == 0)
 			_starpu_mpi_submit_coop_sends(coop_sends, 1, 1);
@@ -138,16 +138,12 @@ static void _starpu_mpi_coop_sends_data_ready(void *arg)
  * or because the value has changed.  */
 static void _starpu_mpi_coop_send_flush(struct _starpu_mpi_coop_sends *coop_sends)
 {
-	if (!coop_sends)
+	if (!coop_sends || coop_sends->n == 1)
 		return;
 
 	/* Build diffusion tree */
 	_starpu_mpi_coop_sends_optimize(coop_sends);
 
-	if (coop_sends->n == 1)
-		/* Trivial case, we will just send the data */
-		return;
-
 	/* And submit them */
 	if (STARPU_TEST_AND_SET(&coop_sends->redirects_sent, 1) == 0)
 		_starpu_mpi_submit_coop_sends(coop_sends, 1, 0);

+ 2 - 0
mpi/src/starpu_mpi_private.h

@@ -278,8 +278,10 @@ void _starpu_mpi_submit_ready_request(void *arg);
 /* To be called when request is completed */
 void _starpu_mpi_release_req_data(struct _starpu_mpi_req *req);
 
+#if 0
 /* Build a communication tree. Called before _starpu_mpi_coop_send is ever called. coop_sends->lock is held. */
 void _starpu_mpi_coop_sends_build_tree(struct _starpu_mpi_coop_sends *coop_sends);
+#endif
 /* Try to merge with send request with other send requests */
 void _starpu_mpi_coop_send(starpu_data_handle_t data_handle, struct _starpu_mpi_req *req, enum starpu_data_access_mode mode, int sequential_consistency);