call → static_check
callstatic_check
{
"kernel_code": "import os\n_tmpdir = os.path.join(os.getcwd(), 'tmp_nvcc_csr')\nos.makedirs(_tmpdir, exist_ok=True)\nos.environ['TMPDIR'] = _tmpdir\nos.environ.setdefault('MAX_JOBS', '1')\n\nimport 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\ntorch::Tensor csr_forward_cuda(torch::Tensor row_ptr, torch::Tensor col_idx, torch::Tensor edge_weight, torch::Tensor node_feat);\n\ntorch::Tensor csr_forward(torch::Tensor row_ptr, torch::Tensor col_idx, torch::Tensor edge_weight, torch::Tensor node_feat) {\n return csr_forward_cuda(row_ptr, col_idx, edge_weight, node_feat);\n}\n'''\n\n_cuda_src = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n\ntemplate <typename row_t, typename col_t>\n__global__ __launch_bounds__(96, 8) void csr96_kernel_t(\n const row_t* __restrict__ row_ptr,\n const col_t* __restrict__ col_idx,\n const float* __restrict__ edge_weight,\n const float* __restrict__ node_feat,\n float* __restrict__ out) {\n const int dst = blockIdx.x;\n const int f = threadIdx.x;\n const int start = (int)row_ptr[dst];\n const int end = (int)row_ptr[dst + 1];\n float acc = 0.0f;\n int e = start;\n for (; e + 3 < end; e += 4) {\n int s0 = (int)col_idx[e];\n float w0 = edge_weight[e];\n acc = fmaf(node_feat[s0 * 96 + f], w0, acc);\n int s1 = (int)col_idx[e + 1];\n float w1 = edge_weight[e + 1];\n acc = fmaf(node_feat[s1 * 96 + f], w1, acc);\n int s2 = (int)col_idx[e + 2];\n float w2 = edge_weight[e + 2];\n acc = fmaf(node_feat[s2 * 96 + f], w2, acc);\n int s3 = (int)col_idx[e + 3];\n float w3 = edge_weight[e + 3];\n acc = fmaf(node_feat[s3 * 96 + f], w3, acc);\n }\n for (; e < end; ++e) {\n int src = (int)col_idx[e];\n float w = edge_weight[e];\n acc = fmaf(node_feat[src * 96 + f], w, acc);\n }\n out[dst * 96 + f] = acc;\n}\n\ntemplate <typename row_t, typename col_t>\nstatic inline void launch_csr(torch::Tensor row_ptr, torch::Tensor col_idx, torch::Tensor edge_weight,\n torch::Tensor node_feat, torch::Tensor out, int num_nodes, cudaStream_t stream) {\n csr96_kernel_t<row_t, col_t><<<num_nodes, 96, 0, stream>>>(\n row_ptr.data_ptr<row_t>(), col_idx.data_ptr<col_t>(), edge_weight.data_ptr<float>(),\n node_feat.data_ptr<float>(), out.data_ptr<float>());\n}\n\ntorch::Tensor csr_forward_cuda(torch::Tensor row_ptr, torch::Tensor col_idx, torch::Tensor edge_weight, torch::Tensor node_feat) {\n const int num_nodes = row_ptr.numel() - 1;\n const int feat_dim = node_feat.size(1);\n auto out = torch::empty({num_nodes, feat_dim}, node_feat.options());\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n\n if (row_ptr.scalar_type() == at::kInt && col_idx.scalar_type() == at::kInt) {\n launch_csr<int,int>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kFloat && col_idx.scalar_type() == at::kFloat) {\n launch_csr<float,float>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kLong && col_idx.scalar_type() == at::kLong) {\n launch_csr<long,long>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kInt && col_idx.scalar_type() == at::kFloat) {\n launch_csr<int,float>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kFloat && col_idx.scalar_type() == at::kInt) {\n launch_csr<float,int>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kInt && col_idx.scalar_type() == at::kLong) {\n launch_csr<int,long>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else if (row_ptr.scalar_type() == at::kLong && col_idx.scalar_type() == at::kInt) {\n launch_csr<long,int>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n } else {\n launch_csr<float,float>(row_ptr, col_idx, edge_weight, node_feat, out, num_nodes, stream);\n }\n return out;\n}\n'''\n\n_ext = load_inline(\n name='csr_mp_ext_submit_v1',\n cpp_sources=[_cpp_src],\n cuda_sources=[_cuda_src],\n functions=['csr_forward'],\n extra_cuda_cflags=['-O3'],\n extra_cflags=['-O3'],\n verbose=False,\n)\n\nclass ModelNew(nn.Module):\n def __init__(self):\n super().__init__()\n\n def forward(self, row_ptr: torch.Tensor, col_idx: torch.Tensor, edge_weight: torch.Tensor, node_feat: torch.Tensor) -> torch.Tensor:\n return _ext.csr_forward(row_ptr, col_idx, edge_weight, node_feat)\n"
}