call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\ntorch.backends.cudnn.allow_tf32 = False\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\ncpp_src=r'''\n#include <torch/extension.h>\ntorch::Tensor conv2d_forward_cuda(torch::Tensor x, torch::Tensor w, int stride, int pad_h, int pad_w, int dil_h, int dil_w);\ntorch::Tensor conv2d_forward(torch::Tensor x, torch::Tensor w, int stride, int pad_h, int pad_w, int dil_h, int dil_w){return conv2d_forward_cuda(x,w,stride,pad_h,pad_w,dil_h,dil_w);}\n'''\ncuda_src=r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#define VEC 4\n#define OCT 4\n#define WSZ (OCT*32*5*9)\n__global__ __launch_bounds__(128,2) void conv2d_5x9_oc4_sh_kernel(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y,int H,int W){\n extern __shared__ float sm[]; float* sw=sm; float* sx=sm+WSZ; const int tid=threadIdx.x, ow0=tid*VEC, oh=blockIdx.y,z=blockIdx.z; const int n=z>>4, oc0=(z&15)<<2; const int Hout=H-4,Wout=W-16; bool active=ow0<Wout;\n for(int i=tid;i<WSZ;i+=128){int kw=i%9;int t=i/9;int kh=t%5;t/=5;int c=t%32;int oo=t/32;sw[i]=w[((((oc0+oo)*32+c)*5+kh)*9)+kw];} __syncthreads();\n float a00=0.f,a01=0.f,a02=0.f,a03=0.f,a10=0.f,a11=0.f,a12=0.f,a13=0.f,a20=0.f,a21=0.f,a22=0.f,a23=0.f,a30=0.f,a31=0.f,a32=0.f,a33=0.f; bool interior_w=(ow0>=4&&ow0+23<W);\n #pragma unroll\n for(int c=0;c<32;++c){#pragma unroll\n for(int kh=0;kh<5;++kh){int ih=oh+kh*2-2;bool vh=((unsigned)ih<(unsigned)H);if(vh){const float* xp=x+((n*32+c)*H+ih)*W;for(int j=tid;j<W;j+=128)sx[j]=__ldg(xp+j);} __syncthreads(); if(vh&&active){#pragma unroll\n for(int kw=0;kw<9;++kw){int iw=ow0+kw*3-4;float x0=0.f,x1=0.f,x2=0.f,x3=0.f;if(interior_w){x0=sx[iw];x1=sx[iw+1];x2=sx[iw+2];x3=sx[iw+3];}else{if((unsigned)iw<(unsigned)W)x0=sx[iw];if((unsigned)(iw+1)<(unsigned)W&&ow0+1<Wout)x1=sx[iw+1];if((unsigned)(iw+2)<(unsigned)W&&ow0+2<Wout)x2=sx[iw+2];if((unsigned)(iw+3)<(unsigned)W&&ow0+3<Wout)x3=sx[iw+3];}int wi=(c*45+kh*9+kw);float w0=sw[wi],w1=sw[1440+wi],w2=sw[2880+wi],w3=sw[4320+wi];a00=fmaf(x0,w0,a00);a01=fmaf(x1,w0,a01);a02=fmaf(x2,w0,a02);a03=fmaf(x3,w0,a03);a10=fmaf(x0,w1,a10);a11=fmaf(x1,w1,a11);a12=fmaf(x2,w1,a12);a13=fmaf(x3,w1,a13);a20=fmaf(x0,w2,a20);a21=fmaf(x1,w2,a21);a22=fmaf(x2,w2,a22);a23=fmaf(x3,w2,a23);a30=fmaf(x0,w3,a30);a31=fmaf(x1,w3,a31);a32=fmaf(x2,w3,a32);a33=fmaf(x3,w3,a33);}}\n __syncthreads(); }}\n if(active){float* yp0=y+((n*64+oc0)*Hout+oh)*Wout+ow0;float* yp1=yp0+Hout*Wout;float* yp2=yp1+Hout*Wout;float* yp3=yp2+Hout*Wout;yp0[0]=a00;if(ow0+1<Wout)yp0[1]=a01;if(ow0+2<Wout)yp0[2]=a02;if(ow0+3<Wout)yp0[3]=a03;yp1[0]=a10;if(ow0+1<Wout)yp1[1]=a11;if(ow0+2<Wout)yp1[2]=a12;if(ow0+3<Wout)yp1[3]=a13;yp2[0]=a20;if(ow0+1<Wout)yp2[1]=a21;if(ow0+2<Wout)yp2[2]=a22;if(ow0+3<Wout)yp2[3]=a23;yp3[0]=a30;if(ow0+1<Wout)yp3[1]=a31;if(ow0+2<Wout)yp3[2]=a32;if(ow0+3<Wout)yp3[3]=a33;}}\n__global__ void conv2d_generic_kernel(const float* __restrict__ x,const float* __restrict__ w,float* __restrict__ y,int N,int C,int H,int W,int O,int KH,int KW,int Hout,int Wout,int stride,int pad_h,int pad_w,int dil_h,int dil_w){int idx=blockIdx.x*blockDim.x+threadIdx.x,total=N*O*Hout*Wout;if(idx>=total)return;int ow=idx%Wout;int t=idx/Wout;int oh=t%Hout;t/=Hout;int oc=t%O;int n=t/O;float acc=0.f;for(int c=0;c<C;++c)for(int kh=0;kh<KH;++kh){int ih=oh*stride+kh*dil_h-pad_h;if((unsigned)ih>=(unsigned)H)continue;for(int kw=0;kw<KW;++kw){int iw=ow*stride+kw*dil_w-pad_w;if((unsigned)iw<(unsigned)W)acc=fmaf(x[((n*C+c)*H+ih)*W+iw],w[((oc*C+c)*KH+kh)*KW+kw],acc);}}y[idx]=acc;}\ntorch::Tensor conv2d_forward_cuda(torch::Tensor x,torch::Tensor w,int stride,int pad_h,int pad_w,int dil_h,int dil_w){int N=x.size(0),C=x.size(1),H=x.size(2),W=x.size(3),O=w.size(0),KH=w.size(2),KW=w.size(3);int Hout=(H+2*pad_h-dil_h*(KH-1)-1)/stride+1,Wout=(W+2*pad_w-dil_w*(KW-1)-1)/stride+1;auto y=torch::empty({N,O,Hout,Wout},x.options());if(C==32&&O==64&&KH==5&&KW==9&&stride==1&&pad_h==2&&pad_w==4&&dil_h==2&&dil_w==3){dim3 block(128),grid(1,Hout,N*16);size_t sh=(WSZ+W)*sizeof(float);conv2d_5x9_oc4_sh_kernel<<<grid,block,sh>>>(x.data_ptr<float>(),w.data_ptr<float>(),y.data_ptr<float>(),H,W);}else{int total=N*O*Hout*Wout,threads=256,blocks=(total+threads-1)/threads;conv2d_generic_kernel<<<blocks,threads>>>(x.data_ptr<float>(),w.data_ptr<float>(),y.data_ptr<float>(),N,C,H,W,O,KH,KW,Hout,Wout,stride,pad_h,pad_w,dil_h,dil_w);}return y;}\n'''\n_ext=load_inline(name='conv2d_dil_ext_v5',cpp_sources=cpp_src,cuda_sources=cuda_src,functions=['conv2d_forward'],extra_cuda_cflags=['-O3'],extra_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,in_channels:int,out_channels:int,kernel_size:tuple,stride:int=1,padding:tuple=(0,0),dilation:tuple=(1,1),bias:bool=False):\n super().__init__(); self.conv2d=nn.Conv2d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,dilation=dilation,bias=bias); self.stride=stride; self.padding=padding; self.dilation=dilation\n def forward(self,x:torch.Tensor)->torch.Tensor:\n return _ext.conv2d_forward(x.contiguous(),self.conv2d.weight.contiguous(),int(self.stride),int(self.padding[0]),int(self.padding[1]),int(self.dilation[0]),int(self.dilation[1]))\n"
}