[petsc-users] MatCreateMPIAIJWithSplitArrays for symmetric matrix?

Daniel Langr daniel.langr at gmail.com
Mon Nov 8 06:47:55 CST 2010


Dne 8.11.2010 13:31, Jed Brown napsal(a):
> On Mon, Nov 8, 2010 at 13:07, Daniel Langr <daniel.langr at gmail.com
> <mailto:daniel.langr at gmail.com>> wrote:
>
>     Ok, that's a good idea and I will try it. I can estimate total
>     number of nonzeros (limited by the amount of memory), but I can
>     hardly estimate number of nonzeros per particular rows (d_nnz,
>     o_nnz). So I need to use d_nz and o_nz, right? And for symmetric
>     matrix, what do d_nz and o_nz mean? Is it number of nonzeros for
>     whole matrix row, or just upper triangular part? (I don't see this
>     in manual page.)
>
>
> It is only for the upper triangular part.  If you have no way to guess
> the number per row, then just set {d,o}_nz, but note that this is
> pessimistic because the last rows of the matrix necessarily have fewer
> nonzeros in the upper triangular part.
>
>     (That was my point, through MatMPISBAIJSetPreallocation I need to
>     estimate number of nonzeros per row. Not just number of nonzeros of
>     whole local part. If I construct CSR arrays directly, I don't need
>     this row-estimates.)
>
>
> Here's a little secret: if you assemble the matrix row-by-row, in-order,
> then you need only estimate the average number of nonzeros per row.  The
> implementation is not stupid, so early rows can blow over their initial
> estimates as long as later rows make up for it by being under the
> estimate.  For example, with a 5-point Laplacian, you can
> MatSeqSBAIJSetPreallocation(A,1,3,PETSC_NULL) and you will see something
> like
>
> Matrix Object:
>    type: seqsbaij
>    rows=400, cols=400
>    total: nonzeros=1160, allocated nonzeros=1200
>    total number of mallocs used during MatSetValues calls =0
>        block size is 1
>
> So no mallocs even though the early rows have more than 3 nonzeros in
> the upper triangular part.  If you assemble out-of-order, or in a
> scattered fashion (such as for a finite element method) then this will
> be costly.  Does this help?

Great, helps much, that is something I was hoping for :). As for now, we 
can generate matrix in-order. In the future it seems we will need to 
generate matrix in "transposed" order, e.g. row-by-row order for the 
lower triangular part. But then I suppose we will need to use 
MatMultTranspose() or MatCreateTranspose() if the performance won't 
suffer much (I have not tried it yet, so I have no idea about it for now.)

Thanks a lot
Daniel

> Jed



More information about the petsc-users mailing list