All notes

Async communications are effective

Async communications.

On a good cluster, with enough local work, the wait after non-blocking MPI calls is negligible.

Context

In my paper submitted to the mc conference, I use domain decomposition for a neutron transport solver [link]. The subdomains exchange data during each matrix-vector product, so communication is frequent. I use non-blocking calls [Algorithm] to overlap those exchanges with local computation. The waiting time I measured was generally negligible [Table].

This note records the waiting times for a case with 900 million unknowns. The results section is still a draft.

Algorithm

Each subdomain computes its part of the matrix-vector product as follows:

for(const auto& subdomain : domain_neighbors)
{
  mpi::request_in[i] = mpi::world.irecv(x_upwind); // async
  // Copy outgoing part of x in the x_out buffer
  mpi::request_out[i] = mpi::world.isend(x_out); // async
  i++;
}

y += A_diag * x; // local work

mpi::world.waitall(request_in);
mpi::world.waitall(request_out);

y += A_offd * x_upwind;

Cluster

The runs used Topaze at TGCC:

  • 864 nodes
  • Two AMD EPYC 7763 2.45 GHz sockets per node
  • 64 cores per socket, for 128 cores per node
  • InfiniBand HDR-100 interconnect

Results without asynchronous progress

(Draft)

The table is still to be added. It will report wait times for request_in and request_out, and the number of communications or waits, on ranks 0, last/2, and last, with last=size-1.

Next

Read as Markdown

Written by Kenneth Assogba. Email me