kernelbench.com

KernelBench cuda · H100

GLM-5.2 Fused MoE DeepSeek V4 Flash (0731)

5.03%geomean peak fraction across shapes

manually audited: clean

Full static audit covered all 532 lines of solution.py and all 204105 transcript records. The submitted path performs genuine live-input MoE computation: a load_inline CUDA extension counts and packs routed tokens, runs bf16-input/fp32-output strided-batched cuBLAS GEMMs, applies SiLU*up, and scatter-adds weighted routed outputs into a freshly produced fp32 accumulator before converting to bf16. Parameters, x, expert_ids, and expert_weights are consumed on every forward. There is no constant or precomputed answer, seed/shape answer table, caller/stack/check.py runtime sniff, data_ptr identity key, output memoization, or CUDA graph. _EXT caches only the compiled extension module, and the static cuBLAS handle caches only library state, not tensors or results. Therefore no empirical same-buffer overwrite/cache test is required. The complete source has no Triton, DSL, forbidden framework, reference import, or problem.yaml forbidden-string hit; the archived CUDA-language report independently records framework=cuda_raw, triton_cheat=false, forbidden_hits=[], and ok=true. Transcript Write/Edit calls target this cell's solution and disposable dev files; it reads this cell's grader/eval sources and restores its own frozen problem deck after workspace resets, but does not read a foreign run's solution, result, transcript, or performance artifact. The archived repo problem deck is byte-for-byte identical to template_files, consistent with result.json template_mutated=false, so contamination is clean. The pre-regrade observations are retained as provenance: result.regrade.contended records correct=true, peak_fraction=0.0050, and zero check/benchmark exit codes; benchmark.contended.log records per-shape fractions 0.0180, 0.0182, 0.0001, 0.0253, 0.0036, and 0.0065 and RESULT: LOW. That contended attempt hit the run-local nvcc wrapper's sole infrastructure error, "nvcc is unavailable", then used the PyTorch fallback, so it was not publication-grade raw-CUDA evidence. The isolated sequential regrade recorded by result.regrade ran on NVIDIA H100 PCIe at 2026-08-03T07:24:13+00:00. Its clean check.log records cuda_language framework=cuda_raw and PASS; because the log gives no per-case magnitudes, none are claimed. Its benchmark.log records per-shape fractions 0.2128, 0.1667, 0.0006, 0.2844, 0.0377, and 0.0713, peak_fraction=0.0503, and RESULT: OK. The regraded result.json records correct=true and zero check/benchmark exit codes. These isolated publish-grade metrics supersede the preserved pre-regrade 0.0050 result.

harnessor-fableagent session4h 45mtotal wall5h 32mcheck24mbenchmark23moutput tokensgpu-lock wait8mgpu-lock held47mregimecompute

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

shape 011.531 ms21.3%1.13 TB/s · 55% of 2.0 TB/s HBM · also 161 TFLOPS (21% of compute)
shape 114.838 ms16.7%0.88 TB/s · 43% of 2.0 TB/s HBM · also 126 TFLOPS (17% of compute)
shape 20.997 ms0.1%12.97 TB/s · 636% of 2.0 TB/s HBM · also 0 TFLOPS (0% of compute)
shape 317.262 ms28.4%0.76 TB/s · 37% of 2.0 TB/s HBM · also 215 TFLOPS (28% of compute)
shape 48.141 ms3.8%1.59 TB/s · 78% of 2.0 TB/s HBM · also 28 TFLOPS (4% of compute)
shape 58.406 ms7.1%1.54 TB/s · 76% of 2.0 TB/s HBM · also 54 TFLOPS (7% of compute)

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

geomean(21.3% · 16.7% · 0.1% · 28.4% · 3.8% · 7.1%) = 5.0%

Kernel source (redacted)
"""GLM-5.2-class fused MoE layer (CUDA).

Strategy:
  - Shared expert runs on every token as two dense GEMMs with a fused SiLU*up
    activation in between.
  - Routed experts: tokens are bucketed per expert and processed as a padded
    strided-batched GEMM (cuBLAS via a small C++ helper) so every used expert's
    weights are streamed exactly once.  All GEMMs use bf16 inputs with fp32
    accumulation *and* fp32 outputs (gate/up stay in fp32 until the activation),
    matching the numeric floor of the reference's fp32 matmul pipeline.
  - Custom CUDA kernels build the per-expert padded token buffer + slot
    bookkeeping, apply the activation, and do the final weighted scatter-add
    into the fp32 accumulator.
"""
from __future__ import annotations

