call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp_src=r'''\n#include <torch/extension.h>\ntorch::Tensor conv_transpose2d_forward(torch::Tensor x, torch::Tensor w, int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t);\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#define IC 64\n#define OC 128\n#define IH 128\n#define IW 256\n#define OH 130\n#define OW 260\n#define PLANE (OH*OW)\n__global__ void interior8(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y){\n int mi=blockIdx.x*blockDim.x+threadIdx.x; int ocb=blockIdx.y*8; int total=64*126*252; if(mi>=total) return;\n int col=mi%252; int tmp=mi/252; int row=tmp%126; int n=tmp/126; int oh=row+2; int ow=col+4;\n float a0=0.f,a1=0.f,a2=0.f,a3=0.f,a4=0.f,a5=0.f,a6=0.f,a7=0.f;\n #pragma unroll\n for(int ic=0;ic<IC;++ic){\n const float* xb=x+((n*IC+ic)*IH)*IW;\n const float* wb=w+(ic*OC+ocb)*15;\n #pragma unroll\n for(int kh=0;kh<3;++kh){ int ii=(oh-kh)*IW + ow;\n #pragma unroll\n for(int kw=0;kw<5;++kw){ float xv=xb[ii-kw]; int kk=kh*5+kw;\n a0=fmaf(xv,wb[0*15+kk],a0); a1=fmaf(xv,wb[1*15+kk],a1); a2=fmaf(xv,wb[2*15+kk],a2); a3=fmaf(xv,wb[3*15+kk],a3);\n a4=fmaf(xv,wb[4*15+kk],a4); a5=fmaf(xv,wb[5*15+kk],a5); a6=fmaf(xv,wb[6*15+kk],a6); a7=fmaf(xv,wb[7*15+kk],a7);\n }\n }\n }\n int base=n*OC*PLANE+ocb*PLANE+oh*OW+ow;\n y[base]=a0; y[base+PLANE]=a1; y[base+2*PLANE]=a2; y[base+3*PLANE]=a3; y[base+4*PLANE]=a4; y[base+5*PLANE]=a5; y[base+6*PLANE]=a6; y[base+7*PLANE]=a7;\n}\n__global__ void boundary8(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y){\n int m=blockIdx.x*blockDim.x+threadIdx.x; int ocb=blockIdx.y*8; int total=64*PLANE; if(m>=total) return;\n int ow=m%OW; int tt=m/OW; int oh=tt%OH; int n=tt/OH;\n if(oh>=2 && oh<128 && ow>=4 && ow<256) return;\n float a0=0.f,a1=0.f,a2=0.f,a3=0.f,a4=0.f,a5=0.f,a6=0.f,a7=0.f;\n int kh0=oh-(IH-1); if(kh0<0) kh0=0; int kh1=oh; if(kh1>2) kh1=2; int kw0=ow-(IW-1); if(kw0<0) kw0=0; int kw1=ow; if(kw1>4) kw1=4;\n #pragma unroll\n for(int ic=0;ic<IC;++ic){ const float* xb=x+((n*IC+ic)*IH)*IW; const float* wb=w+(ic*OC+ocb)*15;\n #pragma unroll\n for(int kh=0;kh<3;++kh){ if(kh<kh0||kh>kh1) continue; int ii=(oh-kh)*IW+ow;\n #pragma unroll\n for(int kw=0;kw<5;++kw){ if(kw<kw0||kw>kw1) continue; float xv=xb[ii-kw]; int kk=kh*5+kw;\n a0=fmaf(xv,wb[0*15+kk],a0); a1=fmaf(xv,wb[1*15+kk],a1); a2=fmaf(xv,wb[2*15+kk],a2); a3=fmaf(xv,wb[3*15+kk],a3);\n a4=fmaf(xv,wb[4*15+kk],a4); a5=fmaf(xv,wb[5*15+kk],a5); a6=fmaf(xv,wb[6*15+kk],a6); a7=fmaf(xv,wb[7*15+kk],a7);\n }\n }\n }\n int base=n*OC*PLANE+ocb*PLANE+oh*OW+ow; y[base]=a0; y[base+PLANE]=a1; y[base+2*PLANE]=a2; y[base+3*PLANE]=a3; y[base+4*PLANE]=a4; y[base+5*PLANE]=a5; y[base+6*PLANE]=a6; y[base+7*PLANE]=a7;\n}\ntorch::Tensor conv_transpose2d_forward(torch::Tensor x, torch::Tensor w, int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t,int64_t){\n auto y=torch::empty({(int)x.size(0),OC,OH,OW},x.options()); dim3 block(128); dim3 gi((64*126*252+127)/128,OC/8); interior8<<<gi,block,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),w.data_ptr<float>(),y.data_ptr<float>()); dim3 gb((64*PLANE+127)/128,OC/8); boundary8<<<gb,block,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),w.data_ptr<float>(),y.data_ptr<float>()); return y; }\n'''\n_ext=load_inline(name='deconv_ext_v3', cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=['conv_transpose2d_forward'], extra_cuda_cflags=['-O3','--use_fast_math'], verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,in_channels:int,out_channels:int,kernel_size:tuple,stride:tuple=(1,1),padding:tuple=(0,0),output_padding:tuple=(0,0),dilation:tuple=(1,1),groups:int=1,bias:bool=False):\n super().__init__(); self.conv_transpose2d=nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,output_padding=output_padding,dilation=dilation,groups=groups,bias=bias); self.stride=stride; self.padding=padding; self.output_padding=output_padding; self.dilation=dilation; self.groups=groups\n def forward(self,x):\n return _ext.conv_transpose2d_forward(x.contiguous(),self.conv_transpose2d.weight.contiguous(),self.stride[0],self.stride[1],self.padding[0],self.padding[1],self.output_padding[0],self.output_padding[1],self.dilation[0],self.dilation[1],self.groups)\n"
}