Matrix Allocation
Barry Smith
bsmith at mcs.anl.gov
Mon Jun 30 15:26:49 CDT 2008
I found the cause, from MatAssemblyEnd_SeqAIJ()
ierr = MatMarkDiagonal_SeqAIJ(A);CHKERRQ(ierr);
ierr = PetscInfo4(A,"Matrix size: %D X %D; storage space: %D
unneeded,%D used\n",m,A->cmap.n,fshift,a->nz);CHKERRQ(ierr);
ierr = PetscInfo1(A,"Number of mallocs during MatSetValues() is %D
\n",a->reallocs);CHKERRQ(ierr);
ierr = PetscInfo1(A,"Maximum nonzeros in any row is %D
\n",rmax);CHKERRQ(ierr);
a->reallocs = 0;
A->info.nz_unneeded = (double)fshift;
a->rmax = rmax;
It prints the correct value and then sets the value to zero!
Presumably this is done to get an accurate count of new
reallocations if the user does a bunch more
MatSetValues(). But this is silly.
How to fix this? We could simply remove the zeroing and have this
count be cumulative over all the previous
MatSetValues/MatAssembly... calls. Or introduce two counters, a
cumulative and recent counter. I would suggest
going with the simple fix.
Barry
On Jun 30, 2008, at 3:15 PM, Andrew Colombi wrote:
>> 1) Could you be calling MatGetInfo() with the wrong matrix?
>
> Nice try, but I only have one matrix ;-) I call it A. We get along.
>
>> 2) Can you use -info to check the numbers?
>> 3) Can you try MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, 1)?
>
> Yes and yes. In fact, I even wrote a small test app just for this
> purpose which is revealing some interesting behavior. Results:
> Additional memory is being malloced; however, MatGetInfo does not
> appear to be reporting this. Here I've grepped the output for
> "malloc":
>
> $ rjq ./make -info | grep malloc
> [1] MatAssemblyBegin_MPIAIJ(): Stash has 0 entries, uses 0 mallocs.
> [1] MatAssemblyEnd_SeqAIJ(): Number of mallocs during MatSetValues()
> is 0
> [0] MatAssemblyBegin_MPIAIJ(): Stash has 0 entries, uses 0 mallocs.
> [0] MatAssemblyEnd_SeqAIJ(): Number of mallocs during MatSetValues()
> is 1
> [0] MatAssemblyEnd_SeqAIJ(): Number of mallocs during MatSetValues()
> is 0
> [1] MatAssemblyEnd_SeqAIJ(): Number of mallocs during MatSetValues()
> is 1
> [ 1] mallocs 0 memory 64
> [ 0] mallocs 0 memory 64
>
> The initial messages are from -info, and the last two are from my
> MatGetInfo snippet. Clearly two mallocs are happening that are not
> being reported. Maybe this is reason: those mallocs don't happen in
> MatAssembly_MPIAIJ? The reason for this is that each processor only
> computes the rows it's reponsible for.
>
> Thoughts?
> -Andrew
>
> On Mon, Jun 30, 2008 at 1:38 PM, Matthew Knepley <knepley at gmail.com>
> wrote:
>> 1) Could you be calling MatGetInfo() with the wrong matrix?
>>
>> 2) Can you use -info to check the numbers?
>>
>> 3) Can you try MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, 1)?
>>
>> Matt
>>
>> On Mon, Jun 30, 2008 at 12:25 PM, Andrew Colombi
>> <acolombi at gmail.com> wrote:
>>> I am a little confused by some behavior.
>>>
>>> I've been trying to understand some poor performance numbers and I
>>> noticed that if I doubled the preallocation numbers (presently I'm
>>> setting d_nz and o_nz to constants, no effort has been made to get
>>> the
>>> numbers _right_) performance improved dramatically (about 20X).
>>>
>>> This isn't so surprising except for the report from MatGetInfo.
>>> Even
>>> with the lower preallocation numbers I'm getting 0 in info.mallocs
>>> for
>>>
>>> MatInfo info;
>>> MatGetInfo(pc_A, MAT_LOCAL, &info); // done and reported on each
>>> machine individually
>>>
>>> So, my question is.... well.. why? If I'm seeing 0 mallocs before
>>> doubling prealloation shouldn't that mean I've preallocated enough?
>>> Or are their some switches I need to use to enable malloc counting?
>>> Also you can see (according to the same call to MetGetInfo) I'm
>>> wasting a lot of memory:
>>>
>>> // after doubling preallocation
>>> nz_alloc 6.2704e+07 nz_used 1.9125e+07 nz_unneed 4.3579e+07
>>>
>>> (these are print outs of info.nz_allocated, info.nz_used and
>>> info.nzunneeded).
>>>
>>> Any thoughts? For now memory is not a bottleneck, so I guess I'll
>>> be
>>> satisfied with guessing big numbers for d_nz and o_nz. Still, I
>>> spent
>>> a lot of time scratching my head since guessing higher numbers
>>> didn't
>>> seem likely to have an effect.
>>>
>>> Thanks,
>>> -Andrew
>> --
>> What most experimenters take for granted before they begin their
>> experiments is infinitely more interesting than any results to which
>> their experiments lead.
>> -- Norbert Wiener
>>
>>
>
More information about the petsc-users
mailing list