<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Feb 8, 2015 at 7:20 PM, Ronal Celaya <span dir="ltr"><<a href="mailto:ronalcelayavzla@gmail.com" target="_blank">ronalcelayavzla@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="font-size:12.8000001907349px">I know that. I want to have all the vector x replicated in all processes and update it in each iteration, so I don't need to communicate the vector x each time MatMult() is called.</span><div style="font-size:12.8000001907349px">I'm not sure I'm making myself clear, sorry</div></div></blockquote><div><br></div><div>1) This is not a scalable strategy.</div><div><br></div><div>2) If you know A and all the updates to x locally, why don't you just compute y directly?</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote">On Sun, Feb 8, 2015 at 7:52 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span><br>
> On Feb 8, 2015, at 6:14 PM, Ronal Celaya <<a href="mailto:ronalcelayavzla@gmail.com" target="_blank">ronalcelayavzla@gmail.com</a>> wrote:<br>
><br>
> Thank you Barry.<br>
> Is there a way to reuse the vector x? I don't want to gather the vector in each iteration, I'd rather replicate the vector x in each process.<br>
<br>
</span>  I don't understand. With each new matrix vector product there are new values in x (which are updated from other parts of the CG algorithm), these new values need to be communicated in the MatMult() to where they are needed; you can't just reuse the old values in x.<br>
<span><font color="#888888"><br>
  Barry<br>
</font></span><div><div><br>
><br>
> Thanks in advance.<br>
><br>
> On Sun, Feb 8, 2015 at 7:17 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
> > On Feb 8, 2015, at 5:41 PM, Ronal Celaya <<a href="mailto:ronalcelayavzla@gmail.com" target="_blank">ronalcelayavzla@gmail.com</a>> wrote:<br>
> ><br>
> > Hello<br>
> > If I have a MatMult operation inside a for loop (e. g. CG algorithm), and the matrix A is MPIAIJ, vector x is gathered to local process in every loop?<br>
><br>
>   Yes, internal to MatMult() it calls MatMult_MPIAIJ() which is in src/mat/impls/aij/mpi/mpiaij,c which has the following code:<br>
><br>
> PetscErrorCode MatMult_MPIAIJ(Mat A,Vec xx,Vec yy)<br>
> {<br>
>   Mat_MPIAIJ     *a = (Mat_MPIAIJ*)A->data;<br>
>   PetscErrorCode ierr;<br>
>   PetscInt       nt;<br>
><br>
>   PetscFunctionBegin;<br>
>   ierr = VecGetLocalSize(xx,&nt);CHKERRQ(ierr);<br>
>   if (nt != A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Incompatible partition of A (%D) and xx (%D)",A->cmap->n,nt);<br>
>   ierr = VecScatterBegin(a->Mvctx,xx,a->lvec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);<br>
>   ierr = (*a->A->ops->mult)(a->A,xx,yy);CHKERRQ(ierr);<br>
>   ierr = VecScatterEnd(a->Mvctx,xx,a->lvec,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);<br>
>   ierr = (*a->B->ops->multadd)(a->B,a->lvec,yy,yy);CHKERRQ(ierr);<br>
>   PetscFunctionReturn(0);<br>
><br>
> The needed values of x are communicated in the VecScatterBegin() to VecScatterEnd(). Note only exactly those values needed by each process are communicated in the scatter so not all values are communicated to all processes. Since the matrix is very sparse (normally) only a small percentage of the values need to be communicated.<br>
><br>
>   Barry<br>
><br>
> ><br>
> > I'm sorry for my English.<br>
> ><br>
> > Regards,<br>
> ><br>
> > --<br>
> > Ronal Celaya<br>
><br>
><br>
><br>
><br>
> --<br>
> Ronal Celaya<br>
<br><span class="HOEnZb"><font color="#888888">
</font></span></div></div></blockquote></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr">Ronal Celaya<br></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div>
</div></div>