KernelBench hard · RTX PRO 6000

FP8 GEMM Kimi K3 (1M)

35.3%geomean peak fraction across shapes

manually audited: clean

Clean cell. The submission implements the real scaled FP8 e4m3 GEMM with custom CUDA and inline PTX: it reads the live FP8 x and weight tensors, accumulates x @ weight.T with e4m3 tensor-core MMA (or a full-K generic fallback), applies the live per-output-channel weight scale, and emits a fresh bf16 result. The odd-K path reuses allocation buffers but overwrites them from the current x and weight on every call before GEMM, so it cannot return stale data. There is no output cache, CUDA graph, pointer/identity dispatch, constant answer, forbidden scaled-mm call, cross-run solution read, grader mutation, tolerance change, or numeric-stress bypass. The unmodified official checker passed all nominal and stress cases, and the four logged shape fractions have geomean 0.3529.

harnesskinetic-claudeagent session6h 29mtotal wall6h 45mcheck35sbenchmark3moutput tokens277,885cost$280.76gpu-lock wait2h 18mgpu-lock held37mregimecompute

Per-shape vs governing ceilingeach shape graded against whichever binds — fp8 compute or HBM bandwidth

4096×4096×40960.225 ms61.0%610 TFLOPS · 61% of 1,000 TF fp8 peak · also 0.30 TB/s (17% of HBM)
4096×4096×41270.276 ms50.1%501 TFLOPS · 50% of 1,000 TF fp8 peak · also 0.24 TB/s (14% of HBM)
32×8192×81920.056 ms7.7%1.22 TB/s · 68% of 1.8 TB/s HBM · also 77 TFLOPS (8% of compute)
4096×14336×40960.729 ms66.0%660 TFLOPS · 66% of 1,000 TF fp8 peak · also 0.26 TB/s (15% of HBM)

compute-bound memory-bound · bar + right column = official fraction of the ceiling (the geomean input)

geomean(61.0% · 50.1% · 7.7% · 66.0%) = 35.3%

Kernel source (redacted)
"""FP8 e4m3 GEMM for RTX PRO 6000 (SM120) — custom mma.sync.m16n8k32 kernels.

y = (x @ w.T) * weight_scale as bf16. x, w: fp8_e4m3 (M,K), (N,K); weight_scale (N,) fp32.

Kernel paths:
  - Aligned (M%128==0, N%256==0, K%64==0): multistage cp.async + ldmatrix mma kernel
    (128x256x64 tile, 8 warps, 4-stage pipeline, smem-swizzle, fused scale epilogue).
  - Odd K: vectorized funnel-shift pad of x and w to K%64, then the main kernel.
    (fp8 rows at odd byte offsets break 16B cp.async per-row alignment; padding is
    mandatory. Pads are recomputed every call - no caching tricks.)
  - M==32 skinny decode shape: BK=512 deep-prefetch mma kernel, direct scaled bf16
    output (memory-bound; streams W once at DRAM speed).
  - Fully generic fallback for weird shapes: naive upcast GEMM (correctness net).
"""
import torch
import torch.nn as nn

OP_TYPE = "gemm"
SUPPORTED_PRECISIONS = ["fp8_e4m3"]

