[petsc-users] Matrix preallocation

Mark Adams mfadams at lbl.gov
Sat Feb 5 05:20:07 CST 2022


On Fri, Feb 4, 2022 at 11:47 PM Samuel Estes <samuelestes91 at gmail.com>
wrote:

> Hi,
>
> I have a very basic question about matrix preallocation. I am trying to
> use the MatCreate(), MatSetFromOptions(), MatXXXXSetPreallocation()
> paradigm. I thought that I should use the MatXAIJSetPreallocation() routine
> since the code may be run with a SeqAIJ or MPIAIJ matrix but I do not
> understand all of the inputs required for the
> MatXAIJSetPreallocation routine. In particular, the dnnzu and
> onnzu variables don't quite make sense to me. Can these be NULL?
>

Yes. The integer is ignored if you provide the array. Just make sure that
the integer is an upper bound on the number of non-zeros in any row. If
not, MatSetValues can be very slow. Otherwise, the performance hit is not
bad.


> I was basically just hoping for a routine that would preallocate for
> either a sequential or parallel matrix depending on what was given at
> runtime.
>

That is what the "X" is for. It is basically syntactic sugar to call the
right version of preallocate (seq, mpi, blocked versions, hypre, etc.)


> This routine seems to be what I want but I don't understand it very well
> and the documentation hasn't helped me to figure it out.
>

Sorry,


>
> A related followup question: Is it good practice to use this function or
> should I just use the other routines like MatSeqAIJSetPreallocation() and
> MatMPIAIJSetPreallocation()?
>

Yes this is the way to go.
TL;DR
Before we had a sparse matrix type explosion with GPUs, you could call both
the MPI and Seq versions and be fine. You could call the blocked versions I
suppose to be safe.
But now there are several GPU/device enabled matrix types and "X" is
convenient.


>
> And finally my last question: if I were to use the
> MatSeqAIJSetPreallocation()/MatMPIAIJSetPreallocation() routines for
> preallocating memory, is it common to just call MatGetType() then call the
> appropriate routine depending on whether or not the matrix is parallel or
> not?
>

You could do that but no need. As I said, the old way was to call both.


> I ask because when I have tested these routines out, it seems
> that MatSeqAIJSetPreallocation() works even for parallel matrices which is
> a bit confusing. I'm assuming that it just sets the diagonal part of the
> matrix?
>

There is probably a default. It should work w/o any of these calls, but
performance would suffer if the default (10 maybe) is too small for you.

Mark


> I hope that my questions were clear. Let me know if they need
> clarification and thanks in advance for the help!
>
> Sam
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20220205/cc5f01bc/attachment.html>


More information about the petsc-users mailing list