<div dir="ltr"><div><div>Thanks a lot.<br><br></div>Best,<br></div>Ehsan<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 22, 2016 at 5:01 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"><br>
   Say you want to compute the diagonal of A * B where A and B are PETSc SeqAIJ matrices. If we use "MATLAB" notation A(i,:) to represent the ith row of A and B(:,j) to represent the nth column of B then you are computing  for each i A(i,:) * B(:,i) that is the ith row of A with the ith column of B.<br>
<br>
   PETSc SeqAIJ matrices are stored "by row" and for each row is stored the column indices of the nonzeros (sorted) and the numerical values for those columns. If the nonzero structure of B is not related to the non-zero structure of A then computing the diagonal is a set of "sparse" vector vector products. Generic sparse vector vector products are never super efficient and to make matters worse with SeqAIJ we don't have stored directly the columns of B (only the rows)<br>
<br>
  If you look at MatMatMult_SeqAIJ_SeqAIJ() you will see we have SIX implementations using different approaches to try to get reasonable performance of the sparse matrix-matrix product. So if this computation of the diagonal is an important kernel in your code (and takes significant time) then you have some work cut out for you to write the appropriate code using the SeqAIJ data structure directly. We don't provide anything out of the box for this computation. I suggest looking at the various approaches for sparse matrix matrix product and see what one looks reasonable to specialize to compute just the diagonal portion.<br>
<span class="HOEnZb"><font color="#888888"><br>
  Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
> On Jun 22, 2016, at 3:41 PM, ehsan sadrfaridpour <<a href="mailto:it.sadr@gmail.com">it.sadr@gmail.com</a>> wrote:<br>
><br>
> Now, they are sparse (AIJ) and sequential. But I will upgrade the code to parallel later.<br>
><br>
><br>
> On Wed, Jun 22, 2016 at 4:34 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
>    Matrix A and B, sparse or dense, parallel or sequential?<br>
><br>
><br>
> > On Jun 22, 2016, at 3:27 PM, ehsan sadrfaridpour <<a href="mailto:it.sadr@gmail.com">it.sadr@gmail.com</a>> wrote:<br>
> ><br>
> > Hi,<br>
> > I need the diagonal elements from result of multiplying matrix A, B together.<br>
> > I can get by multiplying the 2 matrices and then call MatGetDiagonal.<br>
> > However, I only need the values on the diagonal and the rest of the elements are useless for me.<br>
> > As the size of matrices increase, I am afraid it affect the performance.<br>
> ><br>
> > So, I am looking for another method that only calculates the diagonal of multiplication and not the rest of elements.<br>
> > If there is not such a method for matrix, how can I use the vector's operations to reach the same results?<br>
> ><br>
> ><br>
> > Best,<br>
> > Ehsan<br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>