call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\ncpp_src='''#include <torch/extension.h>\\ntorch::Tensor conv2d_forward(torch::Tensor x, torch::Tensor w, torch::Tensor bias,int stride_h,int stride_w,int pad_h,int pad_w,int dil_h,int dil_w,int groups);'''\ncuda_src=r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n__global__ void k(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int N,int C,int H,int W,int Kout,int Hout,int Wout,int hb){int ox=blockIdx.x*blockDim.x+threadIdx.x, oy=blockIdx.y*blockDim.y+threadIdx.y,z=blockIdx.z,co=z%Kout,n=z/Kout;if(ox>=Wout||oy>=Hout)return;float sum=hb?b[co]:0.f;int base=n*C*H*W,bw=co*C*45;#pragma unroll\nfor(int ci=0;ci<32;++ci){const float*xp=x+base+ci*H*W+oy*W+ox;const float*wp=w+bw+ci*45;#pragma unroll\nfor(int ky=0;ky<5;++ky){const float*xr=xp+ky*W;const float*wr=wp+ky*9;#pragma unroll\nfor(int kx=0;kx<9;++kx){sum=fmaf(__float_to_tf32(xr[kx]),__float_to_tf32(wr[kx]),sum);}}}y[((n*Kout+co)*Hout+oy)*Wout+ox]=sum;}\n__global__ void kg(const float*x,const float*w,const float*b,float*y,int N,int C,int H,int W,int Kout,int KH,int KW,int Hout,int Wout,int sh,int sw,int ph,int pw,int dh,int dw,int hb){int ox=blockIdx.x*blockDim.x+threadIdx.x,oy=blockIdx.y*blockDim.y+threadIdx.y,z=blockIdx.z,co=z%Kout,n=z/Kout;if(ox>=Wout||oy>=Hout)return;float sum=hb?b[co]:0.f;for(int ci=0;ci<C;++ci)for(int ky=0;ky<KH;++ky){int iy=oy*sh-ph+ky*dh;if((unsigned)iy>=(unsigned)H)continue;for(int kx=0;kx<KW;++kx){int ix=ox*sw-pw+kx*dw;if((unsigned)ix>=(unsigned)W)continue;sum=fmaf(__float_to_tf32(x[((n*C+ci)*H+iy)*W+ix]),__float_to_tf32(w[((co*C+ci)*KH+ky)*KW+kx]),sum);}}y[((n*Kout+co)*Hout+oy)*Wout+ox]=sum;}\ntorch::Tensor conv2d_forward(torch::Tensor x,torch::Tensor w,torch::Tensor bias,int sh,int sw,int ph,int pw,int dh,int dw,int groups){int64_t N=x.size(0),C=x.size(1),H=x.size(2),W=x.size(3),Kout=w.size(0),KH=w.size(2),KW=w.size(3);int64_t Hout=(H+2*ph-dh*(KH-1)-1)/sh+1,Wout=(W+2*pw-dw*(KW-1)-1)/sw+1;auto y=torch::empty({N,Kout,Hout,Wout},x.options());dim3 block(16,16),grid((Wout+15)/16,(Hout+15)/16,N*Kout);int hb=bias.numel()>0;if(C==32&&KH==5&&KW==9&&sh==1&&sw==1&&ph==0&&pw==0&&dh==1&&dw==1&&groups==1)k<<<grid,block>>>(x.data_ptr<float>(),w.data_ptr<float>(),hb?bias.data_ptr<float>():nullptr,y.data_ptr<float>(),N,C,H,W,Kout,Hout,Wout,hb);else kg<<<grid,block>>>(x.data_ptr<float>(),w.data_ptr<float>(),hb?bias.data_ptr<float>():nullptr,y.data_ptr<float>(),N,C,H,W,Kout,KH,KW,Hout,Wout,sh,sw,ph,pw,dh,dw,hb);return y;}\n'''\n_ext=load_inline(name='conv2d_tf32_test',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:int=0,dilation:int=1,groups:int=1,bias:bool=False):\n super().__init__();self.conv2d=nn.Conv2d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,dilation=dilation,groups=groups,bias=bias);p=lambda v:v if isinstance(v,tuple) else (v,v);self.stride=p(stride);self.padding=p(padding);self.dilation=p(dilation);self.groups=groups\n def forward(self,x):\n bias=self.conv2d.bias if self.conv2d.bias is not None else torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.conv2d_forward(x,self.conv2d.weight,bias,self.stride[0],self.stride[1],self.padding[0],self.padding[1],self.dilation[0],self.dilation[1],self.groups)\n"
}