Maybe start the data exchange by sending a (presumably short)
list/array/index-function of the dirty/not-dirty blocks status
then putting if conditionals before the Isend/Irecv so that only
dirty blocks are exchanged?
I hope this helps,
On 05/01/2013 01:28 PM, Thomas Watson wrote:
> I have a program where each MPI rank hosts a set of data blocks. After
> doing computation over *some of* its local data blocks, each MPI rank
> needs to exchange data with other ranks. Note that the computation may
> involve only a subset of the data blocks on a MPI rank. The data
> exchange is achieved at each MPI rank through Isend and Irecv and then
> Waitall to complete the requests. Each pair of Isend and Irecv exchanges
> a corresponding pair of data blocks at different ranks. Right now, we do
> Isend/Irecv for EVERY block!
> The idea is that because the computation at a rank may only involves a
> subset of blocks, we could mark those blocks as dirty during the
> computation. And to reduce data exchange bandwidth, we could only
> exchanges those *dirty* pairs across ranks.
> The problem is: if a rank does not compute on a block 'm', and if it
> does not call Isend for 'm', then the receiving rank must somehow know
> this and either a) does not call Irecv for 'm' as well, or b) let Irecv
> for 'm' fail gracefully.
> My questions are:
> 1. how Irecv will behave (actually how MPI_Waitall will behave) if the
> corresponding Isend is missing?
> 2. If we still post Isend for 'm', but because we really do not need to
> send any data for 'm', can I just set a "flag" in Isend so that
> MPI_Waitall on the receiving side will "cancel" the corresponding Irecv
> immediately? For example, I can set the count in Isend to 0, and on the
> receiving side, when MPI_Waitall see a message with empty payload, it
> reclaims the corresponding Irecv? In my code, the correspondence between
> a pair of Isend and Irecv is established by a matching TAG.
> users mailing list