2 Questions about DAs

Matthew Knepley knepley at gmail.com
Mon May 12 15:15:45 CDT 2008


On Mon, May 12, 2008 at 3:01 PM, Milad Fatenejad <icksa1 at gmail.com> wrote:
> Hello:
>  I've attached the result of two calculations. The file "log-multi-da"
>  uses 1 DA for each vector (322 in all) and the file "log-single-da"
>  using 1 DA for the entire calculation. When using 322 DA's, about 10x
>  more time is spent in VecScatterBegin and VecScatterEnd. Both were
>  running using two processes
>
>  I should mention that the source code for these two runs was exactly
>  the same, I didn't reorder the scatters differently. The only
>  difference was the number of DAs
>
>  Any suggestions? Do you think this is related to the number of DA's,
>  or something else?

There are vastly different numbers of reductions and much bigger memory usage.
Please send the code and I will look at it.

  Matt

>  Thanks for your help
>  Milad
>
>  On Mon, May 12, 2008 at 1:56 PM, Matthew Knepley <knepley at gmail.com> wrote:
>  >
>  > On Mon, May 12, 2008 at 11:02 AM, Milad Fatenejad <mfatenejad at wisc.edu> wrote:
>  >  > Hello:
>  >  >  I have two separate DA questions:
>  >  >
>  >  >  1) I am writing a large finite difference code and would like to be
>  >  >  able to represent an array of vectors. I am currently doing this by
>  >  >  creating a single DA and calling DACreateGlobalVector several times,
>  >  >  but the manual also states that:
>  >  >
>  >  >  "PETSc currently provides no container for multiple arrays sharing the
>  >  >  same distributed array communication; note, however, that the dof
>  >  >  parameter handles many cases of interest."
>  >  >
>  >  >  I also found the following mailing list thread which describes how to
>  >  >  use the dof parameter to represent several vectors:
>  >  >
>  >  >
>  >  >  http://www-unix.mcs.anl.gov/web-mail-archive/lists/petsc-users/2008/02/msg00040.html
>  >  >
>  >  >  Where the following solution is proposed:
>  >  >  """
>  >  >  The easiest thing to do in C is to declare a struct:
>  >  >
>  >  >  typedef struct {
>  >  >   PetscScalar v[3];
>  >  >   PetscScalar p;
>  >  >  } Space;
>  >  >
>  >  >  and then cast pointers
>  >  >
>  >  >   Space ***array;
>  >  >
>  >  >   DAVecGetArray(da, u, (void *) &array);
>  >  >
>  >  >      array[k][j][i].v *= -1.0;
>  >  >  """
>  >  >
>  >  >  The problem with the proposed solution, is that they use a struct to
>  >  >  get the individual values, but what if you don't know the number of
>  >  >  degrees of freedom at compile time?
>  >
>  >  It would be nice to get variable structs in C. However, you can just deference
>  >  the object directly. For example, for 50 degrees of freedom, you can do
>  >
>  >    array[k][j][i][47] *= -1.0;
>  >
>  >
>  >  >  So my question is two fold:
>  >  >  a) Is there a problem with just having a single DA and calling
>  >  >  DACreateGlobalVector multiple times? Does this affect performance at
>  >  >  all (I have many different vectors)?
>  >
>  >  These are all independent objects. Thus, by itself, creating any number of
>  >  Vecs does nothing to performance (unless you start to run out of memory).
>  >
>  >
>  >  >  b) Is there a way to use the dof parameter when creating a DA when the
>  >  >  number of degrees of freedom is not known at compile time?
>  >  >  Specifically, I would like to be able to access the individual values
>  >  >  of the vector, just like the example shows...
>  >
>  >
>  > see above.
>  >
>  >  >  2) The code I am writing has a lot of different parts which present a
>  >  >  lot of opportunities to overlap communication an computation when
>  >  >  scattering vectors to update values in the ghost points. Right now,
>  >  >  all of my vectors (there are ~50 of them) share a single DA because
>  >  >  they all have the same shape. However, by sharing a single DA, I can
>  >  >  only scatter one vector at a time. It would be nice to be able to
>  >  >  start scattering each vector right after I'm done computing it, and
>  >  >  finish scattering it right before I need it again but I can't because
>  >  >  other vectors might need to be scattered in between. I then re-wrote
>  >  >  part of my code so that each vector had its own DA object, but this
>  >  >  ended up being incredibly slow (I assume this is because I have so
>  >  >  many vectors).
>  >
>  >  The problem here is that buffering will have to be done for each outstanding
>  >  scatter. Thus I see two resolutions:
>  >
>  >   1) Duplicate the DA scatter for as many Vecs as you wish to scatter at once.
>  >       This is essentially what you accomplish with separate DAs.
>  >
>  >   2) You the dof method. However, this scatter ALL the vectors every time.
>  >
>  >  I do not understand what performance problem you would have with multiple
>  >  DAs. With any performance questions, we suggest sending the output of
>  >  -log_summary so we have data to look at.
>  >
>  >   Matt
>  >
>  >
>  >
>  >  >  My question is, is there a way to scatter multiple vectors
>  >  >  simultaneously without affecting the performance of the code? Does it
>  >  >  make sense to do this?
>  >  >
>  >  >
>  >  >  I'd really appreciate any help...
>  >  >
>  >  >  Thanks
>  >  >  Milad Fatenejad
>  >  >
>  >  >
>  >
>  >
>  >
>  >  --
>  >  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
>  >
>  >
>



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