[petsc-dev] Branches with additional features

Jed Brown jed at jedbrown.org
Mon May 29 15:20:32 CDT 2017


Pierre Jolivet <Pierre.Jolivet at enseeiht.fr> writes:

> On Mon, 29 May 2017 04:38:39 -0600, Jed Brown wrote:
>> Pierre Jolivet <pierre.jolivet at enseeiht.fr> writes:
>>
>>>> On 29 May 2017, at 06:49, Jed Brown <jed at jedbrown.org> wrote:
>>>>
>>>> You can't get a callback from this "external Krylov solver"?
>>>
>>> You mean, a callback to let the external solver use the memory 
>>> allocated by PETSc for the Mats? Unfortunately, I need the underlying 
>>> memory to be contiguous between all Mats, and I don't think it is 
>>> possible with the current PETSc operators for matrix creation.
>>
>> You can allocate the full block, then pass portions of the
>> (column-aligned) array in MatCreateDense().
>
> So I was doing:
> MatCreate();
> MatSetSizes();
> MatSetType();
> MatMPIDenseSetPreallocation();
> MatAssemblyBegin();
> MatAssemblyEnd();
> MatMatMult();
>
> and what you are suggesting is:
> MatCreateDense(); // data != nullptr as provided by the external solver 
> so that there is no need for MatAssemblyBegin/MatAssemblyEnd 
> http://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/dense/mpi/mpidense.c.html#line1473 
> ?
> MatMatMult();

PetscErrorCode  MatCreateDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,PetscScalar *data,Mat *A)
{
  PetscErrorCode ierr;
  PetscMPIInt    size;

  PetscFunctionBegin;
  ierr = MatCreate(comm,A);CHKERRQ(ierr);
  ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr);
  ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
  if (size > 1) {
    ierr = MatSetType(*A,MATMPIDENSE);CHKERRQ(ierr);
    ierr = MatMPIDenseSetPreallocation(*A,data);CHKERRQ(ierr);
    if (data) {  /* user provided data array, so no need to assemble */
      ierr = MatSetUpMultiply_MPIDense(*A);CHKERRQ(ierr);
      (*A)->assembled = PETSC_TRUE;
    }
  } else {
    ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
    ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
  }
  PetscFunctionReturn(0);
}

> That makes perfect sense (assuming I'm not wrong about the 
> MatAssemblyBegin/MatAssemblyEnd). MatSetUpMultiply_MPIDense would still 
> be called at each iteration but I doubt this is too costly.

It creates a VecScatter so it isn't nothing (in terms of parallel
semantics), but I'd like to see profiling data before chasing this
around.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20170529/77302172/attachment.sig>


More information about the petsc-dev mailing list