[petsc-users] MatSetValuesCOO after MatDuplicate

Maxime Bouyges maxime.bouyges at gmail.com
Thu Apr 27 14:15:53 CDT 2023

Thanks for the prompt confirmation! I have to admit that I hadn't tested 
yet the memory performance of using COO instead of the classical 
MatSetValues. I will keep both approach in my code and do more 
performance checks (CPU and memory) before I take a decision. In any 
case, calling "again" MatSetPreallocationCOO after MatDuplicate is 
working so I can live with that. I just wanted to be sure that it was a 
"bug" (or a missing feature I would say) and not a misuse from me.

If you are curious, here is the context. I am using the Julia langage to 
solve an ODE using the DifferentialEquations.jl package 
(https://github.com/SciML/DifferentialEquations.jl). The system jacobian 
matrix is a Julia SparseMatrix 
(https://docs.julialang.org/en/v1/stdlib/SparseArrays/) with CSC format. 
I am using PETSc as a backend for the linear algebra (with 
https://github.com/bmxam/PetscWrap.jl). So at some point I have to fill 
a PETSc matrix with the values of a Julia CSC sparse matrix. Recovering 
the COO information from the Julia matrix is trivial, and using 
MatSetValuesCOO with this information seems very efficient. However, the 
ODE solver does several matrix duplication (wrapped as MatDuplicate in 
my case) and that's why I stumbled accross this bug. But as explained 
above 1) I can call MatSetPreallocationCOO each time MatDuplicate is 
called and 2) I can keep the classical MatSetValues and use an other way 
to fill the PETSc matrix.

Thanks again for your quick answer (and for the great library ;)) !

Best regards,

Maxime Bouyges

On 26/04/2023 23:26, Junchao Zhang wrote:
> It sounds like we should do reference counting on the internal data 
> structures used by COO>.
> --Junchao Zhang
> On Wed, Apr 26, 2023 at 3:59 PM Barry Smith <bsmith at petsc.dev> wrote:
>        Yes, it looks like a bug since no one tested this situation.
>        MatSetPreallocationCOO() is pretty heavy memory-wise. It
>     essentially keeps a copy of all the coo_i, coo_j indices within
>     the Mat as well as the usual matrix information. So in your
>     scenario, you will have two copies of all this stuff; lots of
>     memory. Is this really what you need?
>     > On Apr 26, 2023, at 4:07 PM, Maxime Bouyges
>     <maxime.bouyges at gmail.com> wrote:
>     >
>     > Dear PETSc developers,
>     >
>     > I am trying to use the MatSetValuesCOO function (very
>     appropriate and performant for my case) but I am encountering a
>     problem when I use it on a Mat obtained with MatDuplicate. It
>     seems that the non-zero pattern is preserved by MatDuplicate, but
>     not the "COO information". Here are the few steps to reproduce the
>     problem:
>     > MatCreate(comm, A)
>     > MatSetUp(A)
>     > MatSetPreallocationCOO(A, ncoo, coo_i, coo_j)
>     > MatSetValuesCOO(A, coo_v, INSERT_VALUES) # -> works ok
>     > MatDuplicate(A, MAT_DO_NOT_COPY_VALUES, B)
>     > MatSetValuesCOO(B, coo_v, INSERT_VALUES) # -> seg-fault
>     >
>     > Is this an expected behaviour? Of course if I call again
>     MatSetPreallocationCOO on the duplicated matrix it's ok but the
>     performance is lost in my case. Is there a way to fix it? Thank
>     you in advance.
>     >
>     > Best regards,
>     >
>     > Maxime Bouyges
>     >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20230427/01a92930/attachment.html>

More information about the petsc-users mailing list