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

Reply via email to