Thanks a lot. Best, Ehsan
On Wed, Jun 22, 2016 at 5:01 PM, Barry Smith <[email protected]> wrote: > > 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. > > 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) > > 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. > > Barry > > > > On Jun 22, 2016, at 3:41 PM, ehsan sadrfaridpour <[email protected]> > wrote: > > > > Now, they are sparse (AIJ) and sequential. But I will upgrade the code > to parallel later. > > > > > > On Wed, Jun 22, 2016 at 4:34 PM, Barry Smith <[email protected]> wrote: > > > > Matrix A and B, sparse or dense, parallel or sequential? > > > > > > > On Jun 22, 2016, at 3:27 PM, ehsan sadrfaridpour <[email protected]> > wrote: > > > > > > Hi, > > > I need the diagonal elements from result of multiplying matrix A, B > together. > > > I can get by multiplying the 2 matrices and then call MatGetDiagonal. > > > However, I only need the values on the diagonal and the rest of the > elements are useless for me. > > > As the size of matrices increase, I am afraid it affect the > performance. > > > > > > So, I am looking for another method that only calculates the diagonal > of multiplication and not the rest of elements. > > > If there is not such a method for matrix, how can I use the vector's > operations to reach the same results? > > > > > > > > > Best, > > > Ehsan > > > > > >