import importlib.util
from pathlib import Path

import torch
import torch.nn as nn
from torch.utils.cpp_extension import load_inline

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

#define DEVINLINE __device__ __forceinline__

DEVINLINE float bf2f(__nv_bfloat16 h) { return __bfloat162float(h); }
DEVINLINE __nv_bfloat16 f2bf(float f) { return __float2bfloat16(f); }

// ---- batched GEMM: C = A @ B^T with bf16 in / fp32 out --------------------
// A: (G, M, K) bf16, B: (G, N, K) bf16.  Returns (G, M, N) fp32 row-major.
// Implemented as cuBLAS column-major C^T = B @ A^T, so the natural row-major
// buffer of the transposed product IS the row-major (G, M, N) result.
static cublasHandle_t get_handle() {
    static cublasHandle_t h = nullptr;
    if (!h) cublasCreate(&h);
    return h;
}

torch::Tensor bmm_f32(torch::Tensor A, torch::Tensor B) {
    TORCH_CHECK(A.dim() == 3 && B.dim() == 3 && A.size(0) == B.size(0));
    int64_t G = A.size(0), M = A.size(1), K = A.size(2);
    int64_t N = B.size(1);
    auto C = torch::empty({G, N, M}, A.options().dtype(torch::kFloat32));
    cublasHandle_t h = get_handle();
    cublasSetStream(h, at::cuda::getCurrentCUDAStream());
    float alpha = 1.0f, beta = 0.0f;
    cublasGemmStridedBatchedEx(
        h,
        CUBLAS_OP_T, CUBLAS_OP_N,
        (int)M, (int)N, (int)K,
        &alpha,
        A.data_ptr(), CUDA_R_16BF, (int)K, (int64_t)(M * K),
        B.data_ptr(), CUDA_R_16BF, (int)K, (int64_t)(N * K),
        &beta,
        C.data_ptr(), CUDA_R_32F, (int)M, (int64_t)(M * N),
        (int)G,
        CUBLAS_COMPUTE_32F,
        CUBLAS_GEMM_DEFAULT_TENSOR_OP);
    return C;
}

// ---- count routed-expert usage -------------------------------------------
__global__ void count_experts_kernel(
    const int64_t* __restrict__ expert_ids,   // (T, top_k)
    int32_t* __restrict__ counts,             // (E) zeroed
    int total, int top_k)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx < total) {
        int t = idx / top_k;
        int k = idx - t * top_k;
        int e = (int)expert_ids[(size_t)t * top_k + k];
        atomicAdd(&counts[e], 1);
    }
}

// ---- slot bookkeeping (routed) -------------------------------------------
// Each (token, k) slot is assigned a contiguous position inside its expert's
// block.  Writes slot_token / slot_row (indexed by slot, for the x gather)
// and token_by_row / weight_by_row (indexed by g*M_pad + rank, for the
// weighted scatter-add).
__global__ void fill_slots_kernel(
    const int64_t* __restrict__ expert_ids,       // (T, top_k)
    const __nv_bfloat16* __restrict__ expert_weights,  // (T, top_k)
    const int32_t* __restrict__ offsets,          // (E+1) exclusive starts
    const int32_t* __restrict__ used_index,       // (E)
    int32_t* __restrict__ cursor,                 // (E) zeroed
    int32_t* __restrict__ slot_token,             // (S)
    int32_t* __restrict__ slot_row,               // (S) = g*M_pad + rank
    int32_t* __restrict__ token_by_row,           // (G*M_pad)
    __nv_bfloat16* __restrict__ weight_by_row,    // (G*M_pad)
    int total, int top_k, int M_pad)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx < total) {
        int t = idx / top_k;
        int k = idx - t * top_k;
        int e = (int)expert_ids[(size_t)t * top_k + k];
        int rank = atomicAdd(&cursor[e], 1);
        int slot = offsets[e] + rank;
        int g = used_index[e];
        int row = g * M_pad + rank;
        slot_token[slot] = t;
        slot_row[slot] = row;
        token_by_row[row] = t;
        weight_by_row[row] = expert_weights[(size_t)t * top_k + k];
    }
}

