Files

2.5 KiB
Raw Permalink Blame History

CORRECTION to PERF-PROFILE-7c6f6886.md §5 — run-ahead removes much less of the fill than §4 implied

§4 is right that an unbarriered verb skips the residual fill. It is wrong to treat MGPipeValidateForVerb's whole 18.03% as fill. The call tree under it (inproc, client thread, percentages relative to that subtree) says otherwise:

share of the subtree child skipped under run-ahead?
22.05% MGPipeTracker::Update no — the tracker walk runs regardless
20.48% MGPipeShaderBufferEmitter::EmitClass no — emitters PRODUCE records, which is the whole of what an unbarriered verb hands the server
19.76% MGPipeFillAccess::CopyField yes
~6.7% the sampler / vertex-input / program / framebuffer emitters no
remainder self, including the unconditional prologue partly

PipeFill.cpp:3226-3231 says this in words: "What still runs, unchanged, is the tracker walk and the emitters (steps 2 and 3): those PRODUCE RECORDS, which is the whole of what an unbarriered verb is allowed to hand the server." So only about a fifth of that 18.03% goes away, i.e. 3.6 – 4.5% of the client thread, not 18%.

The corrected prediction

now predicted after run-ahead
client GL thread 6.1 ms/frame ~3.9 ms/frame (the 31.8% wait, plus ~4% of fill)
apply thread 5.3 ms/frame ~2.0 ms/frame
bound by client client
implied fps ~164 ~250
monolith, same session 3.9 – 4.8 ms/frame 208 – 256 fps

The honest claim is PARITY, not past it. The split arm should land level with monolith, with the apply thread holding roughly 2 ms of headroom.

Going beyond parity is separate work, and §2 of the profile already names its targets: the emitters and the encode path, which is where the client's remaining ~3.9 ms lives. The wait is not one of them any more once run-ahead lands.

§5 of the profile note is left in place rather than edited, so the error is visible: it double-counted the tracker walk and the emitters as removable and produced ~3.0 ms / ~330 fps. This file supersedes it.

Why this matters beyond the number

The first estimate was built by subtracting whole inclusive percentages of a symbol whose name suggested it was all fill. That is the same class of error the previous phase recorded after attributing an idle poll's cost to backend lock contention: a percentage next to a plausible name is not an attribution. The call tree was three commands away and it changed the conclusion from "comfortably ahead" to "level". Take the tree.