gpt-5.5-priority · popcorn · l123_single_gpt
compile_fail 8_SegmentTopKCSR.py
model
gpt-5.5-priority
turns / max
1 / 1
tool calls
1
tokens (total)
0
wall clock
—
truncated
no
backend
cuda fp32
variant
popcorn
runtime
—
ref runtime
-1.00 μs
speedup
—
started
2026-05-05T00:42:49Z
compile error: Error building extension 'csr_row_topk_ext_v1': [1/3] /opt/conda/bin/x86_64-conda-linux-gnu-c++ -MMD -MF main.o.d -DTORCH_EXTENSION_NAME=csr_row_topk_ext_v1 -DTORCH_API_INCLUDE_EXTENSION_H -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include/torch/csrc/api/include -isystem /usr/local/cuda/include -isystem /opt/conda/include/python3.10 -fPIC -std=c++17 -O3 -c /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row
timingkernelbench.timing
kernel runtime
—
ref runtime
—
speedup
—
kernel mean / median / std
—
ref mean / median / std
—
reference PyTorch source (the prompt the agent sees)
import torch
import torch.nn as nn


class Model(nn.Module):
    """
    Per-row top-k selection over CSR edge segments.

    Returns the top-k values and their original edge indices for each node's
    neighborhood. Useful for graph sparsification, hard attention, and
    candidate-pruning workloads.
    """

    def __init__(self, k):
        super().__init__()
        self.k = k

    def forward(
        self,
        row_ptr: torch.Tensor,
        edge_scores: torch.Tensor,
    ) -> tuple[torch.Tensor, torch.Tensor]:
        num_nodes = row_ptr.numel() - 1
        topk_vals = torch.full((num_nodes, self.k), float("-inf"), dtype=edge_scores.dtype, device=edge_scores.device)
        topk_idx = torch.full((num_nodes, self.k), -1, dtype=torch.int64, device=edge_scores.device)

        for node in range(num_nodes):
            start = int(row_ptr[node].item())
            end = int(row_ptr[node + 1].item())
            if end <= start:
                continue
            segment = edge_scores[start:end]
            curr_k = min(self.k, end - start)
            vals, idx = torch.topk(segment, k=curr_k, dim=0)
            topk_vals[node, :curr_k] = vals
            topk_idx[node, :curr_k] = idx.long() + start

        return topk_vals, topk_idx


num_nodes = 320
avg_degree = 12
k = 4




def get_inputs():
    return list(popcorn_pri.make_csr_scalar_edge_scores(num_nodes, avg_degree))



def get_init_inputs():
    return [k]
