A trustworthy counter has stable semantics, a validated collection path and repeatable correlation with traces. Unchecked overflow, aliasing or window bias turns data into noise.
The first action on a sudden drop is freezing the workload and runtime envelope. Only then do counter and trace deltas against the last known-good run mean anything.
Stable event semantics, a validated collection path, and repeatable agreement with independent traces. Counters that cannot be explained on a timeline are not evidence.
Freeze workload revision, firmware, clocks and thermal state, then diff counters and traces against the last known-good run. Changing knobs before alignment destroys the baseline.
Averages hide queueing and interference that high-percentile latency exposes. A design that passes on means can still fail every deadline.
Equal IPC can hide very different stall mixes and resource stress. IPC without a stall breakdown cannot distinguish a healthy core from a balanced bottleneck.
Primary and secondary bottlenecks separate through falsification. Relieve the suspected limiter in a model or experiment and watch global throughput, not local utilization.
Queues reveal the true cap through depth, service rate and backpressure timing together. Occupancy without service rate cannot distinguish a busy stage from a blocked one.
Bound symptom | Confirming evidence | Wrong fix |
|---|---|---|
Frontend stalls dominate | Fetch bandwidth and MPKI flat while decode starves | Wider issue width |
Backend stalls dominate | Full queues with slow service rate | Larger reorder buffer alone |
Memory stalls dominate | MPKI times penalty matches the CPI gap | Higher core frequency |
Constrain or relieve one candidate at a time and measure global impact. The primary limiter is the one whose relief moves end-to-end throughput, not the block with the highest local utilization.
Raise arithmetic intensity through locality and tiling, cut bytes through compression or layout, add usable bandwidth, or prefetch accurately. Wider issue width cannot feed a starved core.
Profile working set against capacity, check page allocation and sharing for false patterns, then consider partitioning or policy change. Blindly growing L3 repeats the capacity reflex.
Little law queue cover from stated parameters
formula: outstanding = throughput x latency
example: 2 instructions retired per cycle, 90-cycle average DRAM latency
result: 2 x 90 = 180 concurrent misses needed to hide the latencyRoofline bounds performance by the lower of peak compute and bandwidth times intensity. Using nameplate bandwidth or assumed intensity turns the model into decoration.
Amdahl bounds whole-program speedup by the unenhanced fraction. A large local win on a small fraction stays a small global win.
When it plugs peak nameplate bandwidth or assumed intensity instead of measured production behavior. A slide-level roofline with ideal inputs is not signoff proof.
Kernels move between bandwidth ceilings as locality changes across cache, SRAM and DRAM levels. One flat bandwidth number merges levels that behave differently.
Amdahl speedup from stated parameters
formula: S = 1 / ((1 - f) + f / k)
example: fraction enhanced f = 0.6, enhancement k = 3
result: 1 / (0.4 + 0.2) = 1 / 0.6 = 1.67 times whole-program speedupRoofline bound from stated parameters
formula: attainable = min(peak_compute, bandwidth x intensity)
example: peak = 2000 GFLOP/s, bandwidth = 800 GB/s, intensity = 2 FLOP per byte
result: min(2000, 800 x 2) = min(2000, 1600) = 1600 GFLOP/s, memory-boundThe model below checks the roofline minimum against hand calculation. It is an arithmetic check, not a hardware model.
module roofline_model (
input logic [31:0] peak,
input logic [31:0] bw,
input logic [31:0] intensity,
output logic [31:0] attainable
);
always_comb attainable = (bw * intensity < peak) ? (bw * intensity) : peak;
endmodule
module tb_roofline;
logic [31:0] peak;
logic [31:0] bw;
logic [31:0] intensity;
logic [31:0] attainable;
roofline_model dut (.*);
int bad = 0;
initial begin
peak = 2000; bw = 800; intensity = 2; #1;
if (attainable != 1600) bad++;
peak = 2000; bw = 800; intensity = 5; #1;
if (attainable != 2000) bad++;
if (bad == 0) $display("PASS: roofline gives 1600 and 2000 GFLOPS for the two hand cases");
else $display("FAIL: %0d checks wrong", bad);
$finish;
end
endmoduleA written record of expected gain, regression surface, rollout guardrails and rollback triggers before enabling the change. Lab scores alone are junior evidence.
Workload differences, thermal throttling, binning, PMU setup and trace alignment. Blaming RTL before the measurement chain is validated wastes the bring-up.