call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\ncpp_src = r\"\"\"\n#include <torch/extension.h>\ntorch::Tensor lenet_forward(torch::Tensor x, torch::Tensor c1w, torch::Tensor c1b, torch::Tensor c2w, torch::Tensor c2b, torch::Tensor f1w, torch::Tensor f1b, torch::Tensor f2w, torch::Tensor f2b, torch::Tensor f3w, torch::Tensor f3b);\n\"\"\"\n\ncuda_src = r\"\"\"\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda_runtime.h>\n#include <float.h>\n\n__global__ void conv1_pool_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int B){\n int idx=blockIdx.x*blockDim.x+threadIdx.x; int total=B*6*14*14; if(idx>=total)return; int t=idx; int px=t%14; t/=14; int py=t%14; t/=14; int oc=t%6; t/=6; int n=t; float m=-FLT_MAX; int bx=n*1024; int bw=oc*25;\n #pragma unroll\n for(int dy=0;dy<2;++dy){#pragma unroll\n for(int dx=0;dx<2;++dx){int oy=py*2+dy, ox=px*2+dx; float s=b[oc];\n #pragma unroll\n for(int ky=0;ky<5;++ky){#pragma unroll\n for(int kx=0;kx<5;++kx) s=fmaf(x[bx+(oy+ky)*32+(ox+kx)],w[bw+ky*5+kx],s);\n } m=fmaxf(m,s);\n }} y[idx]=fmaxf(m,0.0f);\n}\n\n__global__ void conv2_pool_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int B){\n int idx=blockIdx.x*blockDim.x+threadIdx.x; int total=B*16*5*5; if(idx>=total)return; int t=idx; int px=t%5; t/=5; int py=t%5; t/=5; int oc=t%16; t/=16; int n=t; float m=-FLT_MAX; int bin=n*1176; int bwoc=oc*150;\n #pragma unroll\n for(int dy=0;dy<2;++dy){#pragma unroll\n for(int dx=0;dx<2;++dx){int oy=py*2+dy, ox=px*2+dx; float s=b[oc];\n #pragma unroll\n for(int ic=0;ic<6;++ic){int ib=bin+ic*196; int bw=bwoc+ic*25;\n #pragma unroll\n for(int ky=0;ky<5;++ky){#pragma unroll\n for(int kx=0;kx<5;++kx) s=fmaf(x[ib+(oy+ky)*14+(ox+kx)],w[bw+ky*5+kx],s);\n }} m=fmaxf(m,s);\n }} y[idx]=fmaxf(m,0.0f);\n}\n\n#define TM 16\n#define TN 16\n#define TK 32\n__global__ void linear_tiled_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ b,float* __restrict__ y,int B,int K,int N,int relu){\n __shared__ float As[TM][TK];\n __shared__ float Bs[TK][TN];\n int row=blockIdx.y*TM+threadIdx.y;\n int col=blockIdx.x*TN+threadIdx.x;\n float acc = (col<N ? b[col] : 0.0f);\n int tid=threadIdx.y*blockDim.x+threadIdx.x;\n for(int kk=0; kk<K; kk+=TK){\n for(int i=tid;i<TM*TK;i+=TM*TN){int r=i/TK; int k=i-r*TK; int gr=blockIdx.y*TM+r; int gk=kk+k; As[r][k]=(gr<B && gk<K)? x[gr*K+gk] : 0.0f;}\n for(int i=tid;i<TK*TN;i+=TM*TN){int k=i/TN; int c=i-k*TN; int gc=blockIdx.x*TN+c; int gk=kk+k; Bs[k][c]=(gc<N && gk<K)? w[gc*K+gk] : 0.0f;}\n __syncthreads();\n #pragma unroll\n for(int k=0;k<TK;++k) acc=fmaf(As[threadIdx.y][k], Bs[k][threadIdx.x], acc);\n __syncthreads();\n }\n if(row<B && col<N){ if(relu) acc=fmaxf(acc,0.0f); y[row*N+col]=acc; }\n}\n\ntorch::Tensor lenet_forward(torch::Tensor x, torch::Tensor c1w, torch::Tensor c1b, torch::Tensor c2w, torch::Tensor c2b, torch::Tensor f1w, torch::Tensor f1b, torch::Tensor f2w, torch::Tensor f2b, torch::Tensor f3w, torch::Tensor f3b){\n int B=x.size(0); int C=f3w.size(0); auto opts=x.options(); auto y1=torch::empty({B,6,14,14},opts); auto y2=torch::empty({B,16,5,5},opts); auto y3=torch::empty({B,120},opts); auto y4=torch::empty({B,84},opts); auto out=torch::empty({B,C},opts); cudaStream_t stream=at::cuda::getCurrentCUDAStream(); int threads=256;\n conv1_pool_kernel<<<(B*6*14*14+threads-1)/threads,threads,0,stream>>>(x.data_ptr<float>(),c1w.data_ptr<float>(),c1b.data_ptr<float>(),y1.data_ptr<float>(),B);\n conv2_pool_kernel<<<(B*16*5*5+threads-1)/threads,threads,0,stream>>>(y1.data_ptr<float>(),c2w.data_ptr<float>(),c2b.data_ptr<float>(),y2.data_ptr<float>(),B);\n dim3 block(TN,TM); dim3 grid1((120+TN-1)/TN,(B+TM-1)/TM); linear_tiled_kernel<<<grid1,block,0,stream>>>(y2.data_ptr<float>(),f1w.data_ptr<float>(),f1b.data_ptr<float>(),y3.data_ptr<float>(),B,400,120,1);\n dim3 grid2((84+TN-1)/TN,(B+TM-1)/TM); linear_tiled_kernel<<<grid2,block,0,stream>>>(y3.data_ptr<float>(),f2w.data_ptr<float>(),f2b.data_ptr<float>(),y4.data_ptr<float>(),B,120,84,1);\n dim3 grid3((C+TN-1)/TN,(B+TM-1)/TM); linear_tiled_kernel<<<grid3,block,0,stream>>>(y4.data_ptr<float>(),f3w.data_ptr<float>(),f3b.data_ptr<float>(),out.data_ptr<float>(),B,84,C,0);\n return out;}\n\"\"\"\n\n_ext=load_inline(name=\"lenet5_fused_ext_v3\",cpp_sources=cpp_src,cuda_sources=cuda_src,functions=[\"lenet_forward\"],extra_cuda_cflags=[\"-O3\"],extra_cflags=[\"-O3\"],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,num_classes):\n super(ModelNew,self).__init__(); self.conv1=nn.Conv2d(1,6,5,1); self.conv2=nn.Conv2d(6,16,5,1); self.fc1=nn.Linear(400,120); self.fc2=nn.Linear(120,84); self.fc3=nn.Linear(84,num_classes)\n def forward(self,x):\n return _ext.lenet_forward(x,self.conv1.weight,self.conv1.bias,self.conv2.weight,self.conv2.bias,self.fc1.weight,self.fc1.bias,self.fc2.weight,self.fc2.bias,self.fc3.weight,self.fc3.bias)\n"
}