call → submit_kernel
callsubmit_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cpp_src = r\"\"\"\ntorch::Tensor conv1_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias);\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\n#define H_IN 224\n#define W_IN 224\n#define C_IN 3\n#define C_OUT 96\n#define K 11\n#define STRIDE 4\n#define PAD 2\n#define H_OUT 55\n#define W_OUT 55\n#define HW_OUT 3025\n#define OC_TILE 16\n#define OC_GROUPS 6\n#define W_OC_STRIDE 363\n\n__device__ __forceinline__ void accum16(float xv, const float* __restrict__ wp,\n float &a0, float &a1, float &a2, float &a3,\n float &a4, float &a5, float &a6, float &a7,\n float &a8, float &a9, float &a10, float &a11,\n float &a12, float &a13, float &a14, float &a15) {\n a0 = fmaf(xv, wp[0 * W_OC_STRIDE], a0);\n a1 = fmaf(xv, wp[1 * W_OC_STRIDE], a1);\n a2 = fmaf(xv, wp[2 * W_OC_STRIDE], a2);\n a3 = fmaf(xv, wp[3 * W_OC_STRIDE], a3);\n a4 = fmaf(xv, wp[4 * W_OC_STRIDE], a4);\n a5 = fmaf(xv, wp[5 * W_OC_STRIDE], a5);\n a6 = fmaf(xv, wp[6 * W_OC_STRIDE], a6);\n a7 = fmaf(xv, wp[7 * W_OC_STRIDE], a7);\n a8 = fmaf(xv, wp[8 * W_OC_STRIDE], a8);\n a9 = fmaf(xv, wp[9 * W_OC_STRIDE], a9);\n a10 = fmaf(xv, wp[10 * W_OC_STRIDE], a10);\n a11 = fmaf(xv, wp[11 * W_OC_STRIDE], a11);\n a12 = fmaf(xv, wp[12 * W_OC_STRIDE], a12);\n a13 = fmaf(xv, wp[13 * W_OC_STRIDE], a13);\n a14 = fmaf(xv, wp[14 * W_OC_STRIDE], a14);\n a15 = fmaf(xv, wp[15 * W_OC_STRIDE], a15);\n}\n\n__global__ __launch_bounds__(256, 2)\nvoid conv1_kernel(const float* __restrict__ x,\n const float* __restrict__ w,\n const float* __restrict__ b,\n float* __restrict__ y,\n int N) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n int total = N * OC_GROUPS * HW_OUT;\n if (idx >= total) return;\n\n int spatial = idx % HW_OUT;\n int t = idx / HW_OUT;\n int g = t % OC_GROUPS;\n int n = t / OC_GROUPS;\n\n int oh = spatial / W_OUT;\n int ow = spatial - oh * W_OUT;\n int ih0 = oh * STRIDE - PAD;\n int iw0 = ow * STRIDE - PAD;\n int oc = g * OC_TILE;\n\n float a0 = b[oc + 0];\n float a1 = b[oc + 1];\n float a2 = b[oc + 2];\n float a3 = b[oc + 3];\n float a4 = b[oc + 4];\n float a5 = b[oc + 5];\n float a6 = b[oc + 6];\n float a7 = b[oc + 7];\n float a8 = b[oc + 8];\n float a9 = b[oc + 9];\n float a10 = b[oc + 10];\n float a11 = b[oc + 11];\n float a12 = b[oc + 12];\n float a13 = b[oc + 13];\n float a14 = b[oc + 14];\n float a15 = b[oc + 15];\n\n const float* xbase = x + n * C_IN * H_IN * W_IN;\n const float* wbase0 = w + oc * W_OC_STRIDE;\n\n if (oh > 0 && oh < 54 && ow > 0 && ow < 54) {\n #pragma unroll\n for (int c = 0; c < C_IN; ++c) {\n const float* xc = xbase + c * H_IN * W_IN + ih0 * W_IN + iw0;\n const float* wc = wbase0 + c * K * K;\n #pragma unroll\n for (int kh = 0; kh < K; ++kh) {\n const float* xr = xc + kh * W_IN;\n const float* wr = wc + kh * K;\n #pragma unroll\n for (int kw = 0; kw < K; ++kw) {\n float xv = xr[kw];\n const float* wp = wr + kw;\n accum16(xv, wp, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);\n }\n }\n }\n } else {\n int khs = ih0 < 0 ? -ih0 : 0;\n int khe = (H_IN - ih0) < K ? (H_IN - ih0) : K;\n int kws = iw0 < 0 ? -iw0 : 0;\n int kwe = (W_IN - iw0) < K ? (W_IN - iw0) : K;\n #pragma unroll\n for (int c = 0; c < C_IN; ++c) {\n const float* xc = xbase + c * H_IN * W_IN + ih0 * W_IN + iw0;\n const float* wc = wbase0 + c * K * K;\n for (int kh = khs; kh < khe; ++kh) {\n const float* xr = xc + kh * W_IN;\n const float* wr = wc + kh * K;\n for (int kw = kws; kw < kwe; ++kw) {\n float xv = xr[kw];\n const float* wp = wr + kw;\n accum16(xv, wp, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15);\n }\n }\n }\n }\n\n float* out = y + (n * C_OUT + oc) * HW_OUT + spatial;\n out[0 * HW_OUT] = a0;\n out[1 * HW_OUT] = a1;\n out[2 * HW_OUT] = a2;\n out[3 * HW_OUT] = a3;\n out[4 * HW_OUT] = a4;\n out[5 * HW_OUT] = a5;\n out[6 * HW_OUT] = a6;\n out[7 * HW_OUT] = a7;\n out[8 * HW_OUT] = a8;\n out[9 * HW_OUT] = a9;\n out[10 * HW_OUT] = a10;\n out[11 * HW_OUT] = a11;\n out[12 * HW_OUT] = a12;\n out[13 * HW_OUT] = a13;\n out[14 * HW_OUT] = a14;\n out[15 * HW_OUT] = a15;\n}\n\ntorch::Tensor conv1_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias) {\n const int64_t N64 = x.size(0);\n auto y = torch::empty({N64, C_OUT, H_OUT, W_OUT}, x.options());\n int N = (int)N64;\n int total = N * OC_GROUPS * HW_OUT;\n const int threads = 256;\n const int blocks = (total + threads - 1) / threads;\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n conv1_kernel<<<blocks, threads, 0, stream>>>(\n x.data_ptr<float>(), weight.data_ptr<float>(), bias.data_ptr<float>(), y.data_ptr<float>(), N);\n return y;\n}\n\"\"\"\n\n_ext = load_inline(\n name=\"alexnet_conv1_direct_ext_v1\",\n cpp_sources=_cpp_src,\n cuda_sources=_cuda_src,\n functions=[\"conv1_forward\"],\n extra_cflags=[\"-O3\"],\n extra_cuda_cflags=[\"-O3\", \"--use_fast_math\"],\n verbose=False,\n)\n\nclass ModelNew(nn.Module):\n def __init__(self, num_classes=1000):\n super(ModelNew, self).__init__()\n self.conv1 = nn.Conv2d(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=2)\n\n def forward(self, x):\n return _ext.conv1_forward(x, self.conv1.weight, self.conv1.bias)\n"
}