[ET Trac] [Einstein Toolkit] #2211: gh::regrid contains code whose runtime is quadratic in number of components

Einstein Toolkit trac-noreply at einsteintoolkit.org
Thu Dec 6 12:45:00 CST 2018


#2211: gh::regrid contains code whose runtime is quadratic in number of components
--------------------------+---------------------------------
  Reporter:  Roland Haas  |      Owner:  (none)
      Type:  defect       |     Status:  new
  Priority:  minor        |  Milestone:
 Component:  Carpet       |    Version:  development version
Resolution:               |   Keywords:
--------------------------+---------------------------------
Description changed by Roland Haas:

Old description:

> The member function gh::regrid contains this code
>
> {{{
>   // Check component consistency
> for (int ml = 0; ml < mglevels(); ++ml) {
>   for (int rl = 0; rl < reflevels(); ++rl) {
>     assert(components(rl) >= 0);
>     for (int c = 0; c < components(rl); ++c) {
>       ibbox const &b = extent(ml, rl, c);
>       ibbox const &b0 = extent(ml, rl, 0);
>       assert(all(b.stride() == b0.stride()));
>       assert(b.is_aligned_with(b0));
>       for (int cc = c + 1; cc < components(rl); ++cc) {
>         assert((b & extent(ml, rl, cc)).empty());
>       }
>     }
>   }
> }
> }}}
>
> which b/c of the {{{c}}} and {{cc}} loops is quadratic in the number of
> components (MPI ranks).
>
> For many (tens of thousands) components this becomes a dominant cost of
> the regrid operation.
>
> The Carpet branch {{{rhaas/quadratic_regrid_time}}} contains a test thorn
> ArrayTest and a hacked version of Carpet that can simulate a number of
> MPI ranks using just one rank.
>
> One can run:
> {{{
> mpirun -n 1 exe/cactus_sim arrangements/Carpet/ArrayTest/par/array.par
> }}}
> and control the number of pretend ranks by setting {{{ArrayTest::size}}}
> in array.par.
>
> On my workstation regrid takes ~3.5s for 16k ranks with the consistency
> check and ~0.5s without.
>
> This is per grid array and per grid scalar. So for a typical setup with
> ~400 grid arrays and grid scalars (no matter whether they have storage or
> not) this amounts to 400 * 3s = 1200s of time spent in the consistency
> check.
>
> This happens only once per simulation (since grid arrays and grid scalars
> are only regrid once) but for a test simulation can be quite significant
> (at scale).
>
> The branch actually arranges for the consistency check to be skipped if
> one defines {{{CARPET_OPTIMISE}}}.
>
> I attach a gnuplot script that takes carpet-timing-statistics.0000.txt
> and shows how much time is spent in dh and gh regrid.

New description:

 The member function gh::regrid contains this code

 {{{
   // Check component consistency
 for (int ml = 0; ml < mglevels(); ++ml) {
   for (int rl = 0; rl < reflevels(); ++rl) {
     assert(components(rl) >= 0);
     for (int c = 0; c < components(rl); ++c) {
       ibbox const &b = extent(ml, rl, c);
       ibbox const &b0 = extent(ml, rl, 0);
       assert(all(b.stride() == b0.stride()));
       assert(b.is_aligned_with(b0));
       for (int cc = c + 1; cc < components(rl); ++cc) {
         assert((b & extent(ml, rl, cc)).empty());
       }
     }
   }
 }
 }}}

 which b/c of the {{{c}}} and {{{cc}}} loops is quadratic in the number of
 components (MPI ranks).

 For many (tens of thousands) components this becomes a dominant cost of
 the regrid operation.

 The Carpet branch {{{rhaas/quadratic_regrid_time}}} contains a test thorn
 ArrayTest and a hacked version of Carpet that can simulate a number of MPI
 ranks using just one rank.

 One can run:
 {{{
 mpirun -n 1 exe/cactus_sim arrangements/Carpet/ArrayTest/par/array.par
 }}}
 and control the number of pretend ranks by setting {{{ArrayTest::size}}}
 in array.par.

 On my workstation regrid takes ~3.5s for 16k ranks with the consistency
 check and ~0.5s without.

 This is per grid array and per grid scalar. So for a typical setup with
 ~400 grid arrays and grid scalars (no matter whether they have storage or
 not) this amounts to 400 * 3s = 1200s of time spent in the consistency
 check.

 This happens only once per simulation (since grid arrays and grid scalars
 are only regrid once) but for a test simulation can be quite significant
 (at scale).

 The branch actually arranges for the consistency check to be skipped if
 one defines {{{CARPET_OPTIMISE}}}.

 I attach a gnuplot script that takes carpet-timing-statistics.0000.txt and
 shows how much time is spent in dh and gh regrid.

--

-- 
Ticket URL: <https://trac.einsteintoolkit.org/ticket/2211#comment:7>
Einstein Toolkit <http://einsteintoolkit.org>
The Einstein Toolkit


More information about the Trac mailing list