call → compile_kernel
callcompile_kernel
{
"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\ntorch::Tensor conv_transpose3d_forward_cuda(torch::Tensor x, torch::Tensor weight);\n\ntorch::Tensor conv_transpose3d_forward(torch::Tensor x, torch::Tensor weight) {\n return conv_transpose3d_forward_cuda(x, weight);\n}\n'''\n\n_cuda_src = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <c10/cuda/CUDAGuard.h>\n\n#define CI 48\n#define CO 24\n#define DI 96\n#define HI 96\n#define WI 96\n#define K 3\n#define DO 98\n#define HO 98\n#define WO 98\n\n__global__ __launch_bounds__(256, 2)\nvoid deconv3d_k3_kernel(const float* __restrict__ x,\n const float* __restrict__ w,\n float* __restrict__ y,\n int total) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n if (idx >= total) return;\n\n int t = idx;\n const int ow = t % WO; t /= WO;\n const int oh = t % HO; t /= HO;\n const int od = t % DO; t /= DO;\n const int oc = t % CO; t /= CO;\n const int n = t;\n\n float sum = 0.0f;\n const int n_base = n * CI * DI * HI * WI;\n\n if ((unsigned)(od - 2) < 94u && (unsigned)(oh - 2) < 94u && (unsigned)(ow - 2) < 94u) {\n // Full 3x3x3 overlap. iz/iy/ix are od/oh/ow minus kernel index.\n #pragma unroll 48\n for (int ic = 0; ic < CI; ++ic) {\n const float* __restrict__ xp = x + n_base + ic * (DI*HI*WI);\n const float* __restrict__ wp = w + (ic * CO + oc) * 27;\n int z0 = (od) * (HI*WI);\n int z1 = (od - 1) * (HI*WI);\n int z2 = (od - 2) * (HI*WI);\n int y0 = (oh) * WI;\n int y1 = (oh - 1) * WI;\n int y2 = (oh - 2) * WI;\n int x0 = ow;\n int x1 = ow - 1;\n int x2 = ow - 2;\n sum = fmaf(xp[z0 + y0 + x0], wp[0], sum);\n sum = fmaf(xp[z0 + y0 + x1], wp[1], sum);\n sum = fmaf(xp[z0 + y0 + x2], wp[2], sum);\n sum = fmaf(xp[z0 + y1 + x0], wp[3], sum);\n sum = fmaf(xp[z0 + y1 + x1], wp[4], sum);\n sum = fmaf(xp[z0 + y1 + x2], wp[5], sum);\n sum = fmaf(xp[z0 + y2 + x0], wp[6], sum);\n sum = fmaf(xp[z0 + y2 + x1], wp[7], sum);\n sum = fmaf(xp[z0 + y2 + x2], wp[8], sum);\n sum = fmaf(xp[z1 + y0 + x0], wp[9], sum);\n sum = fmaf(xp[z1 + y0 + x1], wp[10], sum);\n sum = fmaf(xp[z1 + y0 + x2], wp[11], sum);\n sum = fmaf(xp[z1 + y1 + x0], wp[12], sum);\n sum = fmaf(xp[z1 + y1 + x1], wp[13], sum);\n sum = fmaf(xp[z1 + y1 + x2], wp[14], sum);\n sum = fmaf(xp[z1 + y2 + x0], wp[15], sum);\n sum = fmaf(xp[z1 + y2 + x1], wp[16], sum);\n sum = fmaf(xp[z1 + y2 + x2], wp[17], sum);\n sum = fmaf(xp[z2 + y0 + x0], wp[18], sum);\n sum = fmaf(xp[z2 + y0 + x1], wp[19], sum);\n sum = fmaf(xp[z2 + y0 + x2], wp[20], sum);\n sum = fmaf(xp[z2 + y1 + x0], wp[21], sum);\n sum = fmaf(xp[z2 + y1 + x1], wp[22], sum);\n sum = fmaf(xp[z2 + y1 + x2], wp[23], sum);\n sum = fmaf(xp[z2 + y2 + x0], wp[24], sum);\n sum = fmaf(xp[z2 + y2 + x1], wp[25], sum);\n sum = fmaf(xp[z2 + y2 + x2], wp[26], sum);\n }\n } else {\n int kd0 = od - (DI - 1); if (kd0 < 0) kd0 = 0;\n int kd1 = od; if (kd1 > 2) kd1 = 2;\n int kh0 = oh - (HI - 1); if (kh0 < 0) kh0 = 0;\n int kh1 = oh; if (kh1 > 2) kh1 = 2;\n int kw0 = ow - (WI - 1); if (kw0 < 0) kw0 = 0;\n int kw1 = ow; if (kw1 > 2) kw1 = 2;\n for (int ic = 0; ic < CI; ++ic) {\n const float* __restrict__ xp = x + n_base + ic * (DI*HI*WI);\n const float* __restrict__ wp = w + (ic * CO + oc) * 27;\n for (int kd = kd0; kd <= kd1; ++kd) {\n int izbase = (od - kd) * (HI*WI);\n for (int kh = kh0; kh <= kh1; ++kh) {\n int iybase = (oh - kh) * WI;\n for (int kw = kw0; kw <= kw1; ++kw) {\n sum = fmaf(xp[izbase + iybase + (ow - kw)], wp[(kd*3 + kh)*3 + kw], sum);\n }\n }\n }\n }\n }\n y[idx] = sum;\n}\n\ntorch::Tensor conv_transpose3d_forward_cuda(torch::Tensor x, torch::Tensor weight) {\n const at::cuda::OptionalCUDAGuard device_guard(device_of(x));\n auto y = torch::empty({x.size(0), (long)CO, (long)DO, (long)HO, (long)WO}, x.options());\n int total = (int)(x.size(0) * CO * DO * HO * WO);\n const int threads = 256;\n const int blocks = (total + threads - 1) / threads;\n deconv3d_k3_kernel<<<blocks, threads, 0, at::cuda::getCurrentCUDAStream()>>>(\n x.data_ptr<float>(), weight.data_ptr<float>(), y.data_ptr<float>(), total);\n return y;\n}\n'''\n\n_ext = load_inline(name='deconv3d_k3_ext_v1', cpp_sources=[_cpp_src], cuda_sources=[_cuda_src], functions=['conv_transpose3d_forward'], verbose=False, extra_cuda_cflags=['-O3', '--use_fast_math'], extra_cflags=['-O3'])\n\nclass ModelNew(nn.Module):\n def __init__(self, in_channels: int, out_channels: int, kernel_size: int, stride: int = 1, padding: int = 0, output_padding: int = 0, dilation: int = 1, groups: int = 1, bias: bool = False):\n super(ModelNew, self).__init__()\n self.conv_transpose3d = nn.ConvTranspose3d(in_channels, out_channels, (kernel_size, kernel_size, kernel_size), stride=stride, padding=padding, output_padding=output_padding, dilation=dilation, groups=groups, bias=bias)\n def forward(self, x: torch.Tensor) -> torch.Tensor:\n return _ext.conv_transpose3d_forward(x.contiguous(), self.conv_transpose3d.weight.contiguous())\n"
}