matrix memory allocation

Matthew Knepley knepley at gmail.com
Wed Mar 26 18:38:15 CDT 2008


On Wed, Mar 26, 2008 at 6:30 PM, Matt Funk <mafunk at nmsu.edu> wrote:
> Well,
>
>  it is of course possible that i am looking at this wrong.
>
>  as to your question what it would save:
>
>  - case 1) : allocating all local rows on the local process at one time:
>  in order to determine the information for the nonzero entries for the local on
>  and off diagonal matrices i have to iterate over my entire domain and do
>  logic for each node to determine whether my surrounding nodes (for the
>  Laplacian) are on the local processor or not and/or whether they are even in
>  the domain. Because i have to do the same thing again once i get to the point
>  where i insert values into the matrix this is really redundant, but necessary
>  to determine the space to allocate.
>  i would like to eliminate this.

This is what we do. If you measure it, you will find it is a
completely negligible
fraction of the runtime. I see this as premature (and unnecessary) optimization.
If I am wrong here, please send the numbers.

  Thanks,

     Matt

>  -case 2) : do not preallocate anything
>   very slow, and not really an option.
>
>  so, what it would gain me would be the best compromise between memory
>  allocation performance and logic overhead. I.e. the logic while iterating
>  through the domain layout it executed only once instead of twice.
>
>  I hope it makes sense...
>
>  but i guess it is not possible anyway. too bad ...
>
>  thanks though
>  mat
>
>
>
>
>
>
>  On Wednesday 26 March 2008 17:07, Matthew Knepley wrote:
>  > This is not possible with the current implementation. I am not sure why you
>  > would want to do it. It seems to me to save nothing. Do you have some sort
>  > of performance problem?
>  >
>  >   Matt
>  >
>  > On Wed, Mar 26, 2008 at 5:01 PM, Matt Funk <mafunk at nmsu.edu> wrote:
>  > > Maybe i should clarify a little more.
>  > >  I guess what i am looking for is something that lets me split up the
>  > > memory allocation within a given processor.
>  > >
>  > >  The example you guys often show (for example on MatCreateMPIAIJ manual
>  > > page) is where the local process owns 3 rows.
>  > >
>  > >  But consider for example if the local process owns 1000 rows. Right now
>  > > (as i can see it) i have two options. Do not allocate memory at all and
>  > > use MatSetValues and allocate memory per row. This is very slow as you
>  > > guys state on your manual pages.
>  > >  The other option is to allocate all 1000 rows at a time which means
>  > > extra overhead.
>  > >
>  > >  However, what i would like to be able to (as an example), make 2 calls
>  > > for an allocation of 200 rows and a second call for an allocation of the
>  > > remaining 800 rows.
>  > >
>  > >  I do not know if this is possible as i don't know whether all the local
>  > > stuff is stored in on continuous array?
>  > >
>  > >  Anyway, i hope this clarifies my question a little more.
>  > >
>  > >  thank
>  > >  mat
>  > >
>  > >  On Wednesday 26 March 2008 14:31, Matt Funk wrote:
>  > >  > Hi,
>  > >  >
>  > >  > in order to create a sparse MPIMatrix (with preallocated memory) it is
>  > >  > necessary to give it the number of nonzero entries per row for the
>  > >  > local and off-diagonal submatrix.
>  > >  >
>  > >  > The way i do things right now is that i need to allocate the entire
>  > >  > matrix. However, my domain is decomposed into boxes where one or more
>  > >  > boxes reside on the current processor.
>  > >  >
>  > >  > So, i was wondering if it is possible to allocate the matrix memory
>  > >  > per box. Right now what i do is this:
>  > >  > 1) iterate over the whole domain (every single box) and extract the
>  > >  > info i need from each box for memory allocation.
>  > >  > 2) call MatCreateMPIAIJ to create the matrix/allocate memory.
>  > >  > 3) iterate over the whole domain again to get the info to insert the
>  > >  > values into the matrix.
>  > >  >
>  > >  > Is it possible to instead do something like:
>  > >  > 1) get info for values and memory allocation needed per box
>  > >  > 2) allocate memory for x number of rows in global matrix and insert
>  > >  > values for them (via MatSetValues)
>  > >  > 3) start at 1) till every box in the domain is covered.
>  > >  >
>  > >  > The problem in 2) is that i can insert the values, but there is no
>  > >  > memory preallocated for it, so it would be slow. If i could allocate
>  > >  > it, i think it would solve my problem.
>  > >  >
>  > >  > I hope i am making sense. By the way, i cannot use the DA construct
>  > >  > because i have overlapping values.
>  > >  >
>  > >  > thanks
>  > >  > mat
>
>



-- 
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