turn 0 · FINAL · 1 tool call(s) · 30.6s turn · 30.6s LLM · 9,577 chars (click to expand)
turn 030.6s turn · 30.6s LLM · 0.0s tools · FINAL
call → submit_kernel
callsubmit_kernel { "kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n\n_cpp_src = r\"\"\"\n#include <torch/extension.h>\n#include <vector>\n\nstd::vector<torch::Tensor> csr_topk_forward(torch::Tensor row_ptr, torch::Tensor edge_scores, int64_t k);\n\"\"\"\n\n_cuda_src = r\"\"\"\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <c10/cuda/CUDAGuard.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <vector>\n#include <limits>\n\n__global__ void csr_topk4_kernel(const int* __restrict__ row_ptr,\n const float* __restrict__ scores,\n float* __restrict__ out_vals,\n long long* __restrict__ out_idx,\n int n) {\n int node = blockIdx.x * blockDim.x + threadIdx.x;\n if (node >= n) return;\n\n int start = row_ptr[node];\n int end = row_ptr[node + 1];\n\n float v0 = -CUDART_INF_F, v1 = -CUDART_INF_F, v2 = -CUDART_INF_F, v3 = -CUDART_INF_F;\n int i0 = -1, i1 = -1, i2 = -1, i3 = -1;\n\n #pragma unroll 16\n for (int e = start; e < end; ++e) {\n float v = scores[e];\n if (v > v0) {\n v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = v0; i1 = i0; v0 = v; i0 = e;\n } else if (v > v1) {\n v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = v; i1 = e;\n } else if (v > v2) {\n v3 = v2; i3 = i2; v2 = v; i2 = e;\n } else if (v > v3) {\n v3 = v; i3 = e;\n }\n }\n\n int o = node * 4;\n out_vals[o + 0] = v0; out_vals[o + 1] = v1; out_vals[o + 2] = v2; out_vals[o + 3] = v3;\n out_idx [o + 0] = (long long)i0; out_idx [o + 1] = (long long)i1;\n out_idx [o + 2] = (long long)i2; out_idx [o + 3] = (long long)i3;\n}\n\ntemplate<int MAXK>\n__global__ void csr_topk_generic_kernel(const int* __restrict__ row_ptr,\n const float* __restrict__ scores,\n float* __restrict__ out_vals,\n long long* __restrict__ out_idx,\n int n, int k) {\n int node = blockIdx.x * blockDim.x + threadIdx.x;\n if (node >= n) return;\n\n float vals[MAXK];\n int idxs[MAXK];\n #pragma unroll\n for (int j = 0; j < MAXK; ++j) { vals[j] = -CUDART_INF_F; idxs[j] = -1; }\n\n int kk = k < MAXK ? k : MAXK;\n int start = row_ptr[node];\n int end = row_ptr[node + 1];\n for (int e = start; e < end; ++e) {\n float v = scores[e];\n if (v > vals[kk - 1]) {\n int pos = kk - 1;\n while (pos > 0 && v > vals[pos - 1]) {\n vals[pos] = vals[pos - 1];\n idxs[pos] = idxs[pos - 1];\n --pos;\n }\n vals[pos] = v;\n idxs[pos] = e;\n }\n }\n\n int base = node * k;\n for (int j = 0; j < k; ++j) {\n if (j < MAXK) {\n out_vals[base + j] = vals[j];\n out_idx[base + j] = (long long)idxs[j];\n } else {\n out_vals[base + j] = -CUDART_INF_F;\n out_idx[base + j] = -1LL;\n }\n }\n}\n\nstd::vector<torch::Tensor> csr_topk_forward(torch::Tensor row_ptr, torch::Tensor edge_scores, int64_t k64) {\n const auto n = (int)(row_ptr.numel() - 1);\n auto vals = torch::empty({n, k64}, edge_scores.options());\n auto idx = torch::empty({n, k64}, row_ptr.options().dtype(torch::kInt64));\n if (n == 0 || k64 <= 0) return {vals, idx};\n\n const at::cuda::OptionalCUDAGuard device_guard(device_of(edge_scores));\n int threads = 256;\n int blocks = (n + threads - 1) / threads;\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n\n if (k64 == 4) {\n csr_topk4_kernel<<<blocks, threads, 0, stream>>>(\n row_ptr.data_ptr<int>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(),\n reinterpret_cast<long long*>(idx.data_ptr<int64_t>()), n);\n } else {\n int k = (int)k64;\n csr_topk_generic_kernel<64><<<blocks, threads, 0, stream>>>(\n row_ptr.data_ptr<int>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(),\n reinterpret_cast<long long*>(idx.data_ptr<int64_t>()), n, k);\n }\n return {vals, idx};\n}\n\"\"\"\n\n_ext = load_inline(\n name=\"csr_row_topk_ext_v1\",\n cpp_sources=_cpp_src,\n cuda_sources=_cuda_src,\n functions=[\"csr_topk_forward\"],\n extra_cflags=[\"-O3\"],\n extra_cuda_cflags=[\"-O3\", \"--use_fast_math\"],\n verbose=False,\n)\n\n\nclass ModelNew(nn.Module):\n def __init__(self, k):\n super().__init__()\n self.k = k\n\n def forward(self, row_ptr: torch.Tensor, edge_scores: torch.Tensor):\n vals, idx = _ext.csr_topk_forward(row_ptr, edge_scores, int(self.k))\n return vals, idx\n" }
result ← submit_kernel (fail)
failsubmit_kernel submit_kernel FAILED: kernel did not compile. Error building extension 'csr_row_topk_ext_v1': [1/3] /opt/conda/bin/x86_64-conda-linux-gnu-c++ -MMD -MF main.o.d -DTORCH_EXTENSION_NAME=csr_row_topk_ext_v1 -DTORCH_API_INCLUDE_EXTENSION_H -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include/torch/csrc/api/include -isystem /usr/local/cuda/include -isystem /opt/conda/include/python3.10 -fPIC -std=c++17 -O3 -c /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/main.cpp -o main.o [2/3] /usr/local/cuda/bin/nvcc -MD -MF cuda.cuda.o.d -ccbin /opt/conda/bin/x86_64-conda-linux-gnu-cc -DTORCH_EXTENSION_NAME=csr_row_topk_ext_v1 -DTORCH_API_INCLUDE_EXTENSION_H -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include/torch/csrc/api/include -isystem /usr/local/cuda/include -isystem /opt/conda/include/python3.10 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr -gencode=arch=compute_90,code=compute_90 -gencode=arch=compute_90,code=sm_90 --compiler-options '-fPIC' -O3 --use_fast_math -std=c++17 -c /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu -o cuda.cuda.o FAILED: [code=2] cuda.cuda.o /usr/local/cuda/bin/nvcc -MD -MF cuda.cuda.o.d -ccbin /opt/conda/bin/x86_64-conda-linux-gnu-cc -DTORCH_EXTENSION_NAME=csr_row_topk_ext_v1 -DTORCH_API_INCLUDE_EXTENSION_H -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include -isystem /scratch/abaner/KernelBench/.venv/lib/python3.10/site-packages/torch/include/torch/csrc/api/include -isystem /usr/local/cuda/include -isystem /opt/conda/include/python3.10 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr -gencode=arch=compute_90,code=compute_90 -gencode=arch=compute_90,code=sm_90 --compiler-options '-fPIC' -O3 --use_fast_math -std=c++17 -c /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu -o cuda.cuda.o nvcc warning : incompatible redefinition for option 'compiler-bindir', the last value of this option was used /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu(24): error: identifier "CUDART_INF_F" is undefined float v0 = -CUDART_INF_F, v1 = -CUDART_INF_F, v2 = -CUDART_INF_F, v3 = -CUDART_INF_F; ^ /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu(59): error: identifier "CUDART_INF_F" is undefined for (int j = 0; j < MAXK; ++j) { vals[j] = -CUDART_INF_F; idxs[j] = -1; } ^ /scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu(84): error: identifier "CUDART_INF_F" is undefined out_vals[base + j] = -CUDART_INF_F; ^ 3 errors detected in the compilation of "/scratch/abaner/KernelBench/runs/l123_single_gpt/popcorn/gpt-5.5-priority/level_1_problem_8_cache/k_4147b2b15146/csr_row_topk_ext_v1/cuda.cu". ninja: build stopped: subcommand failed.
final submitted kernel (143 lines, 4,757 chars) — full source, untruncated
import torch
import torch.nn as nn
from torch.utils.cpp_extension import load_inline


