KernelBench cuda · RTX PRO 6000

DeepSeek NSA GPT-6 Sol

2.624 msgeomean latency across six shapes · lower is better

manually audited: clean

Two authored CUDA kernels rebuild fp32 prefix means from live keys, select the causal top eight key blocks with the reference tie-break, include the local window, and compute sparse attention and softmax. Output and scratch are freshly allocated each call. The current graded-shape check exercises the long selection regime and passed in the isolated regrade.

harnesscodexagent session1h 37mtotal wall2h 54mcheck5mbenchmark2soutput tokens40,896gpu-lock wait2h 15mgpu-lock held10mregimecompute

Per-shape latencymilliseconds are the measured result; the dense-equivalent roofline is not a useful ceiling

1×16×2048×641.569 ms
1×16×4127×643.478 ms
1×8×8192×643.859 ms
1×8×8191×1284.845 ms
4×8×1024×641.320 ms
2×8×3000×642.426 ms

geomean(1.569 ms · 3.478 ms · 3.859 ms · 4.845 ms · 1.320 ms · 2.426 ms) = 2.624 ms

Kernel source (redacted)
"""CUDA implementation of the benchmark's block-selected causal attention."""
import torch
import torch.nn as nn
from torch.utils.cpp_extension import load_inline


_CPP = r"""
#include <torch/extension.h>
void nsa_cuda(torch::Tensor q, torch::Tensor k, torch::Tensor v,
              torch::Tensor prefix, torch::Tensor out);
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("run", &nsa_cuda); }
"""

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

__global__ void prefix_kernel(const __nv_bfloat16* __restrict__ k,
                              float* __restrict__ p, int S, int D, int NB) {
    int bi = blockIdx.x, bh = blockIdx.y;
    int d = threadIdx.x;
    if (d >= D) return;
    const __nv_bfloat16* kh = k + (size_t)bh * S * D;
    float* ph = p + (size_t)bh * S * D;
    int start = bi * 64;
    int end = min(start + 64, S);
    float sum = 0.0f;
    for (int j = start; j < end; ++j) {
        sum += __bfloat162float(kh[(size_t)j * D + d]);
        ph[(size_t)j * D + d] = sum / float(j - start + 1);
    }
}

