I plan to use MPI to build a solver that supports asynchronous communication. The basic idea is as follows.
Assume there are two parallel processes. Process 1 wants to send good solutions it finds periodically to process 2, and ask for good solutions from process 2 when it needs diversification.
-
At some point, process 1 uses
MPI_sendto send a solution to process 2. How to guarantee there is anMPI_Revmatching thisMPI_Send, since this send is triggered dynamically? -
When process 1 needs a solution, how can it send a request to process 2, and process 2 will notice its request in time?
Depending on the nature of the MPI_* function you call, the send will block until a matching receive has been called by another process, so you need to make sure that’s going to happen in your code.
There are also non-blocking function calls MPI_Isend f.ex, which gives you a request-handle which you can check on later to see if the process’ send has been received by a matching receive.
Regarding your issue, you could issue a non-blocking receive (MPI_Irecv being the most basic) and check on the status every n seconds depending on your application. The status will then be set to complete when a message has been received and is ready to be read.
If it’s time sensitive, use a blocking call while waiting for a message. The blocking mechanism (in OpenMPI at least) uses a spinning poll however, so the waiting process will be eating 100% cpu.