[petsc-users] Scatter parallel Vec to sequential Vec on non-zeroth process
Junchao Zhang
junchao.zhang at gmail.com
Sat Jul 3 22:36:29 CDT 2021
VecScatterCreateToAll() scatters the MPI vector to a sequential vector on
every rank (as if each rank has a duplicate of the same sequential vector).
If the sample code you provided is what you want, it is fine and we just
need to implement a minor optimization in petsc to make it efficient. But
if you want to put the scatter in a loop as follows, then it is a very bad
code.
for (p=0; p<size; i++) {
loc_tgt_size = 0;
if (rank == p){
loc_tgt_size = n;
}
ierr = VecCreateSeq(PETSC_COMM_SELF, loc_tgt_size, &tgt_vec); CHKERRQ(ierr);
ierr = VecZeroEntries(tgt_vec); CHKERRQ(ierr);
// Scatter source vector to target vector on one process
ierr = ISCreateStride(PETSC_COMM_SELF, loc_tgt_size, 0, 1, &is);
CHKERRQ(ierr);
ierr = VecScatterCreate(src_vec, is, tgt_vec, is, &sctx); CHKERRQ(ierr);
ierr = VecScatterBegin(sctx, src_vec, tgt_vec, INSERT_VALUES,
SCATTER_FORWARD); CHKERRQ(ierr);
ierr = VecScatterEnd(sctx, src_vec, tgt_vec, INSERT_VALUES,
SCATTER_FORWARD); CHKERRQ(ierr);
...
}
--Junchao Zhang
On Sat, Jul 3, 2021 at 1:27 PM Peder Jørgensgaard Olesen <pjool at mek.dtu.dk>
wrote:
> Yeah, scattering a parallel vector to a sequential on one rank was exactly
> what I wanted to do (apologies if I didn't phrase that clearly). A code
> like the one I shared does just what I needed, replacing size-1 with the
> desired target rank in the if-statement.
>
>
> Isn't what you describe what VecScatterCreateToAll is for?
>
>
>
> Med venlig hilsen / Best regards
>
> Peder
> ------------------------------
> *Fra:* Junchao Zhang <junchao.zhang at gmail.com>
> *Sendt:* 3. juli 2021 04:42:48
> *Til:* Peder Jørgensgaard Olesen
> *Cc:* Jed Brown; petsc-users at mcs.anl.gov
> *Emne:* Re: Sv: [petsc-users] Scatter parallel Vec to sequential Vec on
> non-zeroth process
>
> Peder,
> Your example scatters a parallel vector to a sequential vector on one
> rank. It is a pattern like MPI_Gatherv.
> I want to see how you scatter parallel vectors to sequential vectors on
> every rank.
>
> --Junchao Zhang
>
>
> On Fri, Jul 2, 2021 at 4:07 AM Peder Jørgensgaard Olesen <pjool at mek.dtu.dk>
> wrote:
>
>> Matt's method seems to work well, though instead of editing the actual
>> function I put the relevant parts directly into my code. I made the small
>> example attached here.
>>
>>
>> I might look into Star Forests at some point, though it's not really
>> touched upon in the manual (I will probably take a look at your paper,
>> https://arxiv.org/abs/2102.13018).
>>
>>
>> Med venlig hilsen / Best regards
>>
>> Peder
>> ------------------------------
>> *Fra:* Junchao Zhang <junchao.zhang at gmail.com>
>> *Sendt:* 1. juli 2021 16:38:29
>> *Til:* Jed Brown
>> *Cc:* Peder Jørgensgaard Olesen; petsc-users at mcs.anl.gov
>> *Emne:* Re: Sv: [petsc-users] Scatter parallel Vec to sequential Vec on
>> non-zeroth process
>>
>> Peder,
>> PETSCSF_PATTERN_ALLTOALL only supports MPI_Alltoall (not Alltoallv),
>> and is only used by petsc internally at few places.
>> I suggest you can go with Matt's approach. After it solves your
>> problem, you can distill an example to demo the communication pattern. Then
>> we can see how to efficiently support that in petsc.
>>
>> Thanks.
>> --Junchao Zhang
>>
>>
>> On Thu, Jul 1, 2021 at 7:42 AM Jed Brown <jed at jedbrown.org> wrote:
>>
>>> Peder Jørgensgaard Olesen <pjool at mek.dtu.dk> 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
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210703/278348d7/attachment-0001.html>
More information about the petsc-users
mailing list