compile_fail
8_SegmentTopKCSR.py
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 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