discovers communicating ranks given one-sided information, moving constant-sized data in the process (often message lengths)


#include "petscsys.h"  
PetscErrorCode PetscCommBuildTwoSided(MPI_Comm comm, PetscMPIInt count, MPI_Datatype dtype, PetscMPIInt nto, const PetscMPIInt *toranks, const void *todata, PetscMPIInt *nfrom, PetscMPIInt **fromranks, void *fromdata)


Input Parameters#

  • comm - communicator

  • count - number of entries to send/receive (must match on all ranks)

  • dtype - datatype to send/receive from each rank (must match on all ranks)

  • nto - number of ranks to send data to

  • toranks - ranks to send to (array of length nto)

  • todata - data to send to each rank (packed)

Output Parameters#

  • nfrom - number of ranks receiving messages from

  • fromranks - ranks receiving messages from (length nfrom, caller should PetscFree())

  • fromdata - packed data from each rank, each with count entries of type dtype (length nfrom, caller responsible for PetscFree())

Options Database Key#

  • -build_twosided <allreduce|ibarrier|redscatter> - algorithm to set up two-sided communication. Default is allreduce for communicators with <= 1024 ranks, otherwise ibarrier.


This memory-scalable interface is an alternative to calling PetscGatherNumberOfMessages() and PetscGatherMessageLengths(), possibly with a subsequent round of communication to send other constant-size data.

Basic data types as well as contiguous types are supported, but non-contiguous (e.g., strided) types are not.


  • **** -*** Hoefler, Siebert and Lumsdaine, The MPI_Ibarrier implementation uses the algorithm in Scalable communication protocols for dynamic sparse data exchange, 2010.

See Also#

PetscGatherNumberOfMessages(), PetscGatherMessageLengths(), PetscCommBuildTwoSidedSetType(), PetscCommBuildTwoSidedType





Edit on GitLab

Index of all Sys routines
Table of Contents for all manual pages
Index of all manual pages