<div dir="ltr"><div dir="ltr">On Fri, Oct 8, 2021 at 6:29 AM Claudio Kozický <<a href="mailto:koziccla@fit.cvut.cz">koziccla@fit.cvut.cz</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I am using PETSc in a performance comparison that evaluates the<br>
performance of parallel sparse matrix-vector multiplication (SpMV).  For<br>
this purpose I have implemented a simple SpMV operation using PETSc,<br>
which multiplies parallel matrix A (type MatAIJ) with parallel vector x1<br>
and stores the result in parallel vector y1.  Thus I perform SpMV using<br>
PETSc as MatMult(A, x1, y1).  This part works without any problems.<br>
<br>
I would also like to implement SpMV operation y2 = A * x2, where x2 is a<br>
sequential vector (i.e. created using VecCreateSeq) but where A and y2<br>
are still parallel.  The resulting implementation would be something<br>
like:<br>
<br>
MatCreateAIJ(..., &A);     // a parallel matrix<br>
VecCreateSeq(..., &x2);    // a per-process _sequential_ vector<br>
VecCreateMPI(..., &y2);    // a parallel vector<br>
MatMult(A, x2, y2);<br></blockquote><div><br></div><div>You are correct. MatMult() is not intended to be used with different communicators.</div><div>You can get the effect you want by making a block diagonal matrix A with P*N columns.</div><div><br></div><div>  Thanks,</div><div><br></div><div>      Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
The motivation of storing all of x2 in each process to is remove the<br>
need of broadcasting any elements of x2 (this approach makes sense in<br>
the context of what I am benchmarking).  However I cannot seem to get<br>
this approach to work in PETSc.  For example when I try this approach<br>
with a 4-by-4 matrix, with two order-4 vectors and using two MPI<br>
processes, then PETSc prints:<br>
<br>
Nonconforming object sizes<br>
Mat mat,Vec x: local dim 2 4<br>
<br>
I have attached a minimal working example that demonstrates what I am<br>
attempting to perform.  Could it be that PETSc does not support<br>
combining a parallel and sequential vector in a single MatMult call?<br>
<br>
I have found functions for scattering and gathering vectors in the<br>
documentation of PETSc, but these do not seem to be a good match for<br>
what I am trying to benchmark.  My intention is for each process to keep<br>
an identical copy of vector x2 and therefore the necessity to scatter or<br>
gather values in x2 should never arise.<br>
<br>
I would appreciate if somebody could help point me in the right<br>
direction regarding my failing MatMult call.  Thanks!<br>
<br>
-- <br>
Claudio Kozický<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>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><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>