Ver código fonte

Optimize case where there is just one send, we don't need diffusion trees etc.

Samuel Thibault 7 anos atrás
pai
commit
b791e3eda2
1 arquivos alterados com 20 adições e 4 exclusões
  1. 20 4
      mpi/src/starpu_mpi_coop_sends.c

+ 20 - 4
mpi/src/starpu_mpi_coop_sends.c

@@ -70,6 +70,10 @@ 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_spin_lock(&coop_sends->lock);
 	if (!coop_sends->reqs_array)
 	{
@@ -115,11 +119,19 @@ static void _starpu_mpi_coop_sends_data_ready(void *arg)
 	/* 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);
+	if (coop_sends->n == 1)
+	{
+		/* Trivial case, just submit it */
+		_starpu_mpi_submit_ready_request(_starpu_mpi_req_multilist_begin_coop_sends(&coop_sends->reqs));
+	}
 	else
-		_starpu_mpi_submit_coop_sends(coop_sends, 0, 1);
+	{
+		/* And submit them */
+		if (STARPU_TEST_AND_SET(&coop_sends->redirects_sent, 1) == 0)
+			_starpu_mpi_submit_coop_sends(coop_sends, 1, 1);
+		else
+			_starpu_mpi_submit_coop_sends(coop_sends, 0, 1);
+	}
 	_STARPU_MPI_LOG_OUT();
 }
 
@@ -134,6 +146,10 @@ static void _starpu_mpi_coop_send_flush(struct _starpu_mpi_coop_sends *coop_send
 	/* 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);