call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\ncpp_src = r\"\"\"\n#include <torch/extension.h>\ntorch::Tensor conv_gn_forward(torch::Tensor x, torch::Tensor w, torch::Tensor gamma, torch::Tensor beta, int64_t num_groups, int64_t stride, int64_t padding, int64_t dilation, double eps, bool affine);\n\"\"\"\n\ncuda_src = r\"\"\"\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#define TILE_T 128\n#define BLOCK_THREADS 256\n__global__ void zero_kernel(float* s, float* q, int total) { int i=blockIdx.x*blockDim.x+threadIdx.x; if(i<total){s[i]=0.0f;q[i]=0.0f;} }\n__inline__ __device__ float warp_reduce_sum(float v){ for(int o=16;o>0;o>>=1) v+=__shfl_down_sync(0xffffffff,v,o); return v; }\n__inline__ __device__ float block_reduce_sum(float v){ static __shared__ float shared[32]; int lane=threadIdx.x&31; int wid=threadIdx.x>>5; v=warp_reduce_sum(v); if(lane==0) shared[wid]=v; __syncthreads(); v=(threadIdx.x<(blockDim.x>>5))?shared[lane]:0.0f; if(wid==0) v=warp_reduce_sum(v); return v; }\n__global__ void conv_stats_kernel(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y,float* __restrict__ sums,float* __restrict__ sumsq,int N,int Cin,int T,int Cout,int K,int Tout,int groups,int stride,int padding,int dilation){\n int tile=blockIdx.x,g=blockIdx.y,n=blockIdx.z; int cpg=Cout/groups; int t0=tile*TILE_T; float lsum=0.0f,lsq=0.0f; int elems=cpg*TILE_T;\n for(int idx=threadIdx.x; idx<elems; idx+=blockDim.x){ int lc=idx/TILE_T; int tt=idx-lc*TILE_T; int to=t0+tt; if(to<Tout){ int co=g*cpg+lc; float acc=0.0f;\n for(int kk=0; kk<K; ++kk){ int ti=to*stride-padding+kk*dilation; if((unsigned)ti<(unsigned)T){ const float* xp=x+(n*Cin*T)+ti; const float* wp=w+(co*Cin*K)+kk; for(int ci=0; ci<Cin; ++ci) acc=fmaf(xp[ci*T],wp[ci*K],acc); } }\n y[(n*Cout+co)*Tout+to]=acc; lsum+=acc; lsq=fmaf(acc,acc,lsq); }}\n float bsum=block_reduce_sum(lsum); float bsq=block_reduce_sum(lsq); if(threadIdx.x==0){ int si=n*groups+g; atomicAdd(sums+si,bsum); atomicAdd(sumsq+si,bsq);} }\n__global__ void norm_kernel(float* __restrict__ y,const float* __restrict__ sums,const float* __restrict__ sumsq,const float* __restrict__ gamma,const float* __restrict__ beta,int N,int Cout,int Tout,int groups,float eps,bool affine){\n int idx=blockIdx.x*blockDim.x+threadIdx.x; int total=N*Cout*Tout; int cpg=Cout/groups; int elems=cpg*Tout; for(int i=idx;i<total;i+=gridDim.x*blockDim.x){ int tmp=i; int t=tmp%Tout; tmp/=Tout; int c=tmp%Cout; int n=tmp/Cout; int g=c/cpg; int si=n*groups+g; float mean=sums[si]/(float)elems; float var=sumsq[si]/(float)elems-mean*mean; float v=(y[i]-mean)*rsqrtf(var+eps); if(affine) v=v*gamma[c]+beta[c]; y[i]=v; }}\ntorch::Tensor conv_gn_forward(torch::Tensor x, torch::Tensor w, torch::Tensor gamma, torch::Tensor beta, int64_t num_groups, int64_t stride, int64_t padding, int64_t dilation, double eps, bool affine){\n int N=x.size(0), Cin=x.size(1), T=x.size(2), Cout=w.size(0), K=w.size(2); int Tout=(T+2*(int)padding-(int)dilation*(K-1)-1)/(int)stride+1; auto y=torch::empty({N,Cout,Tout},x.options()); auto sums=torch::empty({N,(int)num_groups},x.options()); auto sumsq=torch::empty({N,(int)num_groups},x.options()); cudaStream_t stream=at::cuda::getCurrentCUDAStream(); int st=N*(int)num_groups; zero_kernel<<<(st+255)/256,256,0,stream>>>(sums.data_ptr<float>(),sumsq.data_ptr<float>(),st); dim3 grid((Tout+TILE_T-1)/TILE_T,(int)num_groups,N); conv_stats_kernel<<<grid,BLOCK_THREADS,0,stream>>>(x.data_ptr<float>(),w.data_ptr<float>(),y.data_ptr<float>(),sums.data_ptr<float>(),sumsq.data_ptr<float>(),N,Cin,T,Cout,K,Tout,(int)num_groups,(int)stride,(int)padding,(int)dilation); int total=N*Cout*Tout; norm_kernel<<<min((total+255)/256,4096),256,0,stream>>>(y.data_ptr<float>(),sums.data_ptr<float>(),sumsq.data_ptr<float>(),affine?gamma.data_ptr<float>():nullptr,affine?beta.data_ptr<float>():nullptr,N,Cout,Tout,(int)num_groups,(float)eps,affine); return y; }\n\"\"\"\n_ext = load_inline(name='conv_gn_ext_v2', cpp_sources=[cpp_src], cuda_sources=[cuda_src], functions=['conv_gn_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,num_groups:int,kernel_size:int=3,stride:int=1,padding:int=1,dilation:int=1,eps:float=1e-5,affine:bool=True):\n super().__init__(); self.conv=nn.Conv1d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,dilation=dilation,bias=False); self.norm=nn.GroupNorm(num_groups=num_groups,num_channels=out_channels,eps=eps,affine=affine); self.num_groups=num_groups; self.stride=stride; self.padding=padding; self.dilation=dilation; self.eps=eps; self.affine=affine\n def forward(self,x):\n gamma=self.norm.weight if self.affine else torch.empty(0,device=x.device,dtype=x.dtype); beta=self.norm.bias if self.affine else torch.empty(0,device=x.device,dtype=x.dtype); return _ext.conv_gn_forward(x.contiguous(),self.conv.weight.contiguous(),gamma,beta,self.num_groups,self.stride,self.padding,self.dilation,self.eps,self.affine)\n"
}