Peder Jørgensgaard Olesen <[email protected]> writes: > Each process is assigned an indexed subset of the tasks (the tasks are of > constant size), and, for each task index, the relevant data is scattered as a > SEQVEC to the process (this is done for all processes in each step, using an > adaption of the code in Matt's link). This way each process only receives > just the data it needs to complete the task. While I'm currently working with > very moderate size data sets I'll eventually need to handle something rather > more massive, so I want to economize memory where possible and give each > process only the data it needs.
>From the sounds of it, this pattern ultimately boils down to MPI_Gather being >called P times where P is the size of the communicator. This will work okay >when P is small, but it's much less efficient than calling MPI_Alltoall (or >MPI_Alltoallv), which you can do by creating one PetscSF that ships the needed >data to each task and PETSCSF_PATTERN_ALLTOALL. You can see an example. https://gitlab.com/petsc/petsc/-/blob/main/src/vec/is/sf/tests/ex3.c#L93-151
