Skip to content

Pooled run_dada is not uniform: occupancy climbs 22 -> 42 cores across a run, and the serial fraction is concentrated in the early rounds #152

Description

@cjfields

The per-window progress lines added in #150 show that pooled run_dada is not
a uniform workload
, and that every phase figure we have ranked levers against
is a mean over a run that spans nearly a factor of two in occupancy.

What the lines show

Soil ITS2 R1, 64 threads, 30-second windows (main, verbose):

window eff cores clusters added align map shuffle bud+pupd
0–30 s 24.4 +492 1.62% 12.6 s 9.1 s 6.6 s
30–60 s 28.7 +617 0.76% 15.1 s 8.2 s 3.7 s
60–90 s 29.0 +639 0.42% 15.4 s 8.5 s 3.1 s
90–120 s 29.1 +643 0.27% 15.4 s 8.8 s 2.7 s
120–150 s 37.9 +832 1.01% 20.2 s 4.0 s 1.7 s

Occupancy climbs from ~22 to ~42 effective cores of 64 over a single run. The
end-of-run mean (~29) describes no window of it.

It is the serial fraction, not the workload

align falls six-fold and then rises again while occupancy climbs straight
through, so the alignment pass rate is not driving this. Serial work per window
collapses from 15.7 s to 5.7 s — roughly 52% of the early windows against
19% of the late ones.

Normalising for progress makes it sharper. Serial time per cluster added:

  • early: 15.7 s / 492 = 31.9 ms/cluster
  • late: 5.7 s / 832 = 6.9 ms/cluster

A 4.6× drop, so this is not simply "more clusters get added later". The early
rounds genuinely do far more shuffle and p-update work per bud, presumably
because the partition is unstable and more raws move per round.

Why this matters beyond curiosity

  1. Our headline occupancy numbers are means over a bimodal run. "Effective
    cores 31.4 → 38.4" (perf(compare): hoist e_minmax into a dense array — store −71%, run_dada −20% (#147) #148) and "map parallel efficiency 86–90%" have both been
    used to rank levers. A change that helps the early serial-heavy phase and one
    that helps the late map-heavy phase are indistinguishable in the totals.
  2. The serial fraction is concentrated somewhere we have not looked. Every
    b_shuffle optimisation so far (Re-evaluate b_shuffle: its share grows with thread count, so #124's closure was conditional #132, Is b_shuffle's reconcile redundancy actually unreachable? Measure the necessary fraction #136, b_shuffle's build scan on high-diversity pools: ~38% of run_dada on a soil 16S set, and #87's own gate says it is winnable #139) was designed against
    whole-run totals. Whether they helped the early phase — where the serial
    fraction actually lives — is unmeasured.
  3. b_p_update has never been targeted at all. It is fully serial and runs
    18.2 s (R1) / 25.8 s (R2) of a 167 s / 211 s run_dada11–12% — and its
    cost is concentrated in exactly the windows where occupancy is worst.

Proposed first step: measure, do not design

Consistent with what #143 established the hard way — do not design an
optimisation against a share-of-wall figure before re-measuring what it is made
of:

Only then decide whether there is a lever. It is entirely possible the early
rounds are irreducibly serial and this closes as a documented property of the
algorithm — which would still be worth having written down.

Not to be assumed

A prediction made before looking was that occupancy should fall over the run,
because greedy skips increase as cluster centres get less abundant. That was
reasoning about the map, and the map is not where the answer is. Do not carry a
model of the bud loop into this without checking it against the lines.

Context: docs/findings/compare-store-scan.md ("The run is not uniform"), and
DADA2RS_PROGRESS_SECS (#150) for the instrument.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions