call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.cpp_extension import load_inline\n\ncpp_src = r'''\n#include <torch/extension.h>\ntorch::Tensor relu_maxpool3x3s2_cl(torch::Tensor x);\ntorch::Tensor relu_maxpool3x3s2_cl_to_nchw(torch::Tensor x);\ntorch::Tensor relu_inplace(torch::Tensor x);\n'''\n\ncuda_src = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n\n__global__ void relu_kernel(float* __restrict__ x, int64_t n) {\n int64_t idx = blockIdx.x * (int64_t)blockDim.x + threadIdx.x;\n int64_t stride = (int64_t)blockDim.x * gridDim.x;\n for (; idx < n; idx += stride) {\n float v = x[idx];\n x[idx] = v > 0.f ? v : 0.f;\n }\n}\n\n__global__ void relu_maxpool3x3s2_cl_kernel(const float* __restrict__ x, float* __restrict__ y,\n int total, int C, int H, int W, int Ho, int Wo) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n int stride = blockDim.x * gridDim.x;\n for (; idx < total; idx += stride) {\n int c = idx % C;\n int t = idx / C;\n int ow = t % Wo;\n t /= Wo;\n int oh = t % Ho;\n int n = t / Ho;\n int base = ((n * H + oh * 2) * W + ow * 2) * C + c;\n float m = 0.0f;\n float v;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n base += W*C;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n base += W*C;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n y[idx] = m > 0.f ? m : 0.f;\n }\n}\n\n__global__ void relu_maxpool3x3s2_cl_to_nchw_kernel(const float* __restrict__ x, float* __restrict__ y,\n int total, int C, int H, int W, int Ho, int Wo) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n int stride = blockDim.x * gridDim.x;\n for (; idx < total; idx += stride) {\n int ow = idx % Wo;\n int t = idx / Wo;\n int oh = t % Ho;\n t /= Ho;\n int c = t % C;\n int n = t / C;\n int base = ((n * H + oh * 2) * W + ow * 2) * C + c;\n float m = 0.0f;\n float v;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n base += W*C;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n base += W*C;\n v = x[base]; m = fmaxf(m, v);\n v = x[base + C]; m = fmaxf(m, v);\n v = x[base + 2*C]; m = fmaxf(m, v);\n y[idx] = m > 0.f ? m : 0.f;\n }\n}\n\ntorch::Tensor relu_maxpool3x3s2_cl(torch::Tensor x) {\n int N = (int)x.size(0), C = (int)x.size(1), H = (int)x.size(2), W = (int)x.size(3);\n int Ho = (H - 3) / 2 + 1, Wo = (W - 3) / 2 + 1;\n auto y = torch::empty_strided({N, C, Ho, Wo}, {C*Ho*Wo, 1, C*Wo, C}, x.options());\n int total = N*C*Ho*Wo;\n const int threads = 256;\n int blocks = (total + threads - 1) / threads; if (blocks > 65535) blocks = 65535;\n relu_maxpool3x3s2_cl_kernel<<<blocks, threads, 0, at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(), y.data_ptr<float>(), total, C, H, W, Ho, Wo);\n return y;\n}\n\ntorch::Tensor relu_maxpool3x3s2_cl_to_nchw(torch::Tensor x) {\n int N = (int)x.size(0), C = (int)x.size(1), H = (int)x.size(2), W = (int)x.size(3);\n int Ho = (H - 3) / 2 + 1, Wo = (W - 3) / 2 + 1;\n auto y = torch::empty({N, C, Ho, Wo}, x.options());\n int total = N*C*Ho*Wo;\n const int threads = 256;\n int blocks = (total + threads - 1) / threads; if (blocks > 65535) blocks = 65535;\n relu_maxpool3x3s2_cl_to_nchw_kernel<<<blocks, threads, 0, at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(), y.data_ptr<float>(), total, C, H, W, Ho, Wo);\n return y;\n}\n\ntorch::Tensor relu_inplace(torch::Tensor x) {\n int64_t n = x.numel();\n const int threads = 256;\n int blocks = (int)((n + threads - 1) / threads); if (blocks > 65535) blocks = 65535;\n relu_kernel<<<blocks, threads, 0, at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(), n);\n return x;\n}\n'''\n_ext = load_inline(name='alexnet_fused_ext_v3', cpp_sources=cpp_src, cuda_sources=cuda_src,\n functions=['relu_maxpool3x3s2_cl', 'relu_maxpool3x3s2_cl_to_nchw', 'relu_inplace'],\n verbose=False, extra_cuda_cflags=['-O3'], extra_cflags=['-O3'])\n\nclass ModelNew(nn.Module):\n def __init__(self, num_classes=1000):\n super(ModelNew, self).__init__()\n self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2)\n self.conv2 = nn.Conv2d(96, 256, kernel_size=5, padding=2)\n self.conv3 = nn.Conv2d(256, 384, kernel_size=3, padding=1)\n self.conv4 = nn.Conv2d(384, 384, kernel_size=3, padding=1)\n self.conv5 = nn.Conv2d(384, 256, kernel_size=3, padding=1)\n self.fc1 = nn.Linear(256 * 6 * 6, 4096)\n self.fc2 = nn.Linear(4096, 4096)\n self.fc3 = nn.Linear(4096, num_classes)\n for m in (self.conv1, self.conv2, self.conv3, self.conv4, self.conv5):\n m.weight.data = m.weight.data.contiguous(memory_format=torch.channels_last)\n def forward(self, x):\n x = x.contiguous(memory_format=torch.channels_last)\n x = F.conv2d(x, self.conv1.weight, self.conv1.bias, stride=4, padding=2)\n x = _ext.relu_maxpool3x3s2_cl(x)\n x = F.conv2d(x, self.conv2.weight, self.conv2.bias, padding=2)\n x = _ext.relu_maxpool3x3s2_cl(x)\n x = F.conv2d(x, self.conv3.weight, self.conv3.bias, padding=1)\n x = _ext.relu_inplace(x)\n x = F.conv2d(x, self.conv4.weight, self.conv4.bias, padding=1)\n x = _ext.relu_inplace(x)\n x = F.conv2d(x, self.conv5.weight, self.conv5.bias, padding=1)\n x = _ext.relu_maxpool3x3s2_cl_to_nchw(x)\n x = torch.flatten(x, 1)\n x = F.linear(x, self.fc1.weight, self.fc1.bias)\n x = _ext.relu_inplace(x)\n x = F.linear(x, self.fc2.weight, self.fc2.bias)\n x = _ext.relu_inplace(x)\n x = F.linear(x, self.fc3.weight, self.fc3.bias)\n return x\n"
}