[petsc-users] MatSetValuesCOO after MatDuplicate

maxime.bouyges maxime.bouyges at gmail.com
Fri Apr 28 15:10:39 CDT 2023


Hi Junchao,I share you pov, but I don't know what PETSc looks like deep down. I was afraid to suggest that because I guess handling the case where A is destroyed but B remains while pointing to the COO information of A... But if you can of course that will be nice (for me at least!). I will watch closely the next PETSc changelog ;).Maxime
-------- Message d'origine --------De : Junchao Zhang <junchao.zhang at gmail.com> Date : 28/04/2023  21:52  (GMT+01:00) À : Maxime Bouyges <maxime.bouyges at gmail.com> Cc : Barry Smith <bsmith at petsc.dev>, petsc-users at mcs.anl.gov Objet : Re: [petsc-users] MatSetValuesCOO after MatDuplicate Hi, Maxime,  Thanks for the introduction. It sounds to me it makes sense to share the COO information in MatDuplicate.  The data structure consumes a lot of memory, making it more justified.  I will add it.  --Junchao ZhangOn Thu, Apr 27, 2023 at 2:15 PM Maxime Bouyges <maxime.bouyges at gmail.com> wrote:
  
    
  
  
    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/20230428/3d6c42b4/attachment-0001.html>


More information about the petsc-users mailing list