:orphan: # PetscCommBuildTwoSided discovers communicating ranks given one-sided information, moving constant-sized data in the process (often message lengths) ## Synopsis ``` #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) ``` Collective ## 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 -*** algorithm to set up two-sided communication. Default is allreduce for communicators with <= 1024 ranks, otherwise ibarrier. ## Notes 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. ## References - **** -*** 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` ## Level developer ## Location src/sys/utils/mpits.c --- [Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/sys/utils/mpits.c) [Index of all Sys routines](index.md) [Table of Contents for all manual pages](/manualpages/index.md) [Index of all manual pages](/manualpages/singleindex.md)