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 = '#include <torch/extension.h>\\ntorch::Tensor conv_transpose1d_forward(torch::Tensor x, torch::Tensor weight);\\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>\nconstexpr int T_TILE=128, TX=32, OC_TILE=16, OC_HALF=8, KSIZE=3;\n__global__ void kern(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y,int IC,int L,int OC){\n extern __shared__ float sh[];\n int tx=threadIdx.x, ty=threadIdx.y, tid=ty*blockDim.x+tx;\n int n=blockIdx.z, tbase=blockIdx.x*T_TILE, ocbase=blockIdx.y*OC_TILE;\n int Lout=L+2, cols=T_TILE+2, total=IC*cols;\n const float* xn=x+(long long)n*IC*L;\n for(int idx=tid; idx<total; idx+=256){int ic=idx/cols; int c=idx-ic*cols; int pos=tbase+c-2; float v=0.f; if((unsigned)pos<(unsigned)L) v=xn[(long long)ic*L+pos]; sh[idx]=v;}\n __syncthreads();\n int oc0=ocbase+ty, oc1=oc0+OC_HALF; bool voc1=oc1<OC;\n int t0=tbase+tx, t1=t0+32, t2=t0+64, t3=t0+96;\n float a00=0.f,a01=0.f,a02=0.f,a03=0.f,a10=0.f,a11=0.f,a12=0.f,a13=0.f;\n if(oc0<OC){\n #pragma unroll 4\n for(int ic=0; ic<IC; ++ic){\n const float* s=sh+ic*cols+tx;\n const float* wp0=w+((long long)ic*OC+oc0)*3;\n float w00=wp0[0],w01=wp0[1],w02=wp0[2];\n float x2=s[0],x1=s[1],x0=s[2]; a00=fmaf(x0,w00,a00); a00=fmaf(x1,w01,a00); a00=fmaf(x2,w02,a00);\n x2=s[32];x1=s[33];x0=s[34]; a01=fmaf(x0,w00,a01); a01=fmaf(x1,w01,a01); a01=fmaf(x2,w02,a01);\n x2=s[64];x1=s[65];x0=s[66]; a02=fmaf(x0,w00,a02); a02=fmaf(x1,w01,a02); a02=fmaf(x2,w02,a02);\n x2=s[96];x1=s[97];x0=s[98]; a03=fmaf(x0,w00,a03); a03=fmaf(x1,w01,a03); a03=fmaf(x2,w02,a03);\n if(voc1){const float* wp1=w+((long long)ic*OC+oc1)*3; float v0=wp1[0],v1=wp1[1],v2=wp1[2];\n x2=s[0];x1=s[1];x0=s[2]; a10=fmaf(x0,v0,a10); a10=fmaf(x1,v1,a10); a10=fmaf(x2,v2,a10);\n x2=s[32];x1=s[33];x0=s[34]; a11=fmaf(x0,v0,a11); a11=fmaf(x1,v1,a11); a11=fmaf(x2,v2,a11);\n x2=s[64];x1=s[65];x0=s[66]; a12=fmaf(x0,v0,a12); a12=fmaf(x1,v1,a12); a12=fmaf(x2,v2,a12);\n x2=s[96];x1=s[97];x0=s[98]; a13=fmaf(x0,v0,a13); a13=fmaf(x1,v1,a13); a13=fmaf(x2,v2,a13);}\n }\n long long b=((long long)n*OC+oc0)*Lout; if(t0<Lout)y[b+t0]=a00; if(t1<Lout)y[b+t1]=a01; if(t2<Lout)y[b+t2]=a02; if(t3<Lout)y[b+t3]=a03;\n if(voc1){long long b1=((long long)n*OC+oc1)*Lout; if(t0<Lout)y[b1+t0]=a10; if(t1<Lout)y[b1+t1]=a11; if(t2<Lout)y[b1+t2]=a12; if(t3<Lout)y[b1+t3]=a13;}\n }\n}\ntorch::Tensor conv_transpose1d_forward(torch::Tensor x, torch::Tensor weight){TORCH_CHECK(x.is_cuda()&&weight.is_cuda()); TORCH_CHECK(x.is_contiguous()&&weight.is_contiguous()); TORCH_CHECK(x.scalar_type()==at::kFloat&&weight.scalar_type()==at::kFloat); int64_t N=x.size(0),IC=x.size(1),L=x.size(2),OC=weight.size(1); auto y=torch::empty({N,OC,L+2},x.options()); dim3 block(TX,OC_HALF),grid((L+2+T_TILE-1)/T_TILE,(OC+OC_TILE-1)/OC_TILE,N); size_t sm=(size_t)IC*(T_TILE+2)*sizeof(float); kern<<<grid,block,sm,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),weight.data_ptr<float>(),y.data_ptr<float>(),(int)IC,(int)L,(int)OC); C10_CUDA_KERNEL_LAUNCH_CHECK(); return y;}\n'''\n_ext=load_inline(name='convt1d_k3_ext_v3',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['conv_transpose1d_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:int,stride:int=1,padding:int=0,output_padding:int=0,groups:int=1,bias:bool=False):\n super().__init__(); self.conv1d_transpose=nn.ConvTranspose1d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,output_padding=output_padding,groups=groups,bias=bias)\n def forward(self,x:torch.Tensor)->torch.Tensor:\n return _ext.conv_transpose1d_forward(x.contiguous(),self.conv1d_transpose.weight.contiguous())\n"
}