_cpp_src = r"""
#include <torch/extension.h>
#include <vector>

std::vector<torch::Tensor> csr_topk_forward(torch::Tensor row_ptr, torch::Tensor edge_scores, int64_t k);
"""

_cuda_src = r"""
#include <torch/extension.h>
#include <ATen/cuda/CUDAContext.h>
#include <c10/cuda/CUDAGuard.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <vector>
#include <limits>

__global__ void csr_topk4_kernel(const int* __restrict__ row_ptr,
                                 const float* __restrict__ scores,
                                 float* __restrict__ out_vals,
                                 long long* __restrict__ out_idx,
                                 int n) {
    int node = blockIdx.x * blockDim.x + threadIdx.x;
    if (node >= n) return;

    int start = row_ptr[node];
    int end   = row_ptr[node + 1];

    float v0 = -CUDART_INF_F, v1 = -CUDART_INF_F, v2 = -CUDART_INF_F, v3 = -CUDART_INF_F;
    int   i0 = -1,            i1 = -1,            i2 = -1,            i3 = -1;

    #pragma unroll 16
    for (int e = start; e < end; ++e) {
        float v = scores[e];
        if (v > v0) {
            v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = v0; i1 = i0; v0 = v; i0 = e;
        } else if (v > v1) {
            v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = v; i1 = e;
        } else if (v > v2) {
            v3 = v2; i3 = i2; v2 = v; i2 = e;
        } else if (v > v3) {
            v3 = v; i3 = e;
        }
    }

    int o = node * 4;
    out_vals[o + 0] = v0; out_vals[o + 1] = v1; out_vals[o + 2] = v2; out_vals[o + 3] = v3;
    out_idx [o + 0] = (long long)i0; out_idx [o + 1] = (long long)i1;
    out_idx [o + 2] = (long long)i2; out_idx [o + 3] = (long long)i3;
}

template<int MAXK>
__global__ void csr_topk_generic_kernel(const int* __restrict__ row_ptr,
                                        const float* __restrict__ scores,
                                        float* __restrict__ out_vals,
                                        long long* __restrict__ out_idx,
                                        int n, int k) {
    int node = blockIdx.x * blockDim.x + threadIdx.x;
    if (node >= n) return;

    float vals[MAXK];
    int idxs[MAXK];
    #pragma unroll
    for (int j = 0; j < MAXK; ++j) { vals[j] = -CUDART_INF_F; idxs[j] = -1; }

    int kk = k < MAXK ? k : MAXK;
    int start = row_ptr[node];
    int end   = row_ptr[node + 1];
    for (int e = start; e < end; ++e) {
        float v = scores[e];
        if (v > vals[kk - 1]) {
            int pos = kk - 1;
            while (pos > 0 && v > vals[pos - 1]) {
                vals[pos] = vals[pos - 1];
                idxs[pos] = idxs[pos - 1];
                --pos;
            }
            vals[pos] = v;
            idxs[pos] = e;
        }
    }

    int base = node * k;
    for (int j = 0; j < k; ++j) {
        if (j < MAXK) {
            out_vals[base + j] = vals[j];
            out_idx[base + j] = (long long)idxs[j];
        } else {
            out_vals[base + j] = -CUDART_INF_F;
            out_idx[base + j] = -1LL;
        }
    }
}

std::vector<torch::Tensor> csr_topk_forward(torch::Tensor row_ptr, torch::Tensor edge_scores, int64_t k64) {
    const auto n = (int)(row_ptr.numel() - 1);
    auto vals = torch::empty({n, k64}, edge_scores.options());
    auto idx = torch::empty({n, k64}, row_ptr.options().dtype(torch::kInt64));
    if (n == 0 || k64 <= 0) return {vals, idx};

    const at::cuda::OptionalCUDAGuard device_guard(device_of(edge_scores));
    int threads = 256;
    int blocks = (n + threads - 1) / threads;
    cudaStream_t stream = at::cuda::getCurrentCUDAStream();

    if (k64 == 4) {
        csr_topk4_kernel<<<blocks, threads, 0, stream>>>(
            row_ptr.data_ptr<int>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(),
            reinterpret_cast<long long*>(idx.data_ptr<int64_t>()), n);
    } else {
        int k = (int)k64;
        csr_topk_generic_kernel<64><<<blocks, threads, 0, stream>>>(
            row_ptr.data_ptr<int>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(),
            reinterpret_cast<long long*>(idx.data_ptr<int64_t>()), n, k);
    }
    return {vals, idx};
}
"""

_ext = load_inline(
    name="csr_row_topk_ext_v1",
    cpp_sources=_cpp_src,
    cuda_sources=_cuda_src,
    functions=["csr_topk_forward"],
    extra_cflags=["-O3"],
    extra_cuda_cflags=["-O3", "--use_fast_math"],
    verbose=False,
)


class ModelNew(nn.Module):
    def __init__(self, k):
        super().__init__()
        self.k = k

    def forward(self, row_ptr: torch.Tensor, edge_scores: torch.Tensor):
        vals, idx = _ext.csr_topk_forward(row_ptr, edge_scores, int(self.k))
        return vals, idx