<div dir="ltr">I pushed PetscCommBuildTwoSided() which is a scalable interface for setting up two-sided communication given one-sided information.<div><br></div><div><a href="https://bitbucket.org/petsc/petsc-dev/commits/721cf8e8a07d6de2abc9b4f621f09a70e0d48012#Lsrc/sys/utils/mpits.cT257">https://bitbucket.org/petsc/petsc-dev/commits/721cf8e8a07d6de2abc9b4f621f09a70e0d48012#Lsrc/sys/utils/mpits.cT257</a><br>
</div><div><br></div><div style>The default interface uses the O(size) MPI_Reduce, but if you have an MPI-3 implementation (providing MPI_Ibarrier), it uses the nonblocking consensus algorithm from</div><div style><br></div>
<div style><a href="http://www.unixer.de/publications/img/hoefler-dsde-protocols.pdf">http://www.unixer.de/publications/img/hoefler-dsde-protocols.pdf</a><br></div><div style><br></div><div style>You can revert to the old implementation using -build_twosided ALLREDUCE (versus IBARRIER). I'd like to eventually update most uses of PetscGatherNumberOfMessages() and PetscGatherMessageLengths() to use this interface, and to use it in new code whenever possible.</div>
<div style><br></div><div style>In the implementation, I wrote a utility similar to PetscFreeSpace, but with what I think is a safer and more generic interface. It's currently called SegArray, but I'd be happy to change the name (maybe StreamBuffer). It's essentially used to buffer a chunked stream (with low-latency incremental allocation) and later return it as a contiguous array. I'd appreciate comments on the API before moving it to include/petsc-private.</div>
<div style><br></div><div style><a href="https://bitbucket.org/petsc/petsc-dev/commits/721cf8e8a07d6de2abc9b4f621f09a70e0d48012#Lsrc/sys/utils/mpits.cT42">https://bitbucket.org/petsc/petsc-dev/commits/721cf8e8a07d6de2abc9b4f621f09a70e0d48012#Lsrc/sys/utils/mpits.cT42</a><br>
</div></div>