call → run_correctness
callrun_correctness
{
"kernel_code": "# same as v3 but conv bias omitted in training\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.cpp_extension import load_inline\n_cpp_src = r'''\n#include <torch/extension.h>\ntorch::Tensor bn_relu_eval_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b, torch::Tensor mean, torch::Tensor var, double eps); torch::Tensor bn_relu_pool_eval_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b, torch::Tensor mean, torch::Tensor var, double eps); torch::Tensor bn_relu_train_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b, double eps); torch::Tensor bn_relu_pool_train_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b, double eps); torch::Tensor avg_fc_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b);\ntorch::Tensor regnet_bn_relu_eval(torch::Tensor x, torch::Tensor w, torch::Tensor b, torch::Tensor mean, torch::Tensor var, double eps){return bn_relu_eval_cuda(x,w,b,mean,var,eps);} torch::Tensor regnet_bn_relu_pool_eval(torch::Tensor x, torch::Tensor w, torch::Tensor b, torch::Tensor mean, torch::Tensor var, double eps){return bn_relu_pool_eval_cuda(x,w,b,mean,var,eps);} torch::Tensor regnet_bn_relu_train(torch::Tensor x, torch::Tensor w, torch::Tensor b, double eps){return bn_relu_train_cuda(x,w,b,eps);} torch::Tensor regnet_bn_relu_pool_train(torch::Tensor x, torch::Tensor w, torch::Tensor b, double eps){return bn_relu_pool_train_cuda(x,w,b,eps);} torch::Tensor regnet_avg_fc(torch::Tensor x, torch::Tensor w, torch::Tensor b){return avg_fc_cuda(x,w,b);} \n'''\n# reuse exact cuda from previous by shortened? no full\n_cuda_src = r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <ATen/cuda/CUDAContext.h>\n__global__ void stats_kernel(const float* __restrict__ x,float* __restrict__ mean,float* __restrict__ invstd,int N,int C,int HW,float eps){int c=blockIdx.x,tid=threadIdx.x,M=N*HW; float s=0.f,ss=0.f; for(int m=tid;m<M;m+=blockDim.x){int n=m/HW; int p=m-n*HW; float v=x[(n*C+c)*HW+p]; s+=v; ss+=v*v;} __shared__ float sh[512]; float* shs=sh; float* shss=sh+256; shs[tid]=s; shss[tid]=ss; __syncthreads(); for(int off=128;off>0;off>>=1){if(tid<off){shs[tid]+=shs[tid+off]; shss[tid]+=shss[tid+off];} __syncthreads();} if(tid==0){float mu=shs[0]/(float)M; float var=shss[0]/(float)M-mu*mu; if(var<0.f)var=0.f; mean[c]=mu; invstd[c]=rsqrtf(var+eps);}}\n__global__ void bn_relu_apply_kernel(const float* __restrict__ x,float* __restrict__ y,const float* __restrict__ gamma,const float* __restrict__ beta,const float* __restrict__ mean,const float* __restrict__ invstd,int total,int C,int HW){int idx=blockIdx.x*blockDim.x+threadIdx.x,stride=blockDim.x*gridDim.x; for(int i=idx;i<total;i+=stride){int c=(i/HW)%C; float v=(x[i]-mean[c])*invstd[c]*gamma[c]+beta[c]; y[i]=v>0.f?v:0.f;}}\n__global__ void bn_relu_pool_apply_kernel(const float* __restrict__ x,float* __restrict__ y,const float* __restrict__ gamma,const float* __restrict__ beta,const float* __restrict__ mean,const float* __restrict__ invstd,int total_out,int C,int H,int W,int Ho,int Wo){int idx=blockIdx.x*blockDim.x+threadIdx.x,stride=blockDim.x*gridDim.x; for(int i=idx;i<total_out;i+=stride){int t=i; int ow=t%Wo; t/=Wo; int oh=t%Ho; t/=Ho; int c=t%C; int n=t/C; int base=((n*C+c)*H+(oh*2))*W+(ow*2); float a=invstd[c]*gamma[c]; float d=beta[c]-mean[c]*a; float v0=x[base]*a+d; v0=v0>0.f?v0:0.f; float v1=x[base+1]*a+d; v1=v1>0.f?v1:0.f; float v2=x[base+W]*a+d; v2=v2>0.f?v2:0.f; float v3=x[base+W+1]*a+d; v3=v3>0.f?v3:0.f; float m1=v0>v1?v0:v1; float m2=v2>v3?v2:v3; y[i]=m1>m2?m1:m2;}}\n__global__ void bn_relu_eval_kernel(const float* __restrict__ x,float* __restrict__ y,const float* __restrict__ gamma,const float* __restrict__ beta,const float* __restrict__ mean,const float* __restrict__ var,int total,int C,int HW,float eps){int idx=blockIdx.x*blockDim.x+threadIdx.x,stride=blockDim.x*gridDim.x; for(int i=idx;i<total;i+=stride){int c=(i/HW)%C; float a=gamma[c]*rsqrtf(var[c]+eps); float d=beta[c]-mean[c]*a; float v=x[i]*a+d; y[i]=v>0.f?v:0.f;}}\n__global__ void bn_relu_pool_eval_kernel(const float* __restrict__ x,float* __restrict__ y,const float* __restrict__ gamma,const float* __restrict__ beta,const float* __restrict__ mean,const float* __restrict__ var,int total_out,int C,int H,int W,int Ho,int Wo,float eps){int idx=blockIdx.x*blockDim.x+threadIdx.x,stride=blockDim.x*gridDim.x; for(int i=idx;i<total_out;i+=stride){int t=i; int ow=t%Wo; t/=Wo; int oh=t%Ho; t/=Ho; int c=t%C; int n=t/C; int base=((n*C+c)*H+(oh*2))*W+(ow*2); float a=gamma[c]*rsqrtf(var[c]+eps); float d=beta[c]-mean[c]*a; float v0=x[base]*a+d; v0=v0>0.f?v0:0.f; float v1=x[base+1]*a+d; v1=v1>0.f?v1:0.f; float v2=x[base+W]*a+d; v2=v2>0.f?v2:0.f; float v3=x[base+W+1]*a+d; v3=v3>0.f?v3:0.f; float m1=v0>v1?v0:v1; float m2=v2>v3?v2:v3; y[i]=m1>m2?m1:m2;}}\n__global__ void avg_fc_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int N,int C,int H,int Wd,int K){int nk=blockIdx.x,n=nk/K,k=nk-n*K,tid=threadIdx.x; float sum=0.f; int HW=H*Wd; const float* xn=x+n*C*HW; for(int c=tid;c<C;c+=blockDim.x){float s=0.f; const float* xp=xn+c*HW; for(int p=0;p<HW;++p)s+=xp[p]; sum+=s*w[k*C+c];} __shared__ float sm[256]; sm[tid]=sum; __syncthreads(); for(int off=128;off>0;off>>=1){if(tid<off)sm[tid]+=sm[tid+off]; __syncthreads();} if(tid==0)y[n*K+k]=sm[0]/(float)HW+b[k];}\ntorch::Tensor bn_relu_train_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b,double eps){int N=x.size(0),C=x.size(1),H=x.size(2),Wd=x.size(3),HW=H*Wd; auto mean=torch::empty({C},x.options()),inv=torch::empty({C},x.options()),y=torch::empty_like(x); stats_kernel<<<C,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),mean.data_ptr<float>(),inv.data_ptr<float>(),N,C,HW,(float)eps); int64_t total=x.numel(); int blocks=(int)((total+255)/256); if(blocks>4096)blocks=4096; bn_relu_apply_kernel<<<blocks,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),y.data_ptr<float>(),w.data_ptr<float>(),b.data_ptr<float>(),mean.data_ptr<float>(),inv.data_ptr<float>(),(int)total,C,HW); return y;}\ntorch::Tensor bn_relu_pool_train_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b,double eps){int N=x.size(0),C=x.size(1),H=x.size(2),Wd=x.size(3),HW=H*Wd,Ho=H/2,Wo=Wd/2; auto mean=torch::empty({C},x.options()),inv=torch::empty({C},x.options()); auto y=torch::empty({N,C,Ho,Wo},x.options()); stats_kernel<<<C,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),mean.data_ptr<float>(),inv.data_ptr<float>(),N,C,HW,(float)eps); int64_t total=(int64_t)N*C*Ho*Wo; int blocks=(int)((total+255)/256); if(blocks>4096)blocks=4096; bn_relu_pool_apply_kernel<<<blocks,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),y.data_ptr<float>(),w.data_ptr<float>(),b.data_ptr<float>(),mean.data_ptr<float>(),inv.data_ptr<float>(),(int)total,C,H,Wd,Ho,Wo); return y;}\ntorch::Tensor bn_relu_eval_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b,torch::Tensor mean,torch::Tensor var,double eps){auto y=torch::empty_like(x); int64_t total=x.numel(); int C=x.size(1),HW=x.size(2)*x.size(3); int blocks=(int)((total+255)/256); if(blocks>4096)blocks=4096; bn_relu_eval_kernel<<<blocks,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),y.data_ptr<float>(),w.data_ptr<float>(),b.data_ptr<float>(),mean.data_ptr<float>(),var.data_ptr<float>(),(int)total,C,HW,(float)eps); return y;}\ntorch::Tensor bn_relu_pool_eval_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b,torch::Tensor mean,torch::Tensor var,double eps){int N=x.size(0),C=x.size(1),H=x.size(2),Wd=x.size(3),Ho=H/2,Wo=Wd/2; auto y=torch::empty({N,C,Ho,Wo},x.options()); int64_t total=(int64_t)N*C*Ho*Wo; int blocks=(int)((total+255)/256); if(blocks>4096)blocks=4096; bn_relu_pool_eval_kernel<<<blocks,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),y.data_ptr<float>(),w.data_ptr<float>(),b.data_ptr<float>(),mean.data_ptr<float>(),var.data_ptr<float>(),(int)total,C,H,Wd,Ho,Wo,(float)eps); return y;}\ntorch::Tensor avg_fc_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b){int N=x.size(0),C=x.size(1),H=x.size(2),Wd=x.size(3),K=w.size(0); auto y=torch::empty({N,K},x.options()); avg_fc_kernel<<<N*K,256,0,at::cuda::getCurrentCUDAStream()>>>(x.data_ptr<float>(),w.data_ptr<float>(),b.data_ptr<float>(),y.data_ptr<float>(),N,C,H,Wd,K); return y;}\n'''\n_ext=load_inline(name='regnet_fused_ext_v4',cpp_sources=[_cpp_src],cuda_sources=[_cuda_src],functions=['regnet_bn_relu_eval','regnet_bn_relu_pool_eval','regnet_bn_relu_train','regnet_bn_relu_pool_train','regnet_avg_fc'],extra_cflags=['-O3'],extra_cuda_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,input_channels,stages,block_widths,output_classes):\n super(ModelNew,self).__init__(); self.stages=stages; self.block_widths=block_widths; layers=[]; current_channels=input_channels\n for i in range(stages): layers.append(self._make_stage(current_channels,block_widths[i])); current_channels=block_widths[i]\n self.feature_extractor=nn.Sequential(*layers); self.fc=nn.Linear(block_widths[-1],output_classes)\n def _make_stage(self,in_channels,out_channels):\n return nn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size=3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(out_channels,out_channels,kernel_size=3,padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.MaxPool2d(kernel_size=2,stride=2))\n def forward(self,x):\n train=self.training\n for stage in self.feature_extractor:\n conv1=stage[0]; bn1=stage[1]; conv2=stage[3]; bn2=stage[4]\n x=F.conv2d(x,conv1.weight,None if train else conv1.bias,(1,1),(1,1),(1,1),1)\n x=_ext.regnet_bn_relu_train(x.contiguous(),bn1.weight,bn1.bias,bn1.eps) if train else _ext.regnet_bn_relu_eval(x.contiguous(),bn1.weight,bn1.bias,bn1.running_mean,bn1.running_var,bn1.eps)\n x=F.conv2d(x,conv2.weight,None if train else conv2.bias,(1,1),(1,1),(1,1),1)\n x=_ext.regnet_bn_relu_pool_train(x.contiguous(),bn2.weight,bn2.bias,bn2.eps) if train else _ext.regnet_bn_relu_pool_eval(x.contiguous(),bn2.weight,bn2.bias,bn2.running_mean,bn2.running_var,bn2.eps)\n return _ext.regnet_avg_fc(x.contiguous(),self.fc.weight,self.fc.bias)\n"
}