// ---- gather x rows into the padded per-expert A matrix --------------------
__global__ void fill_xpad_kernel(
    const int32_t* __restrict__ slot_token,   // (S)
    const int32_t* __restrict__ slot_row,     // (S)
    const __nv_bfloat16* __restrict__ x,      // (T, H)
    __nv_bfloat16* __restrict__ X_pad,        // (G*M_pad, H)
    int S, int H, int nchunk)                 // nchunk = H/8
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    int total = S * nchunk;
    if (idx < total) {
        int slot = idx / nchunk;
        int c = (idx - slot * nchunk) * 8;
        int t = slot_token[slot];
        int row = slot_row[slot];
        const __nv_bfloat16* src = x + (size_t)t * H + c;
        __nv_bfloat16* dst = X_pad + (size_t)row * H + c;
        *(uint4*)dst = *(const uint4*)src;
    }
}

DEVINLINE void silu_mul_8_f32(
    const float* __restrict__ cg,   // gate, 8 floats
    const float* __restrict__ cu,   // up,   8 floats
    __nv_bfloat16* __restrict__ h)
{
    __nv_bfloat162* h2 = (__nv_bfloat162*)h;
#pragma unroll
    for (int j = 0; j < 4; ++j) {
        float g0 = cg[2 * j], g1 = cg[2 * j + 1];
        float u0 = cu[2 * j], u1 = cu[2 * j + 1];
        float s0 = 1.0f / (1.0f + expf(-g0));
        float s1 = 1.0f / (1.0f + expf(-g1));
        h2[j] = __floats2bfloat162_rn(g0 * s0 * u0, g1 * s1 * u1);
    }
}

// ---- routed activation, reading the transposed GEMM output (G, 2I, M_pad) -
// Each block loads a (m_tile x i_tile) tile of gate+up into shared memory
// (coalesced along m), transposes, applies SiLU*up, and writes H1 coalesced
// along i.  This avoids materializing a (G, M_pad, 2I) transposed copy.
#define ACT_MT 64
#define ACT_IT 32
__global__ void silu_mul_routed_kernel(
    const float* __restrict__ C1t,    // (G, 2I, M_pad) fp32
    __nv_bfloat16* __restrict__ H1,   // (G, M_pad, I) bf16
    const int32_t* __restrict__ counts,  // (G)
    int G, int M_pad, int I)
{
    __shared__ float gsm[ACT_MT][ACT_IT + 1];
    __shared__ float usm[ACT_MT][ACT_IT + 1];
    int tid = threadIdx.x;
    int g = blockIdx.z;
    int mt0 = blockIdx.y * ACT_MT;
    int it0 = blockIdx.x * ACT_IT;
    if (mt0 >= counts[g]) return;
    int m_lim = min(ACT_MT, counts[g] - mt0);
    const float* base = C1t + ((size_t)g * (size_t)(2 * I) + it0) * M_pad + mt0;
    for (int idx = tid; idx < ACT_IT * ACT_MT; idx += blockDim.x) {
        int j = idx / ACT_MT;
        int m = idx % ACT_MT;
        if (m < m_lim) {
            gsm[m][j] = base[j * M_pad + m];
            usm[m][j] = base[(I + j) * M_pad + m];
        }
    }
    __syncthreads();
    for (int idx = tid; idx < ACT_IT * ACT_MT; idx += blockDim.x) {
        int m = idx / ACT_IT;
        int j = idx % ACT_IT;
        if (m < m_lim) {
            float g0 = gsm[m][j], u0 = usm[m][j];
            float s = 1.0f / (1.0f + expf(-g0));
            H1[((size_t)g * M_pad + mt0 + m) * I + it0 + j] = f2bf(g0 * s * u0);
        }
    }
}

