Pierre,
________________________________

Well, that’s just not an option. I don’t want the code to error, I want a 
fallback mechanism so that I can do the MatMatMult myself, column by column (or 
implement this as part of issue #608 in the case of dense B and C so neither 
José nor me have to bother about this again).
That makes MatMatMult very hard to use now, because you can’t tell a priori if 
your code will run or not if the types of your A and B are variable (because of 
an unimplemented MatMatMult).

I'll add this support.

What you propose there looks good to me.
(Though I’d like to be able to skip MatProductSymbolic() in the case of a dense 
Wmat allocated in user code, but this is very minor)

Since you Wmat is allocated, you should skip MatProductSymbolic() by calling
MatProductCreateWithMat( , , ...,Wmat);
..
MatProductSetFromOptions()
MatProductNumeric() // skip MatProductSymbolic()

The new API is introduced to unify and cleanup previous random design of 
mat-mat operations, which becomes inextensible and difficult to manage. The new 
API is more flexible, allowing options for various algorithmic implementations, 
but would take a while to be bug-free and ensure needed features are 
maintained. Report to me -- I'll do my best to provided needed support.

Hong
________________________________
From: Pierre Jolivet 
<pierre.joli...@enseeiht.fr<mailto:pierre.joli...@enseeiht.fr>>
Sent: Tuesday, April 21, 2020 10:53 AM
To: Zhang, Hong <hzh...@mcs.anl.gov<mailto:hzh...@mcs.anl.gov>>
Cc: petsc-dev <petsc-dev@mcs.anl.gov<mailto:petsc-dev@mcs.anl.gov>>
Subject: Re: [petsc-dev] MATOP_MAT_MULT



On 21 Apr 2020, at 5:22 PM, Zhang, Hong 
<hzh...@mcs.anl.gov<mailto:hzh...@mcs.anl.gov>> wrote:

Pierre,
MatMatMult_xxx() is removed from MatOps table.

Shouldn’t there be a deprecation notice somewhere?
There is nothing about MATOP_MAT_MULT in the 3.13 changelog 
https://www.mcs.anl.gov/petsc/documentation/changes/313.html
For example, I see that in SLEPc, José is currently making these checks, which 
are in practice useless as they always return PETSC_FALSE? 
https://gitlab.com/slepc/slepc/-/blob/master/src/sys/classes/bv/impls/contiguous/contig.c#L191
(Maybe José is aware of this and this is just for testing)

MatMatMult() is replaced by
MatProductCreate()
MatProductSetType(,MATPRODUCT_AB)
MatProductSetFromOptions()
MatProductSymbolic()
MatProductNumeric()

Where/when do you need query a single matrix for its product operation?

I didn’t want to bother at first with the new API, because I’m only interested 
in C = A*B with C and B being dense.
Of course, I can update my code, but if I understand Stefano’s issue correctly, 
and let’s say my A is of type SBAIJ, for which there is no MatMatMult, the code 
will now error out in the MatProduct?
There is no fallback mechanism? Meaning I could in fact _not_ use the new API 
and will just have to loop on all columns of B, even for AIJ matrices.

Thanks,
Pierre

Hong

________________________________

From: petsc-dev 
<petsc-dev-boun...@mcs.anl.gov<mailto:petsc-dev-boun...@mcs.anl.gov>> on behalf 
of Pierre Jolivet 
<pierre.joli...@enseeiht.fr<mailto:pierre.joli...@enseeiht.fr>>
Sent: Tuesday, April 21, 2020 7:50 AM
To: petsc-dev <petsc-dev@mcs.anl.gov<mailto:petsc-dev@mcs.anl.gov>>
Subject: [petsc-dev] MATOP_MAT_MULT

Hello,
Am I seeing this correctly?
#include <petsc.h>

int main(int argc,char **args)
{
  Mat               A;
  PetscBool         hasMatMult;
  PetscErrorCode    ierr;

  ierr = PetscInitialize(&argc,&args,NULL,NULL);if (ierr) return ierr;
  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
  ierr = MatSetType(A,MATMPIAIJ);CHKERRQ(ierr);
  ierr = MatHasOperation(A,MATOP_MAT_MULT,&hasMatMult);CHKERRQ(ierr);
  printf("%s\n", PetscBools[hasMatMult]);
  ierr = PetscFinalize();
  return ierr;
}

=> FALSE

I believe this is a regression (or at least an undocumented change) introduced 
here: https://gitlab.com/petsc/petsc/-/merge_requests/2524/
I also believe Stefano raised a similar point there: 
https://gitlab.com/petsc/petsc/-/issues/608
This is a performance killer in my case because I was previously using this 
check to know whether I could use MatMatMult or had to loop on all columns and 
call MatMult on all of them.
There is also a bunch of (previously functioning but now) broken code, e.g., 
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/transpose/transm.c.html#line105
 or 
https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/nest/matnest.c.html#line2105
Is this being addressed/documented?

Thanks,
Pierre

Reply via email to