3.5.1. Overview
The most general communication method uses MPI_IMPROBE to learn
the size of incoming MPI messages, to learn which task a message is aimed for,
and its sequence number. After receiving a reply from MPI_IMPROBE, a buffer
is allocated, a non-blocking `MPI_IMRECV is issued, and the message is
received and unpacked.
On systems that do not support the MPI_IMPROBE protocol it can be
replace with a dual-package protocol, where the 1st package contains
information about the size of the 2nd package.
Threads can either split their work between updating tasks and handling MPI messages, or a few threads can be set aside to exclusively work on sending and receiving, thus minizing the latency associated with task updates.