| name | b200-kernel-roofline-triage |
| description | Use when the user asks "why is this B200/Blackwell kernel slow, what should I optimize first, should I fuse or move to Tensor Cores/TMA". Classifies the problem via arithmetic intensity, dataflow, and resource occupancy as memory-bandwidth-, compute-throughput-, latency/concurrency-, or scheduling-bound, and gives a minimal falsifiable experiment. Not for queries that only ask about hardware specs with no kernel/operator context. |
| source_book | Modern GPU Programming For MLSys (MLC Community) + NVIDIA Blackwell Tuning/Compatibility Guides |
| source_chapter | S3; S16 |
| tags | ["b200","roofline","performance","triage"] |
| related_skills | ["b200-gemm-optimization-ladder","b200-layout-contract-auditor","b200-tma-pipeline-designer","b200-warp-specialized-debugger"] |
| version | 0.1.0 |
B200 Kernel Roofline Triage
R — Source evidence (Reading, paraphrased)
- [S3] Split the kernel's ceiling into a "compute roof" and a "bandwidth roof", and use arithmetic intensity to decide which side is more likely the current constraint.
- [S3] For low-arithmetic-intensity operators, prioritize reducing bytes, fusion, reuse, or a narrower dtype; for high-arithmetic-intensity GEMMs, the focus is keeping the Tensor Cores continuously busy.
- [S16] Blackwell still inherits the general CUDA best practices: parallelize, reduce Host↔Device transfers, coalesce accesses, and reduce redundant accesses and warp divergence.
Source: distilled from "Modern GPU Programming for MLSys" (https://mlc.ai/modern-gpu-programming-for-mlsys/) and the NVIDIA Blackwell tuning/compatibility guides. Short paraphrases only; no long passages are reproduced.
I — Methodology skeleton (Interpretation)
Do not start optimizing from "this trick is new"; answer three questions first:
- How much useful compute is done per output element? Estimate the FLOPs.
- How many bytes were moved, from which level of storage, to do that compute? Give at least the HBM accounting; add L2/SMEM accountings when necessary.
- Does the current implementation actually convert the theoretical roof into hardware busyness? Even with high algorithmic arithmetic intensity, a wrong layout, serialized load/compute/store, resource pressure, or the launch shape can still leave the Tensor Cores idle.
The final diagnosis must not just say "memory-bound/compute-bound"; it must also give the evidence, the alternative explanations not yet ruled out, and the next minimal experiment.
A1 — Applications in the source (Past Application)
Case 1: a large GEMM that should be compute-bound yet measures low
- Problem: the matrices are large enough that by arithmetic intensity it should sit to the right of the ridge under the compute roof, yet Tensor Core utilization is low.
- How the methodology was used: after ruling out HBM bandwidth, check whether execution is still serialized as "load→compute→store" and whether TMA, software pipelining, or warp specialization is missing.
- Conclusion: the bottleneck is not "move a little less HBM traffic" but idle compute engines and insufficient pipeline overlap.
Case 2: elementwise operators such as RMSNorm/GELU
- Problem: adding more math optimizations barely changes performance.
- How the methodology was used: their FLOPs/byte is very low, so first check coalescing, the number of reads/writes, fusion opportunities, and the dtype.
- Conclusion: the goal is to approach the bandwidth roof, not to chase Tensor Core peak.
A2 — Trigger scenarios (Future Trigger) ★
In what situations will the user need this skill?
- "This kernel only hits xx TFLOPS on B200 — where do I look first?"
- "Should this operator be fused, or switched to TMA/Tensor Cores?"
- "Do a roofline diagnosis for me and give an ordered sequence of optimization experiments."
Language signals
- "This kernel only hits xx TFLOPS on B200 — where do I look first?"
- "Should this operator be fused, or switched to TMA/Tensor Cores?"
- "Do a roofline diagnosis for me and give an ordered sequence of optimization experiments."
Distinction from adjacent skills
Versus b200-gemm-optimization-ladder: this skill first determines the bottleneck and the optimization direction; the latter gives the step-by-step implementation route specifically for GEMM. Versus b200-layout-contract-auditor: this skill does global performance attribution; the latter audits addresses and hardware layout contracts in depth.
E — Executable steps (Execution)
Once the skill is activated, the agent must follow this procedure:
- Collect the minimal fact set
- The operator formula, shapes, dtypes, batch, and whether inputs/outputs are reused.
- The current implementation path (CUDA/Triton/TIRx/CUTLASS/framework op), the timing methodology, warmup, and whether communication is included.
- The B200 model/power limit/clocks, the compile target, and a profiler summary.
- Done criterion: you can write a one-line estimate of "useful FLOPs" and a one-line estimate of "HBM bytes".
- Compute at least one roofline accounting
AI_HBM = useful_FLOPs / HBM_bytes.
- Prefer the measured bandwidth on the user's machine and the same-dtype peak; without them, only order-of-magnitude inference is possible — label the assumptions explicitly.
- Done criterion: an initial memory-bound / compute-bound / near-ridge call.
- Check whether the implementation contradicts the initial call
- memory-bound: check repeated reads/writes, intermediate tensors spilled to HBM, uncoalesced accesses, an overly wide dtype, and insufficient request concurrency.
- compute-bound: check Tensor Core instructions, tile utilization, TMA/compute/store overlap, warp roles, tail tiles, and small shapes.
- Neither fits: check launch latency, synchronization, CPU submission, communication, power/frequency, and occupancy resource pressure.
- Build the evidence matrix
- For each candidate bottleneck write "supporting evidence / counter-evidence / measurement needed".
- Done criterion: at least 3 candidates listed, and they must not all be the same class of micro-optimization.
- Design the minimal falsifiable experiment
- Change only one factor at a time, e.g. disable fusion, switch to a contiguous layout, increase the pipeline depth, use a fixed shape, lock the clocks.
- Stopping rule: if the experiment result contradicts the hypothesis, go back to step 3; do not keep stacking the same class of optimization.
- Output the optimization order
- P0: correctness and timing credibility; P1: the roof-determined primary bottleneck; P2: secondary scheduling/resource issues; P3: fine-tuning.
Required outputs
- Conclusion: the current choice/diagnosis, never a vague "we may need to look at everything".
- Evidence or assumptions: which items come from user data and which are assumptions pending verification.
- Contract/table/timeline: the auditable intermediate artifacts corresponding to this skill.
- Minimal validation: a correctness test, a boundary test, and one falsifiable experiment.
- Risks and fallback: the alternative path when hardware, version, or resource requirements are not met.
B — Boundaries (Boundary) ★
Do not use when
- The user only asks about B200 memory capacity, price, or rack specs, with no operator or performance question.
- With no shape, dtype, timing, or dataflow information at all, do not assert a bottleneck outright.
Failure modes
- Treating the theoretical peak as a directly achievable promise.
- Looking only at occupancy while ignoring that explicit pipelining can already hide the latency; or conversely, looking only at pipelining while ignoring that resources prevent residency in the first place.
- Substituting a single profiler percentage for end-to-end evidence.
Limitations
- Roofline has limited explanatory power for irregular accesses, short kernels, dependency chains, and cross-GPU communication; latency and communication models must be added when necessary.
Related skills
- depends-on: none
- contrasts-with:
b200-gemm-optimization-ladder
- composes-with:
b200-layout-contract-auditor, b200-tma-pipeline-designer, b200-warp-specialized-debugger
Audit info
- Validation passed: V1 ✓ / V2 ✓ / V3 ✓
- Test definitions: 6 (3 should_trigger / 2 should_not_trigger / 1 edge_case)
- Hardware validation: not performed; must be verified on a target B200
- Distilled: 2026-06-25