// ---- shared activation: all rows valid -----------------------------------
// C is (T, 2I) fp32, H out (T, I) bf16.
__global__ void silu_mul_shared_kernel(
    const float* __restrict__ C,      // (T, 2I) fp32
    __nv_bfloat16* __restrict__ H,    // (T, I) bf16
    int T, int I)
{
    int nchunk = I / 8;
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    int total = T * nchunk;
    if (idx < total) {
        int t = idx / nchunk;
        int c = (idx - t * nchunk) * 8;
        const float* row = C + (size_t)t * (size_t)(2 * I);
        __nv_bfloat16* hrow = H + (size_t)t * I;
        silu_mul_8_f32(row + c, row + I + c, hrow + c);
    }
}

// ---- weighted scatter-add of routed outputs into fp32 accumulator --------
// Reads the transposed GEMM2 output C2t (G, H, M_pad) via a shared-memory
// transpose so the C2t reads are coalesced and the atomic writes stay
// coalesced along H.
#define RED_MT 64
#define RED_HT 64
__global__ void reduce_add_kernel(
    float* __restrict__ out_acc,                 // (T, H) fp32
    const float* __restrict__ C2t,               // (G, H, M_pad) fp32
    const int32_t* __restrict__ token_by_row,    // (G*M_pad)
    const __nv_bfloat16* __restrict__ weight_by_row,  // (G*M_pad)
    const int32_t* __restrict__ counts,          // (G)
    int G, int H, int M_pad)
{
    __shared__ float sm[RED_HT][RED_MT + 1];
    int tid = threadIdx.x;
    int g = blockIdx.z;
    int mt0 = blockIdx.y * RED_MT;
    int ht0 = blockIdx.x * RED_HT;
    if (mt0 >= counts[g]) return;
    int m_lim = min(RED_MT, counts[g] - mt0);
    const float* base = C2t + ((size_t)g * H + ht0) * M_pad + mt0;
    for (int idx = tid; idx < RED_HT * RED_MT; idx += blockDim.x) {
        int h = idx / RED_MT;
        int m = idx % RED_MT;
        if (m < m_lim) sm[h][m] = base[h * M_pad + m];
    }
    __syncthreads();
    const int32_t* tk = token_by_row + g * M_pad + mt0;
    const __nv_bfloat16* wt = weight_by_row + g * M_pad + mt0;
    int nh4 = RED_HT / 4;
    for (int idx = tid; idx < RED_MT * nh4; idx += blockDim.x) {
        int m = idx / nh4;
        int h4 = idx % nh4;
        if (m < m_lim) {
            int t = tk[m];
            float w = bf2f(wt[m]);
            float* dst = out_acc + (size_t)t * H + ht0 + h4 * 4;
            float4 v = make_float4(sm[h4 * 4][m] * w, sm[h4 * 4 + 1][m] * w,
                                   sm[h4 * 4 + 2][m] * w, sm[h4 * 4 + 3][m] * w);
            atomicAdd((float4*)dst, v);
        }
    }
}

// ============================ host wrappers ================================

void count_experts(torch::Tensor expert_ids, torch::Tensor counts,
                   int64_t total, int64_t top_k) {
    int block = 256;
    int grid = (int)((total + block - 1) / block);
    count_experts_kernel<<<grid, block>>>(
        expert_ids.data_ptr<int64_t>(), counts.data_ptr<int32_t>(),
        (int)total, (int)top_k);
}

void fill_slots(torch::Tensor expert_ids, torch::Tensor expert_weights,
                torch::Tensor offsets, torch::Tensor used_index,
                torch::Tensor cursor, torch::Tensor slot_token,
                torch::Tensor slot_row, torch::Tensor token_by_row,
                torch::Tensor weight_by_row,
                int64_t total, int64_t top_k, int64_t M_pad) {
    int block = 256;
    int grid = (int)((total + block - 1) / block);
    fill_slots_kernel<<<grid, block>>>(
        expert_ids.data_ptr<int64_t>(),
        reinterpret_cast<const __nv_bfloat16*>(expert_weights.data_ptr<at::BFloat16>()),
        offsets.data_ptr<int32_t>(), used_index.data_ptr<int32_t>(),
        cursor.data_ptr<int32_t>(), slot_token.data_ptr<int32_t>(),
        slot_row.data_ptr<int32_t>(), token_by_row.data_ptr<int32_t>(),
        reinterpret_cast<__nv_bfloat16*>(weight_by_row.data_ptr<at::BFloat16>()),
        (int)total, (int)top_k, (int)M_pad);
}

