call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp_src='''#include <torch/extension.h>\\ntorch::Tensor fwd_cuda(torch::Tensor x, torch::Tensor w, torch::Tensor b, bool hb,int s,int p,int d,int g);\\ntorch::Tensor conv3d_forward(torch::Tensor x, torch::Tensor w, torch::Tensor b, bool hb,int s,int p,int d,int g){return fwd_cuda(x,w,b,hb,s,p,d,g);}\\n'''\n_cuda_src=r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n__global__ void k8(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,long long total,int D,int H,int W,int K,int OD,int OH,int OW,bool hb){\n long long id=(long long)blockIdx.x*blockDim.x+threadIdx.x, step=(long long)blockDim.x*gridDim.x; int S=OD*OH*OW, KB=K>>3, HW=H*W;\n for(;id<total;id+=step){int s=id%S; long long t=id/S; int kb=t%KB, n=t/KB; int ow=s%OW, q=s/OW, oh=q%OH, od=q/OH; int k=kb<<3;\n float a0=hb?b[k]:0.f,a1=hb?b[k+1]:0.f,a2=hb?b[k+2]:0.f,a3=hb?b[k+3]:0.f,a4=hb?b[k+4]:0.f,a5=hb?b[k+5]:0.f,a6=hb?b[k+6]:0.f,a7=hb?b[k+7]:0.f;\n for(int c=0;c<3;c++){long long base=(((long long)n*3+c)*D+od)*HW+oh*W+ow; int coff=c*27; for(int rz=0;rz<3;rz++){long long zbase=base+(long long)rz*HW; int zoff=coff+rz*9; for(int ry=0;ry<3;ry++){long long p=zbase+ry*W; int off=zoff+ry*3; \n float xv=__ldg(x+p); int wo=off; a0=fmaf(xv,__ldg(w+(long long)(k)*81+wo),a0); a1=fmaf(xv,__ldg(w+(long long)(k+1)*81+wo),a1); a2=fmaf(xv,__ldg(w+(long long)(k+2)*81+wo),a2); a3=fmaf(xv,__ldg(w+(long long)(k+3)*81+wo),a3); a4=fmaf(xv,__ldg(w+(long long)(k+4)*81+wo),a4); a5=fmaf(xv,__ldg(w+(long long)(k+5)*81+wo),a5); a6=fmaf(xv,__ldg(w+(long long)(k+6)*81+wo),a6); a7=fmaf(xv,__ldg(w+(long long)(k+7)*81+wo),a7);\n xv=__ldg(x+p+1); wo=off+1; a0=fmaf(xv,__ldg(w+(long long)(k)*81+wo),a0); a1=fmaf(xv,__ldg(w+(long long)(k+1)*81+wo),a1); a2=fmaf(xv,__ldg(w+(long long)(k+2)*81+wo),a2); a3=fmaf(xv,__ldg(w+(long long)(k+3)*81+wo),a3); a4=fmaf(xv,__ldg(w+(long long)(k+4)*81+wo),a4); a5=fmaf(xv,__ldg(w+(long long)(k+5)*81+wo),a5); a6=fmaf(xv,__ldg(w+(long long)(k+6)*81+wo),a6); a7=fmaf(xv,__ldg(w+(long long)(k+7)*81+wo),a7);\n xv=__ldg(x+p+2); wo=off+2; a0=fmaf(xv,__ldg(w+(long long)(k)*81+wo),a0); a1=fmaf(xv,__ldg(w+(long long)(k+1)*81+wo),a1); a2=fmaf(xv,__ldg(w+(long long)(k+2)*81+wo),a2); a3=fmaf(xv,__ldg(w+(long long)(k+3)*81+wo),a3); a4=fmaf(xv,__ldg(w+(long long)(k+4)*81+wo),a4); a5=fmaf(xv,__ldg(w+(long long)(k+5)*81+wo),a5); a6=fmaf(xv,__ldg(w+(long long)(k+6)*81+wo),a6); a7=fmaf(xv,__ldg(w+(long long)(k+7)*81+wo),a7);\n }}}\n long long o=((long long)n*K+k)*S+s; y[o]=a0; y[o+S]=a1; y[o+2LL*S]=a2; y[o+3LL*S]=a3; y[o+4LL*S]=a4; y[o+5LL*S]=a5; y[o+6LL*S]=a6; y[o+7LL*S]=a7; }}\n__global__ void kg(const float* x,const float* w,const float* b,float* y,long long T,int N,int C,int D,int H,int W,int K,int KD,int KH,int KW,int OD,int OH,int OW,int st,int pad,int dil,int groups,int Cg,int Kg,bool hb){long long id=(long long)blockIdx.x*blockDim.x+threadIdx.x,step=(long long)blockDim.x*gridDim.x; for(;id<T;id+=step){int ow=id%OW; long long t=id/OW; int oh=t%OH;t/=OH;int od=t%OD;t/=OD;int k=t%K;int n=t/K;int c0=(k/Kg)*Cg;float acc=hb?b[k]:0.f;for(int c=0;c<Cg;c++)for(int rz=0;rz<KD;rz++){int iz=od*st+rz*dil-pad;if((unsigned)iz>=(unsigned)D)continue;for(int ry=0;ry<KH;ry++){int iy=oh*st+ry*dil-pad;if((unsigned)iy>=(unsigned)H)continue;for(int rx=0;rx<KW;rx++){int ix=ow*st+rx*dil-pad;if((unsigned)ix>=(unsigned)W)continue;acc=fmaf(x[((((long long)n*C+c0+c)*D+iz)*H+iy)*W+ix],w[((((long long)k*Cg+c)*KD+rz)*KH+ry)*KW+rx],acc);}}}y[id]=acc;}}\ntorch::Tensor fwd_cuda(torch::Tensor x,torch::Tensor w,torch::Tensor b,bool hb,int st,int pad,int dil,int groups){int N=x.size(0),C=x.size(1),D=x.size(2),H=x.size(3),W=x.size(4),K=w.size(0),Cg=w.size(1),KD=w.size(2),KH=w.size(3),KW=w.size(4);int OD=(D+2*pad-dil*(KD-1)-1)/st+1,OH=(H+2*pad-dil*(KH-1)-1)/st+1,OW=(W+2*pad-dil*(KW-1)-1)/st+1;auto y=torch::empty({N,K,OD,OH,OW},x.options());int th=256,bl;if(C==3&&Cg==3&&(K&7)==0&&KD==3&&KH==3&&KW==3&&st==1&&pad==0&&dil==1&&groups==1){long long T=(long long)N*(K/8)*OD*OH*OW;bl=(T+th-1)/th;if(bl>65535)bl=65535;k8<<<bl,th>>>(x.data_ptr<float>(),w.data_ptr<float>(),hb?b.data_ptr<float>():nullptr,y.data_ptr<float>(),T,D,H,W,K,OD,OH,OW,hb);}else{long long T=(long long)N*K*OD*OH*OW;bl=(T+th-1)/th;if(bl>65535)bl=65535;kg<<<bl,th>>>(x.data_ptr<float>(),w.data_ptr<float>(),hb?b.data_ptr<float>():nullptr,y.data_ptr<float>(),T,N,C,D,H,W,K,KD,KH,KW,OD,OH,OW,st,pad,dil,groups,Cg,K/groups,hb);}return y;}\n'''\n_ext=load_inline(name='c3k8lean',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['conv3d_forward'],extra_cuda_cflags=['-O3','--use_fast_math'],extra_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,in_channels:int,out_channels:int,kernel_size:int,stride:int=1,padding:int=0,dilation:int=1,groups:int=1,bias:bool=False):\n super().__init__(); self.conv3d=nn.Conv3d(in_channels,out_channels,(kernel_size,kernel_size,kernel_size),stride=stride,padding=padding,dilation=dilation,groups=groups,bias=bias); self.stride=stride; self.padding=padding; self.dilation=dilation; self.groups=groups\n def forward(self,x):\n b=self.conv3d.bias; hb=b is not None\n if b is None: b=torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.conv3d_forward(x.contiguous(),self.conv3d.weight.contiguous(),b,hb,self.stride,self.padding,self.dilation,self.groups)\n"
}