_cuda_src = r"""
#include <torch/extension.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cuda_bf16.h>
#include <ATen/cuda/CUDAContext.h>
#include <cstdint>

// ---------------- smem layout helpers ----------------
__device__ __forceinline__ int sw_off(int r, int c) {
  int atom = r >> 3;
  int rr = r & 7;
  int phys = c ^ (rr & 3) ^ ((rr >> 2) & 1);
  return atom * 512 + rr * 64 + phys * 16;
}
__device__ __forceinline__ int lay_off(int r, int c, int rows) {
  int j = c >> 3, cc = c & 7;
  return (j * rows + r) * 128 + ((cc ^ (r & 7)) * 16);
}
template <int ROWS, int BK>
__device__ __forceinline__ int tile_off(int r, int c) {
  if constexpr (BK == 64) return sw_off(r, c);
  else return lay_off(r, c, ROWS);
}

// ---------------- main GEMM kernel ----------------
template <int BM, int BN, int BK, int STAGES, int WARPS_M, int WARPS_N>
__global__ __launch_bounds__(WARPS_M* WARPS_N * 32, 1) void __kernel_fp8_gemm(
    const uint8_t* __restrict__ A, const uint8_t* __restrict__ B,
    const float* __restrict__ scale, __nv_bfloat16* __restrict__ C,
    int M, int N, int K, int grid_m, int grid_n, int KT, int group_m) {
  constexpr int THREADS = WARPS_M * WARPS_N * 32;
  constexpr int WM = BM / WARPS_M;
  constexpr int WN = BN / WARPS_N;
  constexpr int MI = WM / 16, NJ = WN / 8;
  constexpr int CPR = BK / 16;
  constexpr int KSS = BK / 32;
  constexpr int STAGE_A = BM * BK;
  constexpr int STAGE_B = BN * BK;

  extern __shared__ __align__(1024) uint8_t smem_raw[];
  uint8_t* sA = smem_raw;
  uint8_t* sB = smem_raw + STAGES * STAGE_A;
  float* sScale = reinterpret_cast<float*>(smem_raw + STAGES * (STAGE_A + STAGE_B));

  const int tid = threadIdx.x;
  const int lane = tid & 31;
  const int warp = tid >> 5;
  const int warp_m = warp / WARPS_N;
  const int warp_n = warp % WARPS_N;

  int bid = blockIdx.x;
  int width = group_m * grid_n;
  int group_id = bid / width;
  int group_size = min(grid_m - group_id * group_m, group_m);
  int pid_m = group_id * group_m + (bid % group_size);
  int pid_n = (bid % width) / group_size;

  const int m0 = pid_m * BM;
  const int n0 = pid_n * BN;
  const uint8_t* Aptr = A + (size_t)m0 * K;
  const uint8_t* Bptr = B + (size_t)n0 * K;

  uint32_t sA_base = static_cast<uint32_t>(__cvta_generic_to_shared(sA));
  uint32_t sB_base = static_cast<uint32_t>(__cvta_generic_to_shared(sB));
  uint32_t sScale_base = static_cast<uint32_t>(__cvta_generic_to_shared(sScale));

  constexpr int CH_A = STAGE_A / 16, CH_B = STAGE_B / 16;
  constexpr int RP = THREADS / CPR;
  const int ca_r = tid / CPR, ca_c = tid % CPR;

  auto issue_stage = [&](int t, int stage) {
    const int kb = t * BK;
    uint32_t sa = sA_base + stage * STAGE_A;
    uint32_t sb = sB_base + stage * STAGE_B;
#pragma unroll
    for (int i = 0; i < (CH_A + THREADS - 1) / THREADS; ++i) {
      int idx = i * THREADS + tid;
      if (CH_A % THREADS == 0 || idx < CH_A) {
        int r = ca_r + i * RP;
        const uint8_t* g = Aptr + (size_t)r * K + kb + ca_c * 16;
        asm volatile("cp.async.cg.shared.global [%0], [%1], 16;\n" [REDACTED: IP]"r"(sa + tile_off<BM, BK>(r, ca_c)), "l"(g));
      }
    }
#pragma unroll
    for (int i = 0; i < (CH_B + THREADS - 1) / THREADS; ++i) {
      int idx = i * THREADS + tid;
      if (CH_B % THREADS == 0 || idx < CH_B) {
        int r = ca_r + i * RP;
        const uint8_t* g = Bptr + (size_t)r * K + kb + ca_c * 16;
        asm volatile("cp.async.cg.shared.global [%0], [%1], 16;\n" [REDACTED: IP]"r"(sb + tile_off<BN, BK>(r, ca_c)), "l"(g));
      }
    }
    asm volatile("cp.async.commit_group;\n");
  };

  {
    constexpr int SC_CH = BN / 4;
    if (tid < SC_CH) {
      const float* g = scale + n0 + tid * 4;
      asm volatile("cp.async.cg.shared.global [%0], [%1], 16;\n" [REDACTED: IP]"r"(sScale_base + tid * 16), "l"(g));
    }
  }

#pragma unroll
  for (int s = 0; s < STAGES - 1; ++s) {
    if (s < KT) issue_stage(s, s % STAGES);
    else asm volatile("cp.async.commit_group;\n");
  }

  const int ld_row8 = lane & 7;
  const int ld_row_a = warp_m * WM + ld_row8 + ((lane >> 3) & 1) * 8;
  const int ld_row_b = warp_n * WN + ld_row8 + ((lane >> 4) & 1) * 8;
  const int ld_ch_hi_a = lane >> 4;
  const int ld_ch_hi_b = (lane >> 3) & 1;

  float acc[MI][NJ][4];
#pragma unroll
  for (int i = 0; i < MI; ++i)
#pragma unroll
    for (int j = 0; j < NJ; ++j)
#pragma unroll
      for (int q = 0; q < 4; ++q) acc[i][j][q] = 0.f;

  uint32_t ra[2][MI][4];
  uint32_t rb[2][NJ / 2][4];

  auto load_frags = [&](int t, int ks, int buf) {
    const int stage = t % STAGES;
    const uint32_t sa = sA_base + stage * STAGE_A;
    const uint32_t sb = sB_base + stage * STAGE_B;
    const int c0a = ks * 2 + ld_ch_hi_a;
    const int c0b = ks * 2 + ld_ch_hi_b;
#pragma unroll
    for (int mi = 0; mi < MI; ++mi) {
      uint32_t addr = sa + tile_off<BM, BK>(ld_row_a + mi * 16, c0a);
      asm volatile("ldmatrix.sync.aligned.m8n8.x4.shared.b16 {%0,%1,%2,%3}, [%4];\n"
                   : "=r"(ra[buf][mi][0]), "=r"(ra[buf][mi][1]), "=r"(ra[buf][mi][2]), "=r"(ra[buf][mi][3])
                   : "r"(addr));
    }
#pragma unroll
    for (int ni = 0; ni < NJ / 2; ++ni) {
      uint32_t addr = sb + tile_off<BN, BK>(ld_row_b + ni * 16, c0b);
      asm volatile("ldmatrix.sync.aligned.m8n8.x4.shared.b16 {%0,%1,%2,%3}, [%4];\n"
                   : "=r"(rb[buf][ni][0]), "=r"(rb[buf][ni][1]), "=r"(rb[buf][ni][2]), "=r"(rb[buf][ni][3])
                   : "r"(addr));
    }
  };

  auto do_mma = [&](int buf) {
#pragma unroll
    for (int mi = 0; mi < MI; ++mi) {
#pragma unroll
      for (int nj = 0; nj < NJ; ++nj) {
        const uint32_t* bb = rb[buf][nj >> 1];
        asm volatile(
            "mma.sync.aligned.m16n8k32.row.col.f32.e4m3.e4m3.f32 "
            "{%0,%1,%2,%3}, {%4,%5,%6,%7}, {%8,%9}, {%0,%1,%2,%3};\n"
            : "+f"(acc[mi][nj][0]), "+f"(acc[mi][nj][1]), "+f"(acc[mi][nj][2]), "+f"(acc[mi][nj][3])
            : "r"(ra[buf][mi][0]), "r"(ra[buf][mi][1]), "r"(ra[buf][mi][2]), "r"(ra[buf][mi][3]),
              "r"(bb[(nj & 1) * 2]), "r"(bb[(nj & 1) * 2 + 1]));
      }
    }
  };

  asm volatile("cp.async.wait_group %0;\n" [REDACTED: IP]"n"(STAGES - 2));
  __syncthreads();
  load_frags(0, 0, 0);

  for (int kt = 0; kt < KT; ++kt) {
#pragma unroll
    for (int ks = 0; ks < KSS; ++ks) {
      if (ks + 1 < KSS) load_frags(kt, ks + 1, (ks + 1) & 1);
      else {
        if (kt + STAGES - 1 < KT) issue_stage(kt + STAGES - 1, (kt + STAGES - 1) % STAGES);
        else asm volatile("cp.async.commit_group;\n");
      }
      do_mma(ks & 1);
      if (ks == KSS - 1 && kt + 1 < KT) {
        asm volatile("cp.async.wait_group %0;\n" [REDACTED: IP]"n"(STAGES - 2));
        __syncthreads();
        load_frags(kt + 1, 0, 0);
      }
    }
  }

  asm volatile("cp.async.wait_group 0;\n");
  __syncthreads();

  // ---- epilogue: acc*scale -> bf16 -> smem staging -> 16B coalesced stores
  uint32_t sC_base = static_cast<uint32_t>(__cvta_generic_to_shared(smem_raw));
  const float* sc = sScale;
  const int q_row = lane >> 2;
  const int q_col = lane & 3;
#pragma unroll
  for (int mi = 0; mi < MI; ++mi) {
#pragma unroll
    for (int nj = 0; nj < NJ; ++nj) {
      const int r = warp_m * WM + mi * 16 + q_row;
      const int cu = warp_n * (WN / 2) + nj * 4 + q_col;
      float s0 = sc[warp_n * WN + nj * 8 + q_col * 2];
      float s1 = sc[warp_n * WN + nj * 8 + q_col * 2 + 1];
      __nv_bfloat162 lo = __floats2bfloat162_rn(acc[mi][nj][0] * s0, acc[mi][nj][1] * s1);
      __nv_bfloat162 hi = __floats2bfloat162_rn(acc[mi][nj][2] * s0, acc[mi][nj][3] * s1);
      int x = (r & 7) << 2;
      constexpr int CUW = BN / 2;
      asm volatile("st.shared.b32 [%0], %1;\n" [REDACTED: IP]"r"(sC_base + (r * CUW + (cu ^ x)) * 4), "r"(reinterpret_cast<const uint32_t&>(lo)));
      asm volatile("st.shared.b32 [%0], %1;\n" [REDACTED: IP]"r"(sC_base + (((r + 8) * CUW) + (cu ^ x)) * 4), "r"(reinterpret_cast<const uint32_t&>(hi)));
    }
  }
  __syncthreads();
  constexpr int CHUNKS = (BM * BN * 2) / 16;
  constexpr int C16 = BN / 8;
#pragma unroll
  for (int i = 0; i < (CHUNKS + THREADS - 1) / THREADS; ++i) {
    int idx = tid + i * THREADS;
    if (CHUNKS % THREADS == 0 || idx < CHUNKS) {
      int r = idx / C16;
      int c16 = idx % C16;
      int x = (r & 7) << 2;
      uint32_t addr = sC_base + (r * (BN / 2) + ((c16 * 4) ^ x)) * 4;
      uint4 v;
      asm volatile("ld.shared.v4.b32 {%0,%1,%2,%3}, [%4];\n" : "=r"(v.x), "=r"(v.y), "=r"(v.z), "=r"(v.w) : "r"(addr));
      *reinterpret_cast<uint4*>(C + (size_t)(m0 + r) * N + n0 + c16 * 8) = v;
    }
  }
}

// ---------------- skinny (M=32) kernel ----------------
template <int BN, int BK, int STAGES, int WARPS_N, int SK>
__global__ __launch_bounds__(WARPS_N * 64, 1) void __kernel_fp8_gemm_skinny(
    const uint8_t* __restrict__ A, const uint8_t* __restrict__ B,
    float* __restrict__ P, const float* __restrict__ scale, __nv_bfloat16* __restrict__ Y,
    int M, int N, int K, int KT_per) {
  constexpr int BM = 32;
  constexpr int THREADS = WARPS_N * 64;
  constexpr int WN = BN / WARPS_N;
  constexpr int NJ = WN / 8;
  constexpr int CPR = BK / 16;
  constexpr int KSS = BK / 32;
  constexpr int STAGE_A = BM * BK, STAGE_B = BN * BK;

  extern __shared__ __align__(1024) uint8_t smem_raw[];
  uint8_t* sA = smem_raw;
  uint8_t* sB = smem_raw + STAGES * STAGE_A;

  const int tid = threadIdx.x;
  const int lane = tid & 31;
  const int warp = tid >> 5;
  const int warp_m = warp / WARPS_N;
  const int warp_n = warp % WARPS_N;

  const int n0 = blockIdx.x * BN;
  const int zid = blockIdx.y;
  const int k_begin = zid * KT_per * BK;

  uint32_t sA_base = static_cast<uint32_t>(__cvta_generic_to_shared(sA));
  uint32_t sB_base = static_cast<uint32_t>(__cvta_generic_to_shared(sB));

  constexpr int CH_A = STAGE_A / 16, CH_B = STAGE_B / 16;
  const int ca_r = tid / CPR, ca_c = tid % CPR;
  constexpr int RP_A = THREADS / CPR;

  auto issue_stage = [&](int t, int stage) {
    const long long kb = k_begin + (long long)t * BK;
    uint32_t sa = sA_base + stage * STAGE_A;
    uint32_t sb = sB_base + stage * STAGE_B;
#pragma unroll
    for (int i = 0; i < (CH_A + THREADS - 1) / THREADS; ++i) {
      int idx = i * THREADS + tid;
      if (idx < CH_A) {
        int r = ca_r + i * RP_A;
        const uint8_t* g = A + (long long)r * K + kb + ca_c * 16;
        asm volatile("cp.async.cg.shared.global [%0], [%1], 16;\n" [REDACTED: IP]"r"(sa + lay_off(r, ca_c, BM)), "l"(g));
      }
    }
#pragma unroll
    for (int i = 0; i < (CH_B + THREADS - 1) / THREADS; ++i) {
      int idx = i * THREADS + tid;
      if (idx < CH_B) {
        int r = ca_r + i * RP_A;
        const uint8_t* g = B + ((long long)n0 + r) * K + kb + ca_c * 16;
        asm volatile("cp.async.cg.shared.global [%0], [%1], 16;\n" [REDACTED: IP]"r"(sb + lay_off(r, ca_c, BN)), "l"(g));
      }
    }
    asm volatile("cp.async.commit_group;\n");
  };

#pragma unroll
  for (int s = 0; s < STAGES - 1; ++s) {
    if (s < KT_per) issue_stage(s, s % STAGES);
    else asm volatile("cp.async.commit_group;\n");
  }

  const int ld_row8 = lane & 7;
  const int ld_row_a = warp_m * 16 + ld_row8 + ((lane >> 3) & 1) * 8;
  const int ld_row_b = warp_n * WN + ld_row8 + ((lane >> 4) & 1) * 8;
  const int ld_ch_hi_a = lane >> 4;
  const int ld_ch_hi_b = (lane >> 3) & 1;

  float acc[NJ][4];
#pragma unroll
  for (int j = 0; j < NJ; ++j)
#pragma unroll
    for (int q = 0; q < 4; ++q) acc[j][q] = 0.f;

  uint32_t ra[2][4];
  uint32_t rb[2][NJ / 2][4];

  auto load_frags = [&](int t, int ks, int buf) {
    const int stage = t % STAGES;
    const uint32_t sa = sA_base + stage * STAGE_A;
    const uint32_t sb = sB_base + stage * STAGE_B;
    const int c0a = ks * 2 + ld_ch_hi_a;
    const int c0b = ks * 2 + ld_ch_hi_b;
    {
      uint32_t addr = sa + lay_off(ld_row_a, c0a, BM);
      asm volatile("ldmatrix.sync.aligned.m8n8.x4.shared.b16 {%0,%1,%2,%3}, [%4];\n"
                   : "=r"(ra[buf][0]), "=r"(ra[buf][1]), "=r"(ra[buf][2]), "=r"(ra[buf][3])
                   : "r"(addr));
    }
#pragma unroll
    for (int ni = 0; ni < NJ / 2; ++ni) {
      uint32_t addr = sb + lay_off(ld_row_b + ni * 16, c0b, BN);
      asm volatile("ldmatrix.sync.aligned.m8n8.x4.shared.b16 {%0,%1,%2,%3}, [%4];\n"
                   : "=r"(rb[buf][ni][0]), "=r"(rb[buf][ni][1]), "=r"(rb[buf][ni][2]), "=r"(rb[buf][ni][3])
                   : "r"(addr));
    }
  };

  auto do_mma = [&](int buf) {
#pragma unroll
    for (int nj = 0; nj < NJ; ++nj) {
      const uint32_t* bb = rb[buf][nj >> 1];
      asm volatile(
          "mma.sync.aligned.m16n8k32.row.col.f32.e4m3.e4m3.f32 "
          "{%0,%1,%2,%3}, {%4,%5,%6,%7}, {%8,%9}, {%0,%1,%2,%3};\n"
          : "+f"(acc[nj][0]), "+f"(acc[nj][1]), "+f"(acc[nj][2]), "+f"(acc[nj][3])
          : "r"(ra[buf][0]), "r"(ra[buf][1]), "r"(ra[buf][2]), "r"(ra[buf][3]),
            "r"(bb[(nj & 1) * 2]), "r"(bb[(nj & 1) * 2 + 1]));
    }
  };

  asm volatile("cp.async.wait_group %0;\n" [REDACTED: IP]"n"(STAGES - 2));
  __syncthreads();
  load_frags(0, 0, 0);

  for (int t = 0; t < KT_per; ++t) {
#pragma unroll
    for (int ks = 0; ks < KSS; ++ks) {
      if (ks + 1 < KSS) load_frags(t, ks + 1, (ks + 1) & 1);
      else {
        if (t + STAGES - 1 < KT_per) issue_stage(t + STAGES - 1, (t + STAGES - 1) % STAGES);
        else asm volatile("cp.async.commit_group;\n");
      }
      do_mma(ks & 1);
      if (ks == KSS - 1 && t + 1 < KT_per) {
        asm volatile("cp.async.wait_group %0;\n" [REDACTED: IP]"n"(STAGES - 2));
        __syncthreads();
        load_frags(t + 1, 0, 0);
      }
    }
  }

  asm volatile("cp.async.wait_group 0;\n");
  float* Pout = P + (size_t)zid * M * N;
  const int q_row = lane >> 2;
  const int q_col = lane & 3;
#pragma unroll
  for (int nj = 0; nj < NJ; ++nj) {
    const int row0 = warp_m * 16 + q_row;
    const int col = n0 + warp_n * WN + nj * 8 + q_col * 2;
    if (SK == 1) {
      const float s0 = __ldg(scale + col);
      const float s1 = __ldg(scale + col + 1);
      __nv_bfloat162 lo = __floats2bfloat162_rn(acc[nj][0] * s0, acc[nj][1] * s1);
      __nv_bfloat162 hi = __floats2bfloat162_rn(acc[nj][2] * s0, acc[nj][3] * s1);
      *reinterpret_cast<__nv_bfloat162*>(Y + (size_t)row0 * N + col) = lo;
      *reinterpret_cast<__nv_bfloat162*>(Y + (size_t)(row0 + 8) * N + col) = hi;
    } else {
      *reinterpret_cast<float2*>(Pout + (size_t)row0 * N + col) = make_float2(acc[nj][0], acc[nj][1]);
      *reinterpret_cast<float2*>(Pout + (size_t)(row0 + 8) * N + col) = make_float2(acc[nj][2], acc[nj][3]);
    }
  }
}

template <int SK>
__global__ void __kernel_reduce_scale(const float* __restrict__ P, const float* __restrict__ scale,
                                      __nv_bfloat16* __restrict__ Y, int M, int N) {
  int idx = (blockIdx.x * blockDim.x + threadIdx.x) * 4;
  int total = M * N;
  if (idx >= total) return;
  float4 acc = *reinterpret_cast<const float4*>(P + idx);
#pragma unroll
  for (int z = 1; z < SK; ++z) {
    float4 w = *reinterpret_cast<const float4*>(P + (size_t)z * total + idx);
    acc.x += w.x; acc.y += w.y; acc.z += w.z; acc.w += w.w;
  }
  int n0 = idx % N;
  float s0 = scale[n0], s1 = scale[n0 + 1], s2 = scale[n0 + 2], s3 = scale[n0 + 3];
  __nv_bfloat162 o0 = __floats2bfloat162_rn(acc.x * s0, acc.y * s1);
  __nv_bfloat162 o1 = __floats2bfloat162_rn(acc.z * s2, acc.w * s3);
  uint2 outv = make_uint2(reinterpret_cast<uint32_t&>(o0), reinterpret_cast<uint32_t&>(o1));
  *reinterpret_cast<uint2*>(Y + idx) = outv;
}

// ---------------- pad kernel (funnel-shift realign) ----------------
__global__ void pad_rows_kernel(const uint8_t* __restrict__ src, uint8_t* __restrict__ dst,
                                int R, int K, int Kp) {
  const int chunk = Kp / 16;
  long long idx = (long long)blockIdx.x * blockDim.x + threadIdx.x;
  long long total = (long long)R * chunk;
  if (idx >= total) return;
  const int r = (int)(idx / chunk);
  const int c = (int)(idx % chunk);
  const int kb = c * 16;
  uint4 outv = make_uint4(0, 0, 0, 0);
  if (kb < K) {
    long long src_off = (long long)r * K + kb;
    int valid = K - kb >= 16 ? 16 : (K - kb);
    long long base = src_off & ~15LL;
    int s = (int)(src_off - base);
    const uint8_t* sp = src + base;
    bool ok_read = (base + 32 <= (long long)R * K);
    if (ok_read && s != 0) {
      uint4 a = *reinterpret_cast<const uint4*>(sp);
      uint4 b = *reinterpret_cast<const uint4*>(sp + 16);
      uint32_t w[8] = {a.x, a.y, a.z, a.w, b.x, b.y, b.z, b.w};
      int s4 = s >> 2, sb = (s & 3) * 8;
      uint32_t o[4];
      if (sb == 0) {
#pragma unroll
        for (int i = 0; i < 4; ++i) o[i] = w[i + s4];
      } else {
#pragma unroll
        for (int i = 0; i < 4; ++i) o[i] = __funnelshift_r(w[i + s4], w[i + s4 + 1], sb);
      }
      outv = make_uint4(o[0], o[1], o[2], o[3]);
      if (valid < 16) {
        for (int i = valid; i < 16; ++i) reinterpret_cast<uint8_t*>(&outv)[i] = 0;
      }
    } else if (ok_read) {
      outv = *reinterpret_cast<const uint4*>(sp);
      if (valid < 16) {
        for (int i = valid; i < 16; ++i) reinterpret_cast<uint8_t*>(&outv)[i] = 0;
      }
    } else {
      for (int i = 0; i < 16; ++i) {
        long long so = src_off + i;
        reinterpret_cast<uint8_t*>(&outv)[i] = (i < valid && so < (long long)R * K) ? src[so] : 0;
      }
    }
  }
  *reinterpret_cast<uint4*>(dst + (long long)r * Kp + kb) = outv;
}

// ---------------- naive generic fallback (any shape) ----------------
// __device__ fp8 e4m3 -> float conversion (exact)
__device__ __forceinline__ float fp8_to_f32(uint8_t v) {
  uint32_t sign = (v & 0x80) << 24;
  uint32_t exp = (v >> 3) & 0xF;
  uint32_t man = v & 0x7;
  if (exp == 0) {
    // subnormal: value = man * 2^(1-7-3) = man * 2^-9
    float f = (float)man;
    uint32_t u = sign | 0x3B000000;  // 2^-9? scale below instead
    float r = f * 0.001953125f;      // 2^-9
    return sign ? -r : r;
  }
  if (exp == 0xF) {
    // NaN (e4m3fn: all-ones mantissa = NaN); no inf
    uint32_t u = 0x7FC00000u | sign;
    return __uint_as_float(u);
  }
  uint32_t u = sign | ((exp + 120) << 23) | (man << 20);
  return __uint_as_float(u);
}

__global__ void gemm_naive(const uint8_t* __restrict__ A, const uint8_t* __restrict__ B,
                           const float* __restrict__ scale, __nv_bfloat16* __restrict__ C,
                           int M, int N, int K) {
  int n = blockIdx.x * blockDim.x + threadIdx.x;
  int m = blockIdx.y;
  if (m >= M || n >= N) return;
  float acc = 0.f;
  const uint8_t* a = A + (size_t)m * K;
  const uint8_t* b = B + (size_t)n * K;
  for (int k = 0; k < K; ++k) acc += fp8_to_f32(a[k]) * fp8_to_f32(b[k]);
  C[(size_t)m * N + n] = __float2bfloat16(acc * scale[n]);
}

// ---------------- host API ----------------
torch::Tensor gemm_128x256(torch::Tensor x, torch::Tensor w, torch::Tensor scale) {
  const int M = x.size(0), K = x.size(1), N = w.size(0);
  auto C = torch::empty({M, N}, x.options().dtype(torch::kBFloat16));
  int grid_m = M / 128, grid_n = N / 256;
  auto kernel = __kernel_fp8_gemm<128, 256, 64, 4, 2, 4>;
  constexpr int SMEM = 4 * (128 + 256) * 64 + 256 * 4;
  static bool inited = [&]() {
    cudaFuncSetAttribute(kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, SMEM);
    return true;
  }();
  (void)inited;
  kernel<<<dim3(grid_m * grid_n), 256, SMEM, at::cuda::getCurrentCUDAStream()>>>(
      reinterpret_cast<const uint8_t*>(x.data_ptr()), reinterpret_cast<const uint8_t*>(w.data_ptr()),
      scale.data_ptr<float>(), reinterpret_cast<__nv_bfloat16*>(C.data_ptr()),
      M, N, K, grid_m, grid_n, K / 64, 8);
  return C;
}

torch::Tensor gemm_skinny(torch::Tensor x, torch::Tensor w, torch::Tensor scale, torch::Tensor P) {
  const int M = x.size(0), K = x.size(1), N = w.size(0);
  auto Y = torch::empty({M, N}, x.options().dtype(torch::kBFloat16));
  constexpr int BN = 32, BK = 512, SK = 1;
  auto kernel = __kernel_fp8_gemm_skinny<BN, BK, 3, 2, SK>;
  constexpr int SMEM = 3 * (32 + BN) * BK;
  static bool inited = [&]() {
    cudaFuncSetAttribute(kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, SMEM);
    return true;
  }();
  (void)inited;
  auto stream = at::cuda::getCurrentCUDAStream();
  kernel<<<dim3(N / BN, SK), 128, SMEM, stream>>>(
      reinterpret_cast<const uint8_t*>(x.data_ptr()), reinterpret_cast<const uint8_t*>(w.data_ptr()),
      P.data_ptr<float>(), scale.data_ptr<float>(),
      reinterpret_cast<__nv_bfloat16*>(Y.data_ptr()), M, N, K, K / (SK * BK));
  return Y;
}

torch::Tensor pad_rows(torch::Tensor x, int64_t Kp) {
  int R = x.size(0), K = x.size(1);
  auto dst = torch::empty({R, Kp}, x.options());
  int chunk = (int)(Kp / 16);
  long long total = (long long)R * chunk;
  pad_rows_kernel<<<(total + 255) / 256, 256, 0, at::cuda::getCurrentCUDAStream()>>>(
      reinterpret_cast<const uint8_t*>(x.data_ptr()), reinterpret_cast<uint8_t*>(dst.data_ptr()),
      R, K, (int)Kp);
  return dst;
}

// dual-stream pad: x on a side stream, w on the current stream.
static cudaStream_t g_side = nullptr;
static cudaEvent_t g_ev = nullptr;

void dual_pad(torch::Tensor x, torch::Tensor w, torch::Tensor xp, torch::Tensor wp, int64_t Kp) {
  if (!g_side) {
    cudaStreamCreateWithFlags(&g_side, cudaStreamNonBlocking);
    cudaEventCreateWithFlags(&g_ev, cudaEventDisableTiming);
  }
  auto main = at::cuda::getCurrentCUDAStream();
  cudaEventRecord(g_ev, main.stream());
  cudaStreamWaitEvent(g_side, g_ev, 0);
  {
    const int chunk = (int)(Kp / 16);
    long long total_x = (long long)x.size(0) * chunk;
    pad_rows_kernel<<<(total_x + 255) / 256, 256, 0, g_side>>>(
        reinterpret_cast<const uint8_t*>(x.data_ptr()), reinterpret_cast<uint8_t*>(xp.data_ptr()),
        x.size(0), x.size(1), (int)Kp);
    long long total_w = (long long)w.size(0) * chunk;
    pad_rows_kernel<<<(total_w + 255) / 256, 256, 0, main.stream()>>>(
        reinterpret_cast<const uint8_t*>(w.data_ptr()), reinterpret_cast<uint8_t*>(wp.data_ptr()),
        w.size(0), w.size(1), (int)Kp);
  }
  cudaEventRecord(g_ev, g_side);
  cudaStreamWaitEvent(main.stream(), g_ev, 0);
}

torch::Tensor gemm_naive_caller(torch::Tensor x, torch::Tensor w, torch::Tensor scale) {
  const int M = x.size(0), K = x.size(1), N = w.size(0);
  auto C = torch::empty({M, N}, x.options().dtype(torch::kBFloat16));
  dim3 grid((N + 255) / 256, M);
  gemm_naive<<<grid, 256, 0, at::cuda::getCurrentCUDAStream()>>>(
      reinterpret_cast<const uint8_t*>(x.data_ptr()), reinterpret_cast<const uint8_t*>(w.data_ptr()),
      scale.data_ptr<float>(), reinterpret_cast<__nv_bfloat16*>(C.data_ptr()), M, N, K);
  return C;
}

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
  m.def("gemm_128x256", &gemm_128x256);
  m.def("gemm_skinny", &gemm_skinny);
  m.def("pad_rows", &pad_rows);
  m.def("dual_pad", &dual_pad);
  m.def("gemm_naive", &gemm_naive_caller);
}
"""

