I need you to optimize an FP8 GEMM for the RTX PRO 6000 (SM120 Blackwell, GDDR7, 1.8 TB/s). The reference implementation is in reference.py and your kernel goes in solution.py. You can make whatever mess you want in this directory — scratch files, intermediate kernels, build artifacts, profiling traces — but the final answer has to be in solution.py with the same Model, get_inputs, and get_init_inputs interface as reference.py.

The input is an fp8_e4m3 activation tensor (M, K) and an fp8_e4m3 weight (N, K), and you return y = x @ w.T as bf16 (M, N). Correctness tolerance on the bf16 output is 0.15 abs/rel — fp8 multiply has real noise so the bar is loose, but it has to match the reference within that. The shapes you have to handle are M=4096 N=4096 K=4096 (square aligned, the easy case), M=4096 N=4096 K=4127 (K not a multiple of 128, which forces predicated tails on tile-quantized kernels), M=32 N=8192 K=8192 (skinny M, decode-style), and M=4096 N=14336 K=4096 (Llama-3 up-proj).

This needs to be a real custom kernel. Don't reach for torch._scaled_mm or torch.ops.aten._scaled_mm — they're off-limits and using them fails correctness. Try CUDA C++ via torch.utils.cpp_extension.load_inline, inline PTX, or CUTLASS — whatever fits. Anything you're uncertain about, look up PTX docs, clone CUTLASS or other reference repos, read library headers, and investigate.

Your flywheel is implement, profile (ncu, nsys, torch.profiler — whatever's useful) and time it with benchmark.py, verify correctness by running `python check.py` and reading the output, then iterate. Don't substitute your own one-off correctness snippets for check.py — it iterates over every shape, your spot-check almost certainly won't. If `python check.py` hasn't printed PASS, you're not done. Take as long as you need to actually push the number up.