call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cpp_src = r'''\n#include <torch/extension.h>\ntorch::Tensor fused_all(torch::Tensor x, torch::Tensor w, torch::Tensor cb, torch::Tensor bias, torch::Tensor scale,\n torch::Tensor gamma, torch::Tensor beta, 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__device__ __forceinline__ float sigm(float x){return 1.0f/(1.0f+expf(-x));}\n\n__global__ void conv4_stats_kernel(const float* __restrict__ x, const float* __restrict__ w, const float* __restrict__ cb,\n const float* __restrict__ bias, const float* __restrict__ scale,\n float* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd,\n int N,int IH,int IW,int OH,int OW,int G){\n int ng=blockIdx.x; int n=ng/G; int g=ng-n*G; int c0=g*4; int tid=threadIdx.x; int HW=OH*OW;\n float sum=0.f, sumsq=0.f;\n for(int hw=tid; hw<HW; hw+=256){\n int oh=hw/OW; int ow=hw-oh*OW;\n float a0=cb[c0], a1=cb[c0+1], a2=cb[c0+2], a3=cb[c0+3];\n #pragma unroll\n for(int ic=0; ic<8; ++ic){\n #pragma unroll\n for(int kh=0; kh<3; ++kh){\n int ib=((n*8+ic)*IH + (oh+kh))*IW + ow;\n int wb0=((c0*8+ic)*3 + kh)*3;\n int wb1=(((c0+1)*8+ic)*3 + kh)*3;\n int wb2=(((c0+2)*8+ic)*3 + kh)*3;\n int wb3=(((c0+3)*8+ic)*3 + kh)*3;\n #pragma unroll\n for(int kw=0; kw<3; ++kw){\n float xv=x[ib+kw];\n a0=fmaf(xv,w[wb0+kw],a0);\n a1=fmaf(xv,w[wb1+kw],a1);\n a2=fmaf(xv,w[wb2+kw],a2);\n a3=fmaf(xv,w[wb3+kw],a3);\n }\n }\n }\n float z0=sigm((a0+bias[c0])*scale[c0]);\n float z1=sigm((a1+bias[c0+1])*scale[c0+1]);\n float z2=sigm((a2+bias[c0+2])*scale[c0+2]);\n float z3=sigm((a3+bias[c0+3])*scale[c0+3]);\n int base=(n*32+c0)*HW + hw;\n out[base]=z0; out[base+HW]=z1; out[base+2*HW]=z2; out[base+3*HW]=z3;\n sum += z0+z1+z2+z3;\n sumsq += z0*z0+z1*z1+z2*z2+z3*z3;\n }\n __shared__ float ss[256], sq[256]; ss[tid]=sum; sq[tid]=sumsq; __syncthreads();\n #pragma unroll\n for(int s=128;s>0;s>>=1){ if(tid<s){ss[tid]+=ss[tid+s]; sq[tid]+=sq[tid+s];} __syncthreads(); }\n if(tid==0){ float inv=1.0f/(float)(4*HW); float m=ss[0]*inv; float v=sq[0]*inv-m*m; if(v<0) v=0; mean[ng]=m; rstd[ng]=rsqrtf(v+1.0e-5f); }\n}\n\n__global__ void norm4_kernel(float* __restrict__ out, const float* __restrict__ mean, const float* __restrict__ rstd,\n const float* __restrict__ gamma, const float* __restrict__ beta,\n int N,int OH,int OW,int G,int total){\n int idx=blockIdx.x*blockDim.x+threadIdx.x; int stride=blockDim.x*gridDim.x; int HW=OH*OW;\n for(int t=idx; t<total; t+=stride){\n int hw=t%HW; int q=t/HW; int g=q%G; int n=q/G; int c0=g*4; int ng=n*G+g;\n float m=mean[ng], r=rstd[ng]; int base=(n*32+c0)*HW+hw;\n float z0=out[base], z1=out[base+HW], z2=out[base+2*HW], z3=out[base+3*HW];\n out[base]=(z0-m)*r*gamma[c0]+beta[c0];\n out[base+HW]=(z1-m)*r*gamma[c0+1]+beta[c0+1];\n out[base+2*HW]=(z2-m)*r*gamma[c0+2]+beta[c0+2];\n out[base+3*HW]=(z3-m)*r*gamma[c0+3]+beta[c0+3];\n }\n}\n\ntorch::Tensor fused_all(torch::Tensor x, torch::Tensor w, torch::Tensor cb, torch::Tensor bias, torch::Tensor scale,\n torch::Tensor gamma, torch::Tensor beta, int64_t groups){\n int N=x.size(0), IH=x.size(2), IW=x.size(3); int OH=IH-2, OW=IW-2, G=(int)groups;\n auto out=torch::empty({N,32,OH,OW}, x.options());\n auto opts=torch::TensorOptions().device(x.device()).dtype(torch::kFloat32);\n auto mean=torch::empty({N*G},opts), rstd=torch::empty({N*G},opts);\n cudaStream_t stream=at::cuda::getCurrentCUDAStream();\n conv4_stats_kernel<<<N*G,256,0,stream>>>(x.data_ptr<float>(),w.data_ptr<float>(),cb.data_ptr<float>(),bias.data_ptr<float>(),scale.data_ptr<float>(),out.data_ptr<float>(),mean.data_ptr<float>(),rstd.data_ptr<float>(),N,IH,IW,OH,OW,G);\n int total=N*G*OH*OW; int threads=256; int blocks=(total+threads-1)/threads; if(blocks>65535) blocks=65535;\n norm4_kernel<<<blocks,threads,0,stream>>>(out.data_ptr<float>(),mean.data_ptr<float>(),rstd.data_ptr<float>(),gamma.data_ptr<float>(),beta.data_ptr<float>(),N,OH,OW,G,total);\n return out;\n}\n'''\n_ext=load_inline(name='fused_all4_ext_v1', cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=['fused_all'], extra_cuda_cflags=['-O3','--use_fast_math'], extra_cflags=['-O3'], verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,in_channels,out_channels,kernel_size,num_groups,bias_shape,scale_shape):\n super(ModelNew,self).__init__(); self.conv=nn.Conv2d(in_channels,out_channels,kernel_size); self.bias=nn.Parameter(torch.randn(bias_shape)); self.scale=nn.Parameter(torch.randn(scale_shape)); self.group_norm=nn.GroupNorm(num_groups,out_channels); self.num_groups=num_groups\n def forward(self,x):\n return _ext.fused_all(x,self.conv.weight,self.conv.bias,self.bias,self.scale,self.group_norm.weight,self.group_norm.bias,self.num_groups)\n"
}