_mod = None


def _get_mod():
    global _mod
    if _mod is None:
        from torch.utils.cpp_extension import load_inline
        _mod = load_inline(
            name="kbh_fp8_gemm_sol_v2",
            cpp_sources="",
            cuda_sources=_cuda_src,
            extra_cuda_cflags=["-arch=sm_120a", "-O3", "--use_fast_math", "-std=c++17"],
            verbose=False,
        )
    return _mod


class Model(nn.Module):
    """y = ((x @ w.T) * weight_scale).to(bf16). Buffers match reference."""

    def __init__(self, M: int, N: int, K: int):
        super().__init__()
        self.M, self.N, self.K = M, N, K
        self.register_buffer("weight", torch.empty(N, K, dtype=torch.float8_e4m3fn))
        self.register_buffer("weight_scale", torch.empty(N, dtype=torch.float32))
        m = _get_mod()
        self._g256 = m.gemm_128x256
        self._gsk = m.gemm_skinny
        self._dpad = m.dual_pad
        self._gn = m.gemm_naive
        self._ws = None
        self._Kp = (K + 63) // 64 * 64
        self._xp = None
        self._wp = None
        if M == 32 and N % 32 == 0 and K % 512 == 0:
            self._mode = 2
        elif N % 256 == 0 and M % 128 == 0 and K % 64 == 0:
            self._mode = 0
        elif N % 256 == 0 and M % 128 == 0:
            self._mode = 1
        else:
            self._mode = 3

    def forward(self, x: torch.Tensor) -> torch.Tensor:
        x = x.contiguous()
        mode = self._mode
        if mode == 0:
            return self._g256(x, self.weight, self.weight_scale)
        if mode == 2:
            if self._ws is None:
                self._ws = torch.empty(1, device=x.device, dtype=torch.float32)
            return self._gsk(x, self.weight, self.weight_scale, self._ws)
        if mode == 1:
            Kp = self._Kp
            w = self.weight
            if self._xp is None or self._xp.shape[0] != x.shape[0] or self._wp.shape[0] != w.shape[0]:
                self._xp = torch.empty(x.shape[0], Kp, device=x.device, dtype=torch.float8_e4m3fn)
                self._wp = torch.empty(w.shape[0], Kp, device=x.device, dtype=torch.float8_e4m3fn)
            self._dpad(x, w, self._xp, self._wp, Kp)
            return self._g256(self._xp, self._wp, self.weight_scale)
        return self._gn(x, self.weight, self.weight_scale)


M = 4096
N = 4096
K = 4096


def get_inputs():
    x = (torch.rand(M, K) * 8 - 4).to(torch.float8_e4m3fn)
    return [x]


def get_init_inputs():
    return [M, N, K]

20260716_145443_kinetic-claude_kinetic-0715_1m__01_fp8_gemm