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>\ntorch::Tensor convt3d_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias, bool has_bias,\n int64_t sD, int64_t sH, int64_t sW,\n int64_t pD, int64_t pH, int64_t pW,\n int64_t opD, int64_t opH, int64_t opW);\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__global__ void convt3d_direct_kernel(const float* __restrict__ x,\n const float* __restrict__ w,\n const float* __restrict__ b,\n float* __restrict__ y,\n long total,\n int N, int Cin, int Din, int Hin, int Win,\n int Cout, int kD, int kH, int kW,\n int sD, int sH, int sW,\n int pD, int pH, int pW,\n int Dout, int Hout, int Wout,\n int has_bias) {\n long idx = blockIdx.x * (long)blockDim.x + threadIdx.x;\n long stride0 = (long)blockDim.x * gridDim.x;\n for (; idx < total; idx += stride0) {\n long t = idx;\n int ow = t % Wout; t /= Wout;\n int oh = t % Hout; t /= Hout;\n int od = t % Dout; t /= Dout;\n int co = t % Cout; t /= Cout;\n int n = (int)t;\n float acc = has_bias ? __ldg(b + co) : 0.0f;\n for (int ci = 0; ci < Cin; ++ci) {\n for (int kd = 0; kd < kD; ++kd) {\n int td = od + pD - kd;\n if (td < 0 || td % sD != 0) continue;\n int id = td / sD;\n if ((unsigned)id >= (unsigned)Din) continue;\n for (int kh = 0; kh < kH; ++kh) {\n int th = oh + pH - kh;\n if (th < 0 || th % sH != 0) continue;\n int ih = th / sH;\n if ((unsigned)ih >= (unsigned)Hin) continue;\n for (int kw = 0; kw < kW; ++kw) {\n int tw = ow + pW - kw;\n if (tw < 0 || tw % sW != 0) continue;\n int iw = tw / sW;\n if ((unsigned)iw >= (unsigned)Win) continue;\n long xoff = (((long)n * Cin + ci) * Din + id) * Hin * Win + (long)ih * Win + iw;\n long woff = (((long)ci * Cout + co) * kD + kd) * kH * kW + (long)kh * kW + kw;\n acc = fmaf(__ldg(x + xoff), __ldg(w + woff), acc);\n }\n }\n }\n }\n y[idx] = acc;\n }\n}\n\ntorch::Tensor convt3d_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias, bool has_bias,\n int64_t sD, int64_t sH, int64_t sW,\n int64_t pD, int64_t pH, int64_t pW,\n int64_t opD, int64_t opH, int64_t opW) {\n int N = x.size(0), Cin = x.size(1), Din = x.size(2), Hin = x.size(3), Win = x.size(4);\n int Cout = weight.size(1), kD = weight.size(2), kH = weight.size(3), kW = weight.size(4);\n int Dout = (Din - 1) * (int)sD - 2*(int)pD + kD + (int)opD;\n int Hout = (Hin - 1) * (int)sH - 2*(int)pH + kH + (int)opH;\n int Wout = (Win - 1) * (int)sW - 2*(int)pW + kW + (int)opW;\n auto y = torch::empty({N, Cout, Dout, Hout, Wout}, x.options());\n long total = y.numel();\n int threads = 256;\n int blocks = (int)min((long)131072, (total + threads - 1) / threads);\n convt3d_direct_kernel<<<blocks, threads, 0, at::cuda::getCurrentCUDAStream()>>>(\n x.data_ptr<float>(), weight.data_ptr<float>(), has_bias ? bias.data_ptr<float>() : nullptr, y.data_ptr<float>(), total,\n N, Cin, Din, Hin, Win, Cout, kD, kH, kW, (int)sD, (int)sH, (int)sW, (int)pD, (int)pH, (int)pW,\n Dout, Hout, Wout, has_bias ? 1 : 0);\n return y;\n}\n'''\n\n_ext = load_inline(name='convt3d_ext_v2', cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=['convt3d_forward'], verbose=False, extra_cuda_cflags=['-O3'])\n\nclass ModelNew(nn.Module):\n def __init__(self, in_channels: int, out_channels: int, kernel_size: tuple, stride: tuple = (1, 1, 1), padding: tuple = (0, 0, 0), output_padding: tuple = (0, 0, 0), groups: int = 1, bias: bool = False):\n super().__init__()\n self.conv_transpose3d = nn.ConvTranspose3d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, output_padding=output_padding, groups=groups, bias=bias)\n self.stride = stride; self.padding = padding; self.output_padding = output_padding; self.groups = groups\n def forward(self, x: torch.Tensor) -> torch.Tensor:\n b = self.conv_transpose3d.bias\n if b is None:\n b = self.conv_transpose3d.weight # dummy, not read\n has_bias = False\n else:\n has_bias = True\n return _ext.convt3d_forward(x.contiguous(), self.conv_transpose3d.weight.contiguous(), b, has_bias,\n self.stride[0], self.stride[1], self.stride[2],\n self.padding[0], self.padding[1], self.padding[2],\n self.output_padding[0], self.output_padding[1], self.output_padding[2])\n"
}