[petsc-dev] Dealing with off-processor aij-matrices not having preallocation information
Karl Rupp
rupp at mcs.anl.gov
Wed Mar 20 18:04:11 CDT 2013
Hi guys,
if a distributed aij-matrix is created and no preallocation hints are
given, the current behavior is to silently allow preallocation even if
the user requested to error out if not preallocated.
From MatMPIAIJSetPreallocation_MPIAIJ() in mpiaij.c:3285:
(slightly modified using style violations for better visual appearance)
if (d_nz == PETSC_DEFAULT || d_nz == PETSC_DECIDE) d_nz = 5;
if (o_nz == PETSC_DEFAULT || o_nz == PETSC_DECIDE) o_nz = 2;
/* Quite some more code here */
ierr = MatSeqAIJSetPreallocation(b->A,d_nz,d_nnz);CHKERRQ(ierr);
ierr = MatSeqAIJSetPreallocation(b->B,o_nz,o_nnz);CHKERRQ(ierr);
/* Do not error if the user did not give real preallocation
information. Ugly because this would overwrite a previous user call to
MatSetOption(). */
if (!d_realalloc)
MatSetOption(b->A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);
if (!o_realalloc)
MatSetOption(b->B,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);
As the comment noted, this is quite a hack and actually breaks the
current implementation for GPU matrices. I think that the problem can be
completely resolved by not checking for PETSC_DEFAULT and PETSC_DECIDE
in the MPI preallocation above, but just forward d_nz and o_nz to the
sequential preallocation routine. This way, the logic remains in
MatSeqAIJSetPreallocation(), where MAT_NEW_NONZERO_ALLOCATION_ERR is
only set if the user provided an explicit preallocation scheme.
Do I miss something?
Best regards,
Karli
More information about the petsc-dev
mailing list