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 convt1d_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias,int64_t stride,int64_t padding,int64_t output_padding,int64_t groups);'''\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 BT 32\n#define BO 8\n#define ICT 32\n__device__ __forceinline__ float tf32f(float a){ float y; asm(\"cvt.rna.tf32.f32 %0, %1;\" : \"=f\"(y) : \"f\"(a)); return y; }\n__global__ void convt1d_k3s1_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int N,int CI,int L,int CO,int has_bias){\n __shared__ float xs[3][ICT][BT]; __shared__ float ws[3][ICT][BO]; int tx=threadIdx.x,oy=threadIdx.y,t=blockIdx.x*BT+tx,oc=blockIdx.y*BO+oy,n=blockIdx.z,Lout=L+2; float acc=(has_bias&&oc<CO&&t<Lout)?b[oc]:0.0f;\n for(int ic0=0;ic0<CI;ic0+=ICT){int lane=threadIdx.y*BT+tx; for(int idx=lane;idx<3*ICT*BT;idx+=BT*BO){int tmp=idx;int tt=tmp%BT;tmp/=BT;int ii=tmp%ICT;int k=tmp/ICT;int ic=ic0+ii;int gt=blockIdx.x*BT+tt-k;float v=0.0f;if(ic<CI&>>=0&><L)v=tf32f(x[(n*CI+ic)*L+gt]);xs[k][ii][tt]=v;} for(int idx=lane;idx<3*ICT*BO;idx+=BT*BO){int tmp=idx;int oo=tmp%BO;tmp/=BO;int ii=tmp%ICT;int k=tmp/ICT;int ic=ic0+ii;int goc=blockIdx.y*BO+oo;float v=0.0f;if(ic<CI&&goc<CO)v=tf32f(w[(ic*CO+goc)*3+k]);ws[k][ii][oo]=v;} __syncthreads(); if(oc<CO&&t<Lout){#pragma unroll\n for(int ii=0;ii<ICT;++ii){if(ic0+ii<CI){acc=fmaf(xs[0][ii][tx],ws[0][ii][oy],acc);acc=fmaf(xs[1][ii][tx],ws[1][ii][oy],acc);acc=fmaf(xs[2][ii][tx],ws[2][ii][oy],acc);}}} __syncthreads();}\n if(oc<CO&&t<Lout)y[(n*CO+oc)*Lout+t]=acc;}\n__global__ void convt1d_generic_kernel(const float* x,const float* w,const float* b,float* y,int N,int CI,int L,int CO,int K,int stride,int padding,int groups,int Lout,int has_bias){long long idx=(long long)blockIdx.x*blockDim.x+threadIdx.x,total=(long long)N*CO*Lout;if(idx>=total)return;int t=idx%Lout,oc=(idx/Lout)%CO,n=idx/((long long)CO*Lout),co_per_g=CO/groups,ci_per_g=CI/groups,g=oc/co_per_g,ocg=oc-g*co_per_g;float acc=has_bias?b[oc]:0.0f;for(int icg=0;icg<ci_per_g;++icg){int ic=g*ci_per_g+icg;for(int k=0;k<K;++k){int u=t+padding-k;if(u%stride==0){int it=u/stride;if(it>=0&&it<L)acc=fmaf(tf32f(x[(n*CI+ic)*L+it]),tf32f(w[(ic*co_per_g+ocg)*K+k]),acc);}}}y[idx]=acc;}\ntorch::Tensor convt1d_forward(torch::Tensor x,torch::Tensor weight,torch::Tensor bias,int64_t stride,int64_t padding,int64_t output_padding,int64_t groups){x=x.contiguous();weight=weight.contiguous();if(bias.numel()>0)bias=bias.contiguous();int N=x.size(0),CI=x.size(1),L=x.size(2),K=weight.size(2),CO=weight.size(1)*groups;int Lout=(L-1)*stride-2*padding+K+output_padding;auto y=torch::empty({N,CO,Lout},x.options());int has_bias=bias.numel()>0;const float* bp=has_bias?bias.data_ptr<float>():nullptr;cudaStream_t stream=at::cuda::getCurrentCUDAStream();if(K==3&&stride==1&&padding==0&&output_padding==0&&groups==1){dim3 block(BT,BO),grid((Lout+BT-1)/BT,(CO+BO-1)/BO,N);convt1d_k3s1_kernel<<<grid,block,0,stream>>>(x.data_ptr<float>(),weight.data_ptr<float>(),bp,y.data_ptr<float>(),N,CI,L,CO,has_bias);}else{int threads=256;long long total=(long long)N*CO*Lout;convt1d_generic_kernel<<<(total+threads-1)/threads,threads,0,stream>>>(x.data_ptr<float>(),weight.data_ptr<float>(),bp,y.data_ptr<float>(),N,CI,L,CO,K,stride,padding,groups,Lout,has_bias);}return y;}\n'''\n_ext=load_inline(name='convt1d_ext_v3a',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['convt1d_forward'],extra_cuda_cflags=['-O3'],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); self.stride=stride; self.padding=padding; self.output_padding=output_padding; self.groups=groups\n def forward(self,x):\n bias=self.conv1d_transpose.bias\n if bias is None: bias=torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.convt1d_forward(x,self.conv1d_transpose.weight,bias,self.stride,self.padding,self.output_padding,self.groups)\n"
}