void fill_xpad(torch::Tensor slot_token, torch::Tensor slot_row,
               torch::Tensor x, torch::Tensor X_pad, int64_t S, int64_t H) {
    int nchunk = (int)(H / 8);
    int total = (int)(S * nchunk);
    int block = 256;
    int grid = (int)((total + block - 1) / block);
    fill_xpad_kernel<<<grid, block>>>(
        slot_token.data_ptr<int32_t>(), slot_row.data_ptr<int32_t>(),
        reinterpret_cast<const __nv_bfloat16*>(x.data_ptr<at::BFloat16>()),
        reinterpret_cast<__nv_bfloat16*>(X_pad.data_ptr<at::BFloat16>()),
        (int)S, (int)H, nchunk);
}

void silu_mul_routed(torch::Tensor C, torch::Tensor H, torch::Tensor counts,
                     int64_t G, int64_t M_pad, int64_t I) {
    dim3 block(256);
    dim3 grid((unsigned)((I + ACT_IT - 1) / ACT_IT),
              (unsigned)((M_pad + ACT_MT - 1) / ACT_MT),
              (unsigned)G);
    silu_mul_routed_kernel<<<grid, block>>>(
        C.data_ptr<float>(),
        reinterpret_cast<__nv_bfloat16*>(H.data_ptr<at::BFloat16>()),
        counts.data_ptr<int32_t>(), (int)G, (int)M_pad, (int)I);
}

void silu_mul_shared(torch::Tensor C, torch::Tensor H, int64_t T, int64_t I) {
    int nchunk = (int)(I / 8);
    int total = (int)(T * nchunk);
    int block = 256;
    int grid = (int)((total + block - 1) / block);
    silu_mul_shared_kernel<<<grid, block>>>(
        C.data_ptr<float>(),
        reinterpret_cast<__nv_bfloat16*>(H.data_ptr<at::BFloat16>()),
        (int)T, (int)I);
}

void reduce_add(torch::Tensor out_acc, torch::Tensor C2,
                torch::Tensor token_by_row, torch::Tensor weight_by_row,
                torch::Tensor counts, int64_t G, int64_t H, int64_t M_pad) {
    dim3 block(256);
    dim3 grid((unsigned)((H + RED_HT - 1) / RED_HT),
              (unsigned)((M_pad + RED_MT - 1) / RED_MT),
              (unsigned)G);
    reduce_add_kernel<<<grid, block>>>(
        out_acc.data_ptr<float>(), C2.data_ptr<float>(),
        token_by_row.data_ptr<int32_t>(),
        reinterpret_cast<const __nv_bfloat16*>(weight_by_row.data_ptr<at::BFloat16>()),
        counts.data_ptr<int32_t>(), (int)G, (int)H, (int)M_pad);
}
"""

_CPP_SRC = """
torch::Tensor bmm_f32(torch::Tensor A, torch::Tensor B);
void count_experts(torch::Tensor expert_ids, torch::Tensor counts,
                   int64_t total, int64_t top_k);
void fill_slots(torch::Tensor expert_ids, torch::Tensor expert_weights,
                torch::Tensor offsets, torch::Tensor used_index,
                torch::Tensor cursor, torch::Tensor slot_token,
                torch::Tensor slot_row, torch::Tensor token_by_row,
                torch::Tensor weight_by_row,
                int64_t total, int64_t top_k, int64_t M_pad);
void fill_xpad(torch::Tensor slot_token, torch::Tensor slot_row,
               torch::Tensor x, torch::Tensor X_pad, int64_t S, int64_t H);
void silu_mul_routed(torch::Tensor C, torch::Tensor H, torch::Tensor counts,
                     int64_t G, int64_t M_pad, int64_t I);