__global__ void nsa_kernel(const __nv_bfloat16* __restrict__ q,
                           const __nv_bfloat16* __restrict__ k,
                           const __nv_bfloat16* __restrict__ v,
                           const float* __restrict__ prefix,
                           __nv_bfloat16* __restrict__ out,
                           int S, int D, int NB, float scale) {
    int t = blockIdx.x, bh = blockIdx.y;
    int tid = threadIdx.x, lane = tid & 31, warp = tid >> 5;
    const __nv_bfloat16* qh = q + (size_t)bh * S * D;
    const __nv_bfloat16* kh = k + (size_t)bh * S * D;
    const __nv_bfloat16* vh = v + (size_t)bh * S * D;
    const float* ph = prefix + (size_t)bh * S * D;
    __nv_bfloat16* oh = out + (size_t)bh * S * D;
    const __nv_bfloat16* qt = qh + (size_t)t * D;
    __shared__ float importance[128];
    __shared__ int selected[8];
    __shared__ int indices[576];
    __shared__ float logits[576];
    __shared__ int count;
    __shared__ float max_logit, denom;

    int valid_blocks = t / 64 + 1;
    for (int bi = warp; bi < valid_blocks; bi += 4) {
        int last = bi == t / 64 ? t : min((bi + 1) * 64, S) - 1;
        const float* mean = ph + (size_t)last * D;
        float partial = 0.0f;
        for (int d = lane; d < D; d += 32)
            partial = fmaf(__bfloat162float(qt[d]), mean[d], partial);
        for (int delta = 16; delta; delta >>= 1)
            partial += __shfl_down_sync(0xffffffff, partial, delta);
        if (lane == 0) importance[bi] = partial * scale;
    }
    __syncthreads();

    if (tid == 0) {
        int nsel = min(valid_blocks, 8);
        for (int i = 0; i < nsel; ++i) {
            float best = -INFINITY;
            int best_b = -1;
            for (int bi = 0; bi < valid_blocks; ++bi) {
                float x = importance[bi];
                if (x > best || (x == best && bi > best_b)) {
                    best = x; best_b = bi;
                }
            }
            selected[i] = best_b;
            importance[best_b] = -INFINITY;
        }
        count = 0;
        for (int i = 0; i < nsel; ++i) {
            int start = selected[i] * 64;
            int end = min(start + 64, t + 1);
            for (int j = start; j < end; ++j) indices[count++] = j;
        }
        int w0 = max(0, t - 63);
        for (int j = w0; j <= t; ++j) {
            bool exists = false;
            for (int i = 0; i < nsel; ++i)
                if (selected[i] == j / 64) exists = true;
            if (!exists) indices[count++] = j;
        }
    }
    __syncthreads();

    for (int i = warp; i < count; i += 4) {
        const __nv_bfloat16* kj = kh + (size_t)indices[i] * D;
        float partial = 0.0f;
        for (int d = lane; d < D; d += 32)
            partial = fmaf(__bfloat162float(qt[d]), __bfloat162float(kj[d]), partial);
        for (int delta = 16; delta; delta >>= 1)
            partial += __shfl_down_sync(0xffffffff, partial, delta);
        if (lane == 0) logits[i] = partial * scale;
    }
    __syncthreads();
    if (tid == 0) {
        float m = -INFINITY;
        for (int i = 0; i < count; ++i) m = fmaxf(m, logits[i]);
        max_logit = m;
    }
    __syncthreads();
    for (int i = tid; i < count; i += blockDim.x)
        logits[i] = expf(logits[i] - max_logit);
    __syncthreads();
    if (tid == 0) {
        float z = 0.0f;
        for (int i = 0; i < count; ++i) z += logits[i];
        denom = z;
    }
    __syncthreads();
    for (int d = tid; d < D; d += blockDim.x) {
        float acc = 0.0f;
        for (int i = 0; i < count; ++i)
            acc = fmaf(logits[i], __bfloat162float(vh[(size_t)indices[i] * D + d]), acc);
        oh[(size_t)t * D + d] = __float2bfloat16(acc / denom);
    }
}

void nsa_cuda(torch::Tensor q, torch::Tensor k, torch::Tensor v,
              torch::Tensor prefix, torch::Tensor out) {
    int B = q.size(0), H = q.size(1), S = q.size(2), D = q.size(3);
    int NB = (S + 63) / 64;
    auto stream = at::cuda::getCurrentCUDAStream();
    prefix_kernel<<<dim3(NB, B * H), D, 0, stream>>>(
        (const __nv_bfloat16*)k.data_ptr(), (float*)prefix.data_ptr(), S, D, NB);
    nsa_kernel<<<dim3(S, B * H), 128, 0, stream>>>(
        (const __nv_bfloat16*)q.data_ptr(), (const __nv_bfloat16*)k.data_ptr(),
        (const __nv_bfloat16*)v.data_ptr(), (const float*)prefix.data_ptr(),
        (__nv_bfloat16*)out.data_ptr(), S, D, NB, rsqrtf(float(D)));
}
"""

_extension = None


def _get_extension():
    global _extension
    if _extension is None:
        _extension = load_inline(
            name="nsa_sparse_cuda_v1",
            cpp_sources=_CPP,
            cuda_sources=_CUDA,
            functions=None,
            extra_cflags=["-O3"],
            extra_cuda_cflags=["-O3", "-arch=sm_120"],
        )
    return _extension


class Model(nn.Module):
    def __init__(self, B: int, H: int, S: int, D: int):
        super().__init__()
        self.B, self.H, self.S, self.D = B, H, S, D
        self.register_buffer("_dummy", torch.zeros(1, dtype=torch.bfloat16))

    def forward(self, q: torch.Tensor, k: torch.Tensor, v: torch.Tensor) -> torch.Tensor:
        out = torch.empty_like(q)
        prefix = torch.empty(q.shape, device=q.device, dtype=torch.float32)
        _get_extension().run(q, k, v, prefix, out)
        return out

20260922_123318_codex_gpt-6-sol_02_deepseek_nsa