call → run_correctness
callrun_correctness
{
"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 fused_gn_lrelu_forward(torch::Tensor x, torch::Tensor bias, torch::Tensor gamma, torch::Tensor beta, double eps, double neg_slope, int64_t num_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__inline__ __device__ float half_reduce_sum(float v, unsigned mask){ v+=__shfl_down_sync(mask,v,8); v+=__shfl_down_sync(mask,v,4); v+=__shfl_down_sync(mask,v,2); v+=__shfl_down_sync(mask,v,1); return v; }\n__inline__ __device__ float warp_reduce_sum(float v){ v+=__shfl_down_sync(0xffffffffu,v,16); v+=__shfl_down_sync(0xffffffffu,v,8); v+=__shfl_down_sync(0xffffffffu,v,4); v+=__shfl_down_sync(0xffffffffu,v,2); v+=__shfl_down_sync(0xffffffffu,v,1); return v; }\n__global__ void gn16_bias_halfwarp_inplace_kernel(float* __restrict__ x,const float* __restrict__ bias,const float* __restrict__ gamma,const float* __restrict__ beta,int N,int C,int G,float eps,float neg_slope){\n int tid=threadIdx.x,lane=tid&31,warp=tid>>5,half=lane>>4,sub=lane&15; int groups_per_block=(blockDim.x>>5)*2; int idx=blockIdx.x*groups_per_block+warp*2+half; if(idx>=N*G)return; int n=idx/G; int g=idx-n*G; int base=n*C+g*16; int c=g*16+sub; unsigned mask=half?0xffff0000u:0x0000ffffu; float v=x[base+sub]+bias[c]; float sum=half_reduce_sum(v,mask); sum=__shfl_sync(mask,sum,half*16); float mean=sum*0.0625f; float d=v-mean; float ss=half_reduce_sum(d*d,mask); ss=__shfl_sync(mask,ss,half*16); float inv=rsqrtf(ss*0.0625f+eps); float y=d*inv*gamma[c]+beta[c]; y=(y>=0.0f)?y:y*neg_slope; x[base+sub]=y+y; }\n__global__ void gn_generic_bias_inplace_kernel(float* __restrict__ x,const float* __restrict__ bias,const float* __restrict__ gamma,const float* __restrict__ beta,int N,int C,int G,float eps,float neg_slope){\n int tid=threadIdx.x,lane=tid&31,warp=tid>>5; int wpb=blockDim.x>>5; int idx=blockIdx.x*wpb+warp; if(idx>=N*G)return; int n=idx/G; int g=idx-n*G; int gs=C/G; int base=n*C+g*gs; int cbase=g*gs; float sum=0.f; for(int i=lane;i<gs;i+=32)sum+=x[base+i]+bias[cbase+i]; sum=warp_reduce_sum(sum); sum=__shfl_sync(0xffffffffu,sum,0); float mean=sum/(float)gs; float ss=0.f; for(int i=lane;i<gs;i+=32){float d=x[base+i]+bias[cbase+i]-mean; ss+=d*d;} ss=warp_reduce_sum(ss); ss=__shfl_sync(0xffffffffu,ss,0); float inv=rsqrtf(ss/(float)gs+eps); for(int i=lane;i<gs;i+=32){int c=cbase+i; float y=(x[base+i]+bias[c]-mean)*inv*gamma[c]+beta[c]; y=(y>=0.f)?y:y*neg_slope; x[base+i]=y+y;} }\ntorch::Tensor fused_gn_lrelu_forward(torch::Tensor x, torch::Tensor bias, torch::Tensor gamma, torch::Tensor beta, double eps, double neg_slope, int64_t num_groups){ int N=x.size(0), C=x.size(1), G=num_groups, gs=C/G; cudaStream_t stream=at::cuda::getCurrentCUDAStream(); const int threads=256; if(gs==16){int gpb=(threads/32)*2; int blocks=(N*G+gpb-1)/gpb; gn16_bias_halfwarp_inplace_kernel<<<blocks,threads,0,stream>>>(x.data_ptr<float>(),bias.data_ptr<float>(),gamma.data_ptr<float>(),beta.data_ptr<float>(),N,C,G,(float)eps,(float)neg_slope);} else {int warps=threads/32; int blocks=(N*G+warps-1)/warps; gn_generic_bias_inplace_kernel<<<blocks,threads,0,stream>>>(x.data_ptr<float>(),bias.data_ptr<float>(),gamma.data_ptr<float>(),beta.data_ptr<float>(),N,C,G,(float)eps,(float)neg_slope);} return x; }\n'''\n_ext=load_inline(name='fused_gn_lrelu2_ext_v5',cpp_sources=[_cpp_src],cuda_sources=[_cuda_src],functions=['fused_gn_lrelu_forward'],verbose=False,extra_cuda_cflags=['-O3','--use_fast_math'],extra_cflags=['-O3'])\nclass ModelNew(nn.Module):\n def __init__(self,input_size,hidden_size,num_groups,eps=1e-5,negative_slope=0.01):\n super(ModelNew,self).__init__(); self.fc=nn.Linear(input_size,hidden_size); self.gn=nn.GroupNorm(num_groups=num_groups,num_channels=hidden_size,eps=eps); self.negative_slope=negative_slope; self.num_groups=num_groups; self.eps=eps\n def forward(self,x):\n y=torch.matmul(x,self.fc.weight.t())\n return _ext.fused_gn_lrelu_forward(y,self.fc.bias,self.gn.weight,self.gn.bias,self.eps,self.negative_slope,self.num_groups)\n"
}