Skip to content

b_compare costs 1.3-1.65x more per comparison under the #139 carry on soil 16S; unexplained, and paid for many times over #142

Description

@cjfields

What

On NovaSeq soil 16S only, enabling the #139 shuffle carry
(DADA2RS_SHUFFLE_CARRY=1) makes the k-mer screen 2.2-2.4x slower on
byte-identical work, giving back roughly a third of the shuffle saving.

rebuilt carry delta
screen R1 495 ns/comp 1109 ns/comp +124%
screen R2 512 ns/comp 1231 ns/comp +140%
DP kernel R1 / R2 16361 / 15104 16588 / 15321 +1.4%

Comparison counts are identical in both arms (11,605,515,622 / 14,485,250,256),
as are screen-pass counts. Outputs are byte-identical. So this is the same work
running slower, not different work.

Cost: b_compare wall 706.8 -> 950.7 s (R1) and 749.8 -> 1096.7 s (R2), against
a shuffle saving of 764.9 / 869.2 s. Net still -32.0% / -28.8% of run_dada,
but without the give-back it would be roughly -47%.

Not a regression the change "causes"

ITS2 from the same instrument shows no screen effect at all (1856 -> 1820,
1669 -> 1697 ns/comp; -1.9% / +1.7%), across two reps. So this is 16S-specific.

Note the direction: 16S's screen runs at 495 ns/comp natively, against ITS2's
1669-1856. Even degraded, 16S's carry-arm screen (1109) is still faster than
ITS2's baseline. 16S is not being penalised so much as losing an unusually good
operating point. That framing is probably the way in.

Falsified - do not retry

  1. Cache residency of the carried map (compmax 29 MB + emax 10 MB, now
    permanently resident). Predicts the bandwidth-bound DP kernel suffers. The DP
    moved +1.4%; only the screen changed. Wrong selectivity.
  2. Peak parallel load. Both arms run ~57 of 64 threads during the parallel
    map (busy thread-seconds / map wall). Instantaneous load is identical.
  3. Sustained-clock throttling. Duty cycle does change a lot (occupancy
    12-16% -> 31-34% of 64 cores, since the carry deletes 765-869 s of
    single-threaded shuffle). But on the EPYC 7713 the whole range between light
    and all-core load is ~1.35x (base 2.0 GHz, boost 3.72, all-core ~2.7-3.0).
    It cannot arithmetically produce 2.2-2.4x. At most a third of the effect.
  4. Anything intrinsic to carrying the map - see the ITS2 control above.

Suggested next step

Not another whole-run A/B - those have now cost four wrong hypotheses. Isolate
the screen: a microbenchmark that streams the 16S k-mer vectors with and without
a ~39 MB scattered-access working set alive alongside, at matched thread counts.
If that does not reproduce it, the effect is not in the screen kernel and the
next place to look is allocator/page behaviour (the rebuilt arm allocates and
frees compmax/emax 9,700 times; the carry allocates once).

Also worth trying first because it is nearly free: rerun the 16S A/B at 24 and
48 threads. Every falsified hypothesis above is thread-count-sensitive in a
different way, so the shape of the curve discriminates between what is left.

Priority

Headroom, not correctness. #139 is byte-identical on 180 files and is a
large win with the give-back already priced in. This is about turning -30% into
~-47% on the largest pooled workload we have.

Data: tmp/new_shuffle/full-pooling-novaseq-16S-carry (16S, 1 rep both arms),
tmp/new_shuffle/full-pooling-novaseq-ITS-carry (ITS2 control, 2 reps).
See docs/findings/shuffle-build-scan.md Result 4.

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