call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cpp_src = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda_runtime.h>\n#include <vector>\n#include <cstdint>\n\nvoid csr_topk4_launcher_i32(const int* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream);\nvoid csr_topk4_launcher_i64(const int64_t* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream);\nvoid csr_topk4_launcher_f32(const float* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream);\n\nstd::vector<torch::Tensor> csr_topk_forward(torch::Tensor row_ptr, torch::Tensor edge_scores, int64_t k) {\n const int64_t num_nodes64 = row_ptr.numel() - 1;\n auto vals = torch::empty({num_nodes64, k}, edge_scores.options());\n auto idx = torch::empty({num_nodes64, k}, edge_scores.options().dtype(torch::kInt64));\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n auto st = row_ptr.scalar_type();\n if (st == torch::kInt32) {\n csr_topk4_launcher_i32(row_ptr.data_ptr<int>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(), idx.data_ptr<int64_t>(), (int)num_nodes64, (int)k, stream);\n } else if (st == torch::kInt64) {\n csr_topk4_launcher_i64(row_ptr.data_ptr<int64_t>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(), idx.data_ptr<int64_t>(), (int)num_nodes64, (int)k, stream);\n } else {\n csr_topk4_launcher_f32(row_ptr.data_ptr<float>(), edge_scores.data_ptr<float>(), vals.data_ptr<float>(), idx.data_ptr<int64_t>(), (int)num_nodes64, (int)k, stream);\n }\n return {vals, idx};\n}\n'''\n\n_cuda_src = r'''\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <cstdint>\n\ntemplate <typename T>\n__global__ void csr_topk4_kernel(const T* __restrict__ row_ptr,\n const float* __restrict__ scores,\n float* __restrict__ vals,\n int64_t* __restrict__ out_idx,\n int num_nodes, int k) {\n int node = blockIdx.x * blockDim.x + threadIdx.x;\n if (node >= num_nodes) return;\n int start = (int)row_ptr[node];\n int end = (int)row_ptr[node + 1];\n float ninf = -INFINITY;\n float v0 = ninf, v1 = ninf, v2 = ninf, v3 = ninf;\n int i0 = -1, i1 = -1, i2 = -1, i3 = -1;\n for (int e = start; e < end; ++e) {\n float x = scores[e];\n if (x > v0) {\n v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = v0; i1 = i0; v0 = x; i0 = e;\n } else if (x > v1) {\n v3 = v2; i3 = i2; v2 = v1; i2 = i1; v1 = x; i1 = e;\n } else if (x > v2) {\n v3 = v2; i3 = i2; v2 = x; i2 = e;\n } else if (x > v3) {\n v3 = x; i3 = e;\n }\n }\n int base = node * k;\n if (k == 4) {\n vals[base] = v0; vals[base + 1] = v1; vals[base + 2] = v2; vals[base + 3] = v3;\n out_idx[base] = (int64_t)i0; out_idx[base + 1] = (int64_t)i1; out_idx[base + 2] = (int64_t)i2; out_idx[base + 3] = (int64_t)i3;\n } else {\n if (k > 0) { vals[base] = v0; out_idx[base] = (int64_t)i0; }\n if (k > 1) { vals[base + 1] = v1; out_idx[base + 1] = (int64_t)i1; }\n if (k > 2) { vals[base + 2] = v2; out_idx[base + 2] = (int64_t)i2; }\n if (k > 3) { vals[base + 3] = v3; out_idx[base + 3] = (int64_t)i3; }\n for (int j = 4; j < k; ++j) { vals[base + j] = ninf; out_idx[base + j] = (int64_t)-1; }\n }\n}\n\ntemplate <typename T>\nstatic inline void launch(const T* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream) {\n csr_topk4_kernel<T><<<3, 128, 0, stream>>>(row_ptr, scores, vals, idx, num_nodes, k);\n}\nvoid csr_topk4_launcher_i32(const int* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream) { launch<int>(row_ptr, scores, vals, idx, num_nodes, k, stream); }\nvoid csr_topk4_launcher_i64(const int64_t* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream) { launch<int64_t>(row_ptr, scores, vals, idx, num_nodes, k, stream); }\nvoid csr_topk4_launcher_f32(const float* row_ptr, const float* scores, float* vals, int64_t* idx, int num_nodes, int k, cudaStream_t stream) { launch<float>(row_ptr, scores, vals, idx, num_nodes, k, stream); }\n'''\n\n_ext = load_inline(\n name='csr_topk4_ext_v4',\n cpp_sources=_cpp_src,\n cuda_sources=_cuda_src,\n functions=['csr_topk_forward'],\n extra_cflags=['-O3'],\n extra_cuda_cflags=['-O3'],\n verbose=False,\n)\n\nclass ModelNew(nn.Module):\n def __init__(self, k):\n super().__init__()\n self.k = int(k)\n\n def forward(self, row_ptr: torch.Tensor, edge_scores: torch.Tensor):\n return _ext.csr_topk_forward(row_ptr, edge_scores, self.k)\n"
}