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
- 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.
- Peak parallel load. Both arms run ~57 of 64 threads during the parallel
map (busy thread-seconds / map wall). Instantaneous load is identical.
- 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.
- 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.
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 onbyte-identical work, giving back roughly a third of the shuffle saving.
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_comparewall 706.8 -> 950.7 s (R1) and 749.8 -> 1096.7 s (R2), againsta 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
compmax29 MB +emax10 MB, nowpermanently resident). Predicts the bandwidth-bound DP kernel suffers. The DP
moved +1.4%; only the screen changed. Wrong selectivity.
map (busy thread-seconds / map wall). Instantaneous load is identical.
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.
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/emax9,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.mdResult 4.