call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cpp_src = r'''\n#include <torch/extension.h>\nvoid deconv_gap_launch(const float* x, const float* weight, const float* bias, float* agg, float* out,\n int N, int Cin, int H, int W, int Cout, float multiplier);\ntorch::Tensor deconv_gap_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias, double multiplier) {\n int N=(int)x.size(0), Cin=(int)x.size(1), H=(int)x.size(2), W=(int)x.size(3), Cout=(int)weight.size(1);\n auto out=torch::empty({N,Cout,1,1}, x.options());\n auto agg=torch::empty({N,Cin,4}, x.options());\n deconv_gap_launch(x.data_ptr<float>(), weight.data_ptr<float>(), bias.data_ptr<float>(), agg.data_ptr<float>(), out.data_ptr<float>(), N,Cin,H,W,Cout,(float)multiplier);\n return out;\n}\n'''\n_cuda_src = r'''\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <ATen/cuda/CUDAContext.h>\n\n__device__ __forceinline__ void warp_reduce3(float &a, float &b, float &c) {\n unsigned mask = 0xffffffffu;\n #pragma unroll\n for (int off=16; off>0; off>>=1) {\n a += __shfl_down_sync(mask, a, off);\n b += __shfl_down_sync(mask, b, off);\n c += __shfl_down_sync(mask, c, off);\n }\n}\n__device__ __forceinline__ float warp_reduce1(float a) {\n unsigned mask = 0xffffffffu;\n #pragma unroll\n for (int off=16; off>0; off>>=1) a += __shfl_down_sync(mask, a, off);\n return a;\n}\n\n__global__ void aggregate_kernel(const float* __restrict__ x, float* __restrict__ agg, int Cin, int H, int W) {\n int nci=blockIdx.x, tid=threadIdx.x;\n int HW=H*W;\n const float* base=x+(long long)nci*HW;\n float sum=0.f;\n for(int idx=tid; idx<HW; idx+=blockDim.x) sum += base[idx];\n float row=0.f;\n for(int j=tid; j<W; j+=blockDim.x) row += base[j];\n float col=0.f;\n for(int i=tid; i<H; i+=blockDim.x) col += base[(long long)i*W];\n warp_reduce3(sum,row,col);\n __shared__ float ss[8], sr[8], sc[8];\n int lane=tid&31, warp=tid>>5;\n if(lane==0){ ss[warp]=sum; sr[warp]=row; sc[warp]=col; }\n __syncthreads();\n if(warp==0){\n sum = (lane < (blockDim.x>>5)) ? ss[lane] : 0.f;\n row = (lane < (blockDim.x>>5)) ? sr[lane] : 0.f;\n col = (lane < (blockDim.x>>5)) ? sc[lane] : 0.f;\n warp_reduce3(sum,row,col);\n if(lane==0){\n long long o=(long long)nci*4;\n agg[o+0]=sum; agg[o+1]=row; agg[o+2]=col; agg[o+3]=base[0];\n }\n }\n}\n\n__global__ void output_kernel(const float* __restrict__ agg, const float* __restrict__ weight, const float* __restrict__ bias,\n float* __restrict__ out, int Cin, int H, int W, int Cout, float multiplier) {\n int nco=blockIdx.x, co=nco % Cout, n=nco / Cout, tid=threadIdx.x;\n float val=0.f;\n for(int ci=tid; ci<Cin; ci+=blockDim.x){\n const float* a=agg+(((long long)n*Cin+ci)*4);\n float all=a[0], row=a[1], col=a[2], corner=a[3];\n const float* wb=weight+(((long long)ci*Cout+co)*9);\n float w00=wb[0], w01=wb[1], w02=wb[2];\n float w10=wb[3], w11=wb[4], w12=wb[5];\n float w20=wb[6], w21=wb[7], w22=wb[8];\n float sall=w00+w01+w02+w10+w11+w12+w20+w21+w22;\n float srow=w10+w11+w12+w20+w21+w22;\n float scol=w01+w02+w11+w12+w21+w22;\n float scorner=w11+w12+w21+w22;\n val += all*sall + row*(srow-sall) + col*(scol-sall) + corner*(scorner-srow-scol+sall);\n }\n val = warp_reduce1(val);\n __shared__ float sh[2];\n int lane=tid&31, warp=tid>>5;\n if(lane==0) sh[warp]=val;\n __syncthreads();\n if(tid==0){\n float total=sh[0]+sh[1];\n float area=(float)(4*H*W);\n out[(long long)n*Cout+co]=multiplier*(bias[co]+total/area);\n }\n}\n\nvoid deconv_gap_launch(const float* x, const float* weight, const float* bias, float* agg, float* out,\n int N, int Cin, int H, int W, int Cout, float multiplier) {\n cudaStream_t stream=at::cuda::getCurrentCUDAStream();\n aggregate_kernel<<<N*Cin,256,0,stream>>>(x,agg,Cin,H,W);\n output_kernel<<<N*Cout,64,0,stream>>>(agg,weight,bias,out,Cin,H,W,Cout,multiplier);\n}\n'''\n_ext=load_inline(name='deconv_gap_ext_v2', cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=['deconv_gap_forward'], verbose=False, extra_cuda_cflags=['-O3'], extra_cflags=['-O3'])\nclass ModelNew(nn.Module):\n def __init__(self, in_channels, out_channels, kernel_size, stride, padding, output_padding, multiplier):\n super(ModelNew,self).__init__()\n self.conv_transpose=nn.ConvTranspose2d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,output_padding=output_padding)\n self.multiplier=multiplier\n def forward(self,x):\n return _ext.deconv_gap_forward(x,self.conv_transpose.weight,self.conv_transpose.bias,float(self.multiplier))\n"
}