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 conv1d_forward(torch::Tensor x, torch::Tensor w, torch::Tensor bias,int64_t stride,int64_t padding,int64_t dilation,int64_t groups);\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__global__ void conv1d_k3_opt8p2_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ bias,float* __restrict__ y,int L,int has_bias){\n constexpr int CIN=64,COUT=128,TILE_L=256,TILE_OC=16,K=3,IN_TILE=258; int Lout=L-2; int tx=threadIdx.x, ty=threadIdx.y, pos0=blockIdx.x*TILE_L, oc0=blockIdx.y*TILE_OC, n=blockIdx.z; extern __shared__ float smem[]; float* sx=smem; float* sw=sx+CIN*IN_TILE; int tid=ty*blockDim.x+tx; int nt=blockDim.x*blockDim.y;\n for(int idx=tid;idx<CIN*IN_TILE;idx+=nt){int c=idx/IN_TILE; int t=idx-c*IN_TILE; int ip=pos0+t; sx[idx]=(ip<L)?x[((n*CIN+c)*L)+ip]:0.f;}\n for(int idx=tid;idx<TILE_OC*CIN*K;idx+=nt){int rem=idx; int oo=rem/(CIN*K); rem-=oo*(CIN*K); int c=rem/K; int k=rem-c*K; sw[idx]=w[((oc0+oo)*CIN+c)*K+k];}\n __syncthreads(); int p0=tx; int p1=tx+128; int posA=pos0+p0, posB=pos0+p1; float a[8], b[8];\n #pragma unroll\n for(int m=0;m<8;++m){int oc=oc0+ty+m*2; float bv=has_bias?bias[oc]:0.f; a[m]=bv; b[m]=bv;}\n #pragma unroll\n for(int c=0;c<CIN;++c){int si=c*IN_TILE; float x0=sx[si+p0],x1=sx[si+p0+1],x2=sx[si+p0+2]; float z0=sx[si+p1],z1=sx[si+p1+1],z2=sx[si+p1+2];\n #pragma unroll\n for(int m=0;m<8;++m){int wb=(ty+m*2)*(CIN*K)+c*K; float w0=sw[wb],w1=sw[wb+1],w2=sw[wb+2]; a[m]=fmaf(x0,w0,a[m]); a[m]=fmaf(x1,w1,a[m]); a[m]=fmaf(x2,w2,a[m]); b[m]=fmaf(z0,w0,b[m]); b[m]=fmaf(z1,w1,b[m]); b[m]=fmaf(z2,w2,b[m]);}\n }\n int base=(n*COUT)*Lout;\n if(posA<Lout){#pragma unroll\n for(int m=0;m<8;++m){int oc=oc0+ty+m*2; y[base+oc*Lout+posA]=a[m];}}\n if(posB<Lout){#pragma unroll\n for(int m=0;m<8;++m){int oc=oc0+ty+m*2; y[base+oc*Lout+posB]=b[m];}}\n}\n__global__ void conv1d_generic_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ bias,float* __restrict__ y,int N,int Cin,int L,int Cout,int K,int stride,int padding,int dilation,int groups,int Lout,int has_bias){int idx=blockIdx.x*blockDim.x+threadIdx.x,total=N*Cout*Lout;if(idx>=total)return;int pos=idx%Lout,tmp=idx/Lout,oc=tmp%Cout,n=tmp/Cout,cinpg=Cin/groups,coutpg=Cout/groups,g=oc/coutpg,cbase=g*cinpg;float acc=has_bias?bias[oc]:0.f;for(int ci=0;ci<cinpg;++ci){int c=cbase+ci;for(int k=0;k<K;++k){int ip=pos*stride-padding+k*dilation;if((unsigned)ip<(unsigned)L)acc=fmaf(x[(n*Cin+c)*L+ip],w[(oc*cinpg+ci)*K+k],acc);}}y[idx]=acc;}\ntorch::Tensor conv1d_forward(torch::Tensor x,torch::Tensor w,torch::Tensor bias,int64_t stride,int64_t padding,int64_t dilation,int64_t groups){int N=x.size(0),Cin=x.size(1),L=x.size(2),Cout=w.size(0),K=w.size(2);int Lout=(L+2*(int)padding-(int)dilation*(K-1)-1)/(int)stride+1;auto y=torch::empty({N,Cout,Lout},x.options());int has_bias=bias.numel()!=0;cudaStream_t stream=at::cuda::getCurrentCUDAStream();if(N==32&&Cin==64&&Cout==128&&K==3&&stride==1&&padding==0&&dilation==1&&groups==1&&x.is_contiguous()&&w.is_contiguous()){dim3 block(128,2);dim3 grid((Lout+255)/256,8,N);size_t smem=(64*258+16*64*3)*sizeof(float);conv1d_k3_opt8p2_kernel<<<grid,block,smem,stream>>>(x.data_ptr<float>(),w.data_ptr<float>(),has_bias?bias.data_ptr<float>():nullptr,y.data_ptr<float>(),L,has_bias);}else{int total=N*Cout*Lout,threads=256;conv1d_generic_kernel<<<(total+threads-1)/threads,threads,0,stream>>>(x.data_ptr<float>(),w.data_ptr<float>(),has_bias?bias.data_ptr<float>():nullptr,y.data_ptr<float>(),N,Cin,L,Cout,K,(int)stride,(int)padding,(int)dilation,(int)groups,Lout,has_bias);}return y;}\n'''\n_ext=load_inline(name='conv1d_k3_ext_v5',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['conv1d_forward'],extra_cuda_cflags=['-O3','--use_fast_math'],extra_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,dilation:int=1,groups:int=1,bias:bool=False):\n super(ModelNew,self).__init__(); self.conv1d=nn.Conv1d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,dilation=dilation,groups=groups,bias=bias); self.stride=stride; self.padding=padding; self.dilation=dilation; self.groups=groups\n def forward(self,x:torch.Tensor)->torch.Tensor:\n b=self.conv1d.bias\n if b is None: b=torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.conv1d_forward(x.contiguous(),self.conv1d.weight.contiguous(),b,self.stride,self.padding,self.dilation,self.groups)\n"
}