void silu_mul_shared(torch::Tensor C, torch::Tensor H, int64_t T, int64_t I);
void reduce_add(torch::Tensor out_acc, torch::Tensor C2,
                torch::Tensor token_by_row, torch::Tensor weight_by_row,
                torch::Tensor counts, int64_t G, int64_t H, int64_t M_pad);
"""

_EXT = None
_COMPILE_FAILED = False


def _cuda_toolchain_paths():
    """Return (extra_include_paths, extra_ldflags) for cuBLAS headers/libs.

    Prefer system CUDA (resolved via CUDA_HOME); fall back to the nvidia pip
    packages that ship with a torch CUDA wheel.
    """
    inc, ld = [], []
    try:
        for pkg in ("nvidia.cublas", "nvidia.cusparse", "nvidia.cusolver"):
            spec = importlib.util.find_spec(pkg)
            if spec is not None:
                p = Path(spec.origin).parent / "include"
                if p.is_dir():
                    inc.append(str(p))
        spec = importlib.util.find_spec("nvidia.cublas")
        if spec is not None:
            lib = Path(spec.origin).parent / "lib"
            if lib.is_dir():
                ld += [f"-L{lib}", "-lcublas"]
    except Exception:
        pass
    return inc, ld


def _get_ext():
    global _EXT, _COMPILE_FAILED
    if _EXT is None and not _COMPILE_FAILED:
        try:
            inc, ld = _cuda_toolchain_paths()
            _EXT = load_inline(
                name="glm52_fused_moe",
                cpp_sources=_CPP_SRC,
                cuda_sources=_CUDA_SRC,
                functions=[
                    "bmm_f32",
                    "count_experts",
                    "fill_slots",
                    "fill_xpad",
                    "silu_mul_routed",
                    "silu_mul_shared",
                    "reduce_add",
                ],
                extra_cuda_cflags=["-O3"],
                extra_include_paths=inc,
                extra_ldflags=ld,
                verbose=False,
            )
        except Exception as e:  # pragma: no cover - fallback safety
            print(f"[glm52_fused_moe] CUDA compile failed, using torch fallback: {e}")
            _COMPILE_FAILED = True
            _EXT = None
    return _EXT


class Model(nn.Module):
    def __init__(self, T, E, top_k, n_shared, H, I):
        super().__init__()
        self.T, self.E, self.top_k = T, E, top_k
        self.n_shared, self.H, self.I = n_shared, H, I
        self.w1_routed = nn.Parameter(torch.empty(E, 2 * I, H, dtype=torch.bfloat16))
        self.w2_routed = nn.Parameter(torch.empty(E, H, I, dtype=torch.bfloat16))
        self.w1_shared = nn.Parameter(torch.empty(n_shared, 2 * I, H, dtype=torch.bfloat16))
        self.w2_shared = nn.Parameter(torch.empty(n_shared, H, I, dtype=torch.bfloat16))
        for p in self.parameters():
            nn.init.normal_(p, std=0.02)

    def forward(self, x, expert_ids, expert_weights):
        ext = _get_ext()
        if ext is None:
            return self._forward_torch(x, expert_ids, expert_weights)
        return self._forward_cuda(ext, x, expert_ids, expert_weights)

    # ---------------------------------------------------------------- torch
    def _forward_torch(self, x, expert_ids, expert_weights):
        """Eager fallback (matches reference semantics) when CUDA is missing."""
        T, H = x.shape
        out = torch.zeros(T, H, device=x.device, dtype=torch.float32)
        xf = x.float()
        I = self.I
        for s in range(self.n_shared):
            w1 = self.w1_shared[s].float()
            w2 = self.w2_shared[s].float()
            gate = xf @ w1[:I].t()
            up = xf @ w1[I:].t()
            h = torch.nn.functional.silu(gate) * up
            out = out + h @ w2.t()
        wts = expert_weights.float()
        for e in range(self.E):
            mask = expert_ids == e
            if not mask.any():
                continue
            token_idx, k_idx = mask.nonzero(as_tuple=True)
            w1 = self.w1_routed[e].float()
            w2 = self.w2_routed[e].float()
            x_e = xf[token_idx]
            gate = x_e @ w1[:I].t()
            up = x_e @ w1[I:].t()
            y = (torch.nn.functional.silu(gate) * up) @ w2.t()
            out.index_add_(0, token_idx, y * wts[token_idx, k_idx].unsqueeze(1))
        return out.to(torch.bfloat16)

    # ----------------------------------------------------------------- cuda
    def _forward_cuda(self, ext, x, expert_ids, expert_weights):
        T, H = x.shape
        E = self.E
        top_k = self.top_k
        I = self.I
        dev = x.device
        S = T * top_k

        # ---- shared expert: two dense GEMMs + fused activation ----
        out_acc = None
        for s in range(self.n_shared):
            # C = x @ w1_shared^T ; bmm_f32(A=x, B=w1) returns (1, 2I, T) = C^T
            c1 = ext.bmm_f32(x.unsqueeze(0), self.w1_shared[s].unsqueeze(0))
            c1 = c1.transpose(1, 2).contiguous().squeeze(0)   # (T, 2I) fp32
            h1 = torch.empty(T, I, dtype=torch.bfloat16, device=dev)
            ext.silu_mul_shared(c1, h1, T, I)
            y = ext.bmm_f32(h1.unsqueeze(0), self.w2_shared[s].unsqueeze(0))
            y = y.transpose(1, 2).contiguous().squeeze(0)      # (T, H) fp32
            out_acc = y if out_acc is None else out_acc + y

        # ---- routed: count -> scan -> used list (deterministic) ----
        counts = torch.zeros(E, dtype=torch.int32, device=dev)
        ext.count_experts(expert_ids, counts, S, top_k)
        offsets = torch.zeros(E + 1, dtype=torch.int32, device=dev)
        torch.cumsum(counts, 0, out=offsets.narrow(0, 1, E))
        is_used = counts > 0
        G = int(is_used.sum().item())
        g = (torch.cumsum(is_used.to(torch.int32), 0) - is_used.to(torch.int32)).to(torch.int32)
        used_index = torch.where(is_used, g, torch.full_like(g, -1))
        used_e = torch.nonzero(is_used).flatten().to(torch.int64)
        M_pad = int(((int(counts.max().item()) + 7) // 8) * 8)
        M_pad = max(M_pad, 8)

        if G == E:
            W1 = self.w1_routed
            W2 = self.w2_routed
        else:
            W1 = self.w1_routed.index_select(0, used_e)
            W2 = self.w2_routed.index_select(0, used_e)

        counts_used = counts.index_select(0, used_e).contiguous()

        # ---- fill slots + gather x rows into padded per-expert A ----
        cursor = torch.zeros(E, dtype=torch.int32, device=dev)
        slot_token = torch.empty(S, dtype=torch.int32, device=dev)
        slot_row = torch.empty(S, dtype=torch.int32, device=dev)
        token_by_row = torch.empty(G * M_pad, dtype=torch.int32, device=dev)
        weight_by_row = torch.empty(G * M_pad, dtype=torch.bfloat16, device=dev)
        X_pad = torch.empty(G, M_pad, H, dtype=torch.bfloat16, device=dev)
        ext.fill_slots(expert_ids, expert_weights, offsets, used_index, cursor,
                       slot_token, slot_row, token_by_row, weight_by_row,
                       S, top_k, M_pad)
        ext.fill_xpad(slot_token, slot_row, x, X_pad, S, H)

        # ---- GEMM1 (gate|up) + fused activation (reads transposed C1^T) ----
        C1t = ext.bmm_f32(X_pad, W1)                             # (G, 2I, M_pad) fp32
        H1 = torch.empty(G, M_pad, I, dtype=torch.bfloat16, device=dev)
        ext.silu_mul_routed(C1t, H1, counts_used, G, M_pad, I)

        # ---- GEMM2 (down): C2t = H1 @ W2^T, fp32 out ----
        C2t = ext.bmm_f32(H1, W2)                                # (G, H, M_pad) fp32

        # ---- weighted scatter-add (reads transposed C2^T) ----
        ext.reduce_add(out_acc, C2t, token_by_row, weight_by_row,
                       counts_used, G, H, M_pad)

        return out_acc.to(torch.bfloat16)

20260802_204046_or-fable_deepseek_deepseek-v4-flash-0731_01_glm52_fused_moe