Performance report structure
Write a report that labels direct measurement, causal inference, model-based extrapolation, and unresolved assumptions
Before you begin
Follow a linked prerequisite when you cannot explain it from memory. Background skills without links are stated as abilities rather than hidden terminology.
- A completed investigation with raw samples and correctness results
- Ability to produce labeled plots or tables from saved data
A kernel experiment leaves thirty timing samples, two NVIDIA Nsight Compute reports, a numerical test table, five code revisions, and one rejected cache hypothesis. A reviewer who opens the final report needs to know the engineering decision before seeing those artifacts: the fused normalization path reduced p99 request latency by 4.1 milliseconds for declared prompt lengths while preserving the accepted model score. The report then has to show which evidence supports that statement and where the result does not apply.
A chronological diary would force the reviewer to reconstruct the claim from every false start. A one-line `1.3× faster` claim would hide the baseline, tensor shape, timing interval, and numerical contract. A causal performance report uses a different order: result and scope, workload contract, predicted mechanism, controlled observations, end-to-end effect, slower regions, and limitations.
The report links prose to inspectable evidence. Tables identify units and sample counts. Plots point to raw data and generation code. Profiler claims cite the saved report, selected counter, and tool version. Every sentence labels whether it reports a direct observation, an inference from several observations, a model-based extrapolation, or an unresolved assumption.
Organize the report around the technical decision. The opening states the objective, result, and supported scope. The next sections define the workload and correctness contract, explain the predicted mechanism, present controlled evidence, and show the end-to-end effect. A limitations section identifies inputs, systems, and scales that were not established.
Label measurements, inferences, extrapolations, and unresolved possibilities explicitly. Readers should not have to infer the status of a claim.
Write the result and scope first
The first paragraph should state the decision, intervention, result, and scope. For example: replacing a two-kernel RMSNorm sequence with one Triton kernel reduced median warmed layer time by 23% for BF16 rows of widths 4096–16384 on an H100, while preserving the declared FP32-reference tolerance. The compiled end-to-end block improved by 6%. The specialized path was slower below width 1024 and is not dispatched there.
The opening paragraph answers what changed and where the result matters. The opening does not explain the complete mechanism yet. Avoid terms such as utilization unless the specific resource and denominator are named. Avoid a single multiplier when the baseline, timing boundary, and shape are absent.
Follow with a short decision statement. State whether to adopt the path, retain it behind a dispatch predicate, reject it, or collect more evidence. The rest of the report should provide enough information to audit this recommendation.
Define workload, baseline, and correctness
List input shapes or their distribution, datatype, layouts, device, software versions, execution mode, concurrency, warm-up, timing method, and target metric. State what setup is excluded and why. For serving, include request distributions and latency constraints. For training, include global batch and parallel configuration.
Select the strongest relevant baseline. A naive educational implementation is useful for explaining a mechanism but cannot establish an improvement over current practice when a mature library is available. If different baselines answer different questions, show both and label them. Use identical semantic and timing boundaries.
Report correctness before performance. Include reference, tolerances, adversarial cases, gradient or quality checks, and unsupported inputs. MLPerf's rules separate performance from accuracy requirements and require system information for replication.
Separate observation, inference, and extrapolation
An observation states a result from a declared method: requested HBM traffic fell from 1.20 GB to 0.68 GB per iteration in the recorded profiler run. An inference connects observations to a cause: the traffic reduction and unchanged instruction path support the conclusion that intermediate removal explains most of the timing change. An extrapolation applies the result elsewhere: a similar benefit is expected on another bandwidth-limited GPU.
Use explicit labels when the distinction could be missed. State measured, calculated, inferred, simulated, or unverified. An inference needs converging evidence. Timing alone establishes correlation with the intervention. A byte model, traffic counters, a controlled unfused variant, and consistent shape scaling provide a stronger causal case.
Do not use counter names as explanations. A lower stall metric can result from several changes and can be affected by replay. Explain how the metric is defined, what competing hypotheses predict, and why the observed direction distinguishes them. Preserve the profiler configuration with the report.
Design figures and tables around questions
Every figure should answer a sentence stated in the text. A shape sweep shows the supported and losing regions. A roofline shows whether a measured point is consistent with a bandwidth or compute limit. An annotated timeline shows which critical-path interval changed. A memory-lifetime diagram shows which overlapping values set peak capacity.
Axes need quantity, unit, and scale. Legends need implementation and configuration. Captions should state the controlled conditions and the conclusion that the figure supports. Show raw points or distributions when aggregation could hide modes. A table can be clearer than a chart for a small number of exact values or eligibility boundaries.
Keep comparisons honest. Use the same axis range, workload, correctness target, and measurement boundary. If values were normalized, preserve absolute values in a table or artifact. If a figure omits outliers, state the rule and show their count. Visual polish does not compensate for an undefined denominator.
Present the counterfactual and alternative explanations
The counterfactual is the expected result without the intervention under the same conditions. The baseline usually represents the counterfactual. Controlled ablations improve the comparison by adding intermediate versions: remove fusion but retain the new tile, retain fusion but change pipeline depth, or disable weight packing while keeping dispatch fixed.
List plausible alternatives and the evidence against them. A kernel speedup attributed to lower traffic might actually come from different launch count, cache state, clocks, or numerical work. The report should show which factors were held constant and which remain unresolved. Rejected hypotheses can be summarized with their decisive test and linked to complete records.
Limitations define where the decision must be reconsidered. Include slower shapes, unsupported architectures, untested scale, compile cost, additional memory, numerical tradeoffs, and operational risks. State rollback or fallback behavior for a production change. Explicit limitations prevent future readers from applying a correct local result outside its evidence.
Attach a reproducibility package
Store the source revision, environment manifest, build instructions, benchmark and correctness commands, input generator, raw measurements, profiler reports, and plot script. Give each figure and table a producing command or data file. Include expected runtime and required hardware.
Test the package from a clean environment or ask a colleague to follow it without verbal guidance. Artifact-evaluation processes such as USENIX separate availability, functionality, and reproducibility because a downloadable archive is not automatically runnable and a runnable artifact does not automatically reproduce every claim.
When hardware or data cannot be shared, publish the smallest permitted reproducer, synthetic input generator, measured parameter table, and explicit access limitation. State which claims another person can verify and which claims depend on unavailable resources.
Reproducibility does not override privacy, security, or license requirements. Remove access tokens, credentials, private hostnames, customer prompts, proprietary model weights, and restricted datasets unless publication is explicitly authorized. Replace protected traces with a documented synthetic generator or aggregate distribution when possible. Record what was removed or transformed and explain which conclusions the substitution can no longer verify.
Worked example: Rewriting an unhelpful result
The original report says, ‘Our CUDA kernel is 3× faster and reaches 90% utilization.’
- Name the workload: shapes, dtype, hardware, baseline library, correctness tolerance, and whether timing is kernel or end to end.
- Replace the opening with the complete constrained result. For example: the kernel is 1.35× faster than the current library path at M=256, N=4096, K=4096 in BF16 on an H100, and the enclosing block improves by 4.8%.
- Replace utilization with the resource metric: achieved HBM bandwidth, tensor throughput, occupancy, or duty cycle, compared with an appropriate roof.
- Explain the mechanism: tiled reuse removed a quantified amount of global traffic, with profiler evidence and a predicted bound.
- Add an ablation that preserves the new thread-block shape but disables the data-reuse change. This distinguishes the claimed traffic mechanism from a general schedule change.
- Show the shape surface and enclosing workload effect. If the 3× exists only against a naive baseline and the library remains faster, say so.
- Attach raw timing samples, the correctness command, environment manifest, and the script that generates the shape-sweep table.
Conclusion: The revised report states a smaller but supported claim. The report gives readers enough evidence to reproduce the measurement, evaluate the mechanism, and decide whether the change applies to their workload.
Common errors
- Writing chronologically. The order of discovery is rarely the clearest order of explanation.
- Using precise numbers without units or uncertainty. Precision of typography is not precision of experiment.
- Hiding failed approaches to appear certain. Their evidence defines what the final mechanism is not.
- Using one profiler counter as proof of cause. Counter definitions, replay effects, and alternative explanations must be addressed.
- Publishing plots without raw data and generation commands. Future readers cannot inspect aggregation or regenerate the result.
Reference summary
A performance report begins with a constrained result such as: a fused BF16 normalization path reduced median layer time by 23% for rows of width 4,096 through 16,384 on the tested GPU, preserved the declared FP32-reference tolerance, and reduced the enclosing model block by 6%. Later sections define the workload, baseline, timing endpoints, predicted traffic reduction, profiler evidence, losing shapes, and limits.
- Opening: state the constrained objective, result, and supported scope.
- Mechanism: present the quantitative prediction before the observed counters.
- Evidence status: label raw observations, inferences, simulations, and unresolved questions.
- Limits: include slower regions, failed hypotheses, unsupported systems, and unmeasured scale.
- Archive: preserve commands, manifests, data, and source beside the narrative.
- Protection: remove credentials and protected data; document redaction, synthetic substitution, and license limits.
Knowledge check
Which byte calculation, traffic measurement, controlled ablation, timing distribution, and unchanged-workload evidence would support a claim that removed HBM traffic caused a kernel speedup?
Show the answer guide
- The prewritten byte model calculates the exact intermediate write and later read removed for the declared tensor shape and datatype, then predicts the transfer-time reduction using measured sustained HBM bandwidth.
- A separate profiler run must show the expected decrease in named DRAM or HBM read and write counters and confirm that the contender did not add comparable spill, conversion, or fallback traffic.
- A controlled ablation must restore or bypass the suspected traffic mechanism while keeping the mathematical operation, inputs, datatype, compilation state, and surrounding workload fixed. The measured time should move in the predicted direction.
- Ordinary unprofiled runs must preserve raw timing distributions, sample counts, warm-up, and identical timer boundaries. The change should exceed run-to-run variation and approximately agree with the bounded prediction.
- Reference tests and model-quality checks must confirm unchanged accepted work; manifests must confirm identical shapes, weights, software path outside the intervention, clock policy, and hardware state.
- The conclusion must label the byte reduction as measured evidence, the attribution as a tested inference, and cache behavior, launch removal, or resource changes as resolved or remaining alternatives.
Write a causal report for one tensor round trip
Use a completed fused-versus-unfused residual-normalization experiment for BF16 rows of one declared width, or reproduce the laboratory example if no result exists. Write a report that begins with the constrained result and then presents the byte prediction, ordinary timing distributions, profiler counters, output tests, ablation, and losing or unsupported shapes.
Evidence to keep: Keep the report plus its linked byte calculation, raw-data plot, profiler-report excerpt with metric names, ablation table, correctness output, environment manifest, and a final paragraph labeling observation, inference, and unresolved limits separately.
Capstones provide a bounded setting in which experimental method, cross-layer reasoning, and technical writing can be demonstrated together.
Sources and further reading
The lesson explanations synthesize primary papers and official references. Follow the originals for proofs, exact APIs, architecture details, and version-sensitive behavior.
- The Rust Programming Language↗
Structural inspiration: progressive chapters, concrete examples, and explicit learning flow.
- CUDA C++ Best Practices Guide↗
- Nsight Compute Profiling Guide↗
- MLPerf Inference Rules↗
- torch.compile Programming Model↗
- PagedAttention / vLLM↗