RTX 4060 (sm_89) on the reviewed tree, 2026-10-15¶
Verdict: every step exits 0 (run.txt): the preflight (18 of 18), T3 (every per-file run, t3/summary.txt), T3p
(6 passed), the three split-K envelope sweeps (their rows equal those of 2026-10-14) and a bench smoke.
- Hardware and software: the RTX 4060 host of
../../2026-10-14/rtx4060-host/README.md. Preflight 18 of 18 PASS
(
preflight.out,preflight.json): driver 570.211.01, Python 3.12.2, torch 2.7.1+cu128, cuBLASLt 12.8.3.14, the 32 packages of the reference lock, fatbins equal to the manifest's sha256. It ran that directory'spreflight_4060.pywith the expected commit set to 49f1ecf. - Code under test: the tree of 49f1ecf (
git archive), the fixes of the review of the release candidate (2026-10-14). Kernel sources and fatbins are those of the freeze (git diff e173ecc 49f1ecftouches no.cu,.cuhormmaemu/backends/cuda/bin/file); the Python undermmaemu/changed in 8 files since da9edd4. - Script:
rerun_4060.sh. Every GPU step ran under the GPU lock, with the ground truth and the audit data present.
T3 (t3/)¶
The same counts as on da9edd4 (../../2026-10-14/t3-rtx-4060-sm89/README.md),
file by file, except test_live_cublas: 2 passed, against 1, because 49f1ecf adds
test_live_out_and_operand_layouts (it is also a T3p test, below). Its 8 warnings are the warning mmaemu gives for an
out= without unit stride, which the test passes on purpose.
T3p (t3p_profile_device.log, 6 passed)¶
The four tests of 2026-10-14 and two that 49f1ecf adds:
test_live_parity: 278 livetorch._scaled_mmcalls equal tommaemu.scaled_mmwith its reference backend (on the same GPU), bit for bit.test_live_out_and_operand_layouts(new): 112 live calls equal to mmaemu's reference backend, bit for bit, with column-major and paddedout=, anout=without unit stride (torch and mmaemu leave it unchanged), a mat1 that torch copies (expand, step 2), and zero sizes with any out dtype or any float8 input dtype.test_matches_the_reference_gpu_live: the three RTX 4060 profiles match this device.test_live_requery_of_500_random_rows: 500 rows of the shipped split-K table re-queried from cuBLASLt, 0 differ.test_live_query_step_resolves_unknown_shapes: a shape not in the table is resolved by a live query.test_live_heuristic_never_splits_where_the_envelope_infers_s1(new): 11,760 live heuristic queries above the bound where mmaemu infers S = 1 (MN 2 to 4 times the largest split MN of each of the 56 settings, K from 1,024 to 4,194,304); every one is S = 1.
Split-K envelope sweeps (sweeps/)¶
The three scripts of ../../2026-10-14/splitk-envelope/, unchanged,
importing the 49f1ecf tree. Their per-query rows (not kept) equal those of 2026-10-14 row for row: 306,859 rows from
sweep_env.py (181,440 above the envelope, 125,419 below the smallest split K), 663,936 and 666,624. Recomputed from
them, the counts of that directory's summary.json show 0 differences. Run times: 19.6 s, 40.7 s and 40.1 s.
Bench smoke (bench-smoke-1b-*.json, .log)¶
tools/bench_kernels.py --kernels v1,v4,v9,tc3 --shape 1b --M 2048, with Gaussian (gauss40) and adversarial data.
Every kernel ran from the release fatbins, with the image sha256 of the T6 run.
| Kernel | gauss40 TMAC/s | adversarial TMAC/s | T6 at M = 2048 (docs/performance.md) | Exactness |
|---|---|---|---|---|
| tc3 | 2.94 | 2.96 | 2.941 | 0 of 11,796,480 outputs differ from v1 |
| v9 | 1.54 | 1.54 | 1.535 | 0 of 11,796,480 differ from v1 |
| v4 | 1.35 | 1.34 | 1.340 | 0 of 11,796,480 differ from v1 |
| v1 | 0.63 | 0.63 | 0.630 | 0 of 16,384 (its first 64 rows x 256 columns) differ from the CPU reference |
Not repeated¶
T6 (performance), the full accumulators of every kernel (MMAEMU_DI_FULL) and the GPU tier of T4 ran on da9edd4
(2026-10-14). Their kernels and fatbins are the ones tested here. The Python changes of 49f1ecf are in the API, the
split-K resolution, the device lookup of the backend registry, the CLI, the preset checks and messages; T3 and T3p
above ran on them.