call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp_src=r\"\"\"\n#include <torch/extension.h>\ntorch::Tensor maxpool3d_forward(torch::Tensor x, int64_t kernel_size, c10::optional<int64_t> stride_opt, int64_t padding, int64_t dilation, bool return_indices, bool ceil_mode);\n\"\"\"\n_cuda_src=r\"\"\"\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda_runtime.h>\n#include <cfloat>\n\n__device__ __forceinline__ int off11(int i){\n // i 0..10 -> 0,2,3,4,5,6,7,8,9,10,12\n return (i==0) ? 0 : (i==10 ? 12 : i+1);\n}\n__device__ __forceinline__ int idx11(int off){\n return (off==0) ? 0 : (off==12 ? 10 : off-1);\n}\n\n__global__ void maxpool3d_tile44_kernel(const float* __restrict__ x, float* __restrict__ y) {\n extern __shared__ float sm[]; // 11*11*128\n int tileH = blockIdx.x & 15; // 0..15\n int tileD = (blockIdx.x >> 4) & 15;\n long nc = blockIdx.x >> 8;\n int od_base = tileD * 4;\n int oh_base = tileH * 4;\n int id_base = od_base * 2 - 1;\n int ih_base = oh_base * 2 - 1;\n long nc_base = nc * 2097152L;\n int tid = threadIdx.x;\n for (int r=tid; r<11*11*128; r+=blockDim.x) {\n int w = r & 127;\n int tmp = r >> 7;\n int hi = tmp % 11;\n int di = tmp / 11;\n int id = id_base + off11(di);\n int ih = ih_base + off11(hi);\n float val = -FLT_MAX;\n if ((unsigned)id < 128u && (unsigned)ih < 128u) {\n val = x[nc_base + (long)id*16384L + (long)ih*128L + w];\n }\n sm[r] = val;\n }\n __syncthreads();\n for (int p=tid; p<4*4*62; p+=blockDim.x) {\n int ow = p % 62;\n int q = p / 62;\n int loh = q & 3;\n int lod = q >> 2;\n int od = od_base + lod;\n int oh = oh_base + loh;\n if (od < 62 && oh < 62) {\n int iw0 = ow*2 - 1;\n float m = -FLT_MAX;\n #pragma unroll\n for (int kd=0; kd<3; ++kd) {\n int di = idx11(lod*2 + kd*3);\n #pragma unroll\n for (int kh=0; kh<3; ++kh) {\n int hi = idx11(loh*2 + kh*3);\n int base = ((di*11 + hi) << 7);\n if (iw0 >= 0) m = fmaxf(m, sm[base + iw0]);\n m = fmaxf(m, sm[base + iw0 + 3]);\n m = fmaxf(m, sm[base + iw0 + 6]);\n }\n }\n y[((nc*62L + od)*62L + oh)*62L + ow] = m;\n }\n }\n}\n\n__global__ void generic(const float* x,float*y,long total,int D,int H,int W,int OD,int OH,int OW,int K,int S,int P,int Dil){\n long idx=(long)blockIdx.x*blockDim.x+threadIdx.x; if(idx>=total)return; int ow=idx%OW; long t=idx/OW; int oh=t%OH; t/=OH; int od=t%OD; long nc=t/OD; float m=-FLT_MAX; int id0=od*S-P,ih0=oh*S-P,iw0=ow*S-P; long nb=nc*(long)D*H*W; for(int kd=0;kd<K;++kd){int id=id0+kd*Dil; if((unsigned)id<(unsigned)D) for(int kh=0;kh<K;++kh){int ih=ih0+kh*Dil; if((unsigned)ih<(unsigned)H){long hb=nb+((long)id*H+ih)*W; for(int kw=0;kw<K;++kw){int iw=iw0+kw*Dil; if((unsigned)iw<(unsigned)W)m=fmaxf(m,x[hb+iw]);}}}} y[idx]=m; }\n\ntorch::Tensor maxpool3d_forward(torch::Tensor x,int64_t K,c10::optional<int64_t> stride_opt,int64_t P,int64_t Dil,bool return_indices,bool ceil_mode){\n int64_t N=x.size(0),C=x.size(1),D=x.size(2),H=x.size(3),W=x.size(4); int64_t S=stride_opt.has_value()?stride_opt.value():K; int64_t OD=(D+2*P-Dil*(K-1)-1)/S+1,OH=(H+2*P-Dil*(K-1)-1)/S+1,OW=(W+2*P-Dil*(K-1)-1)/S+1; auto y=torch::empty({N,C,OD,OH,OW},x.options()); cudaStream_t stream=at::cuda::getCurrentCUDAStream(); long total=N*C*OD*OH*OW; if(K==3&&S==2&&P==1&&Dil==3&&!ceil_mode&&D==128&&H==128&&W==128&&OD==62&&OH==62&&OW==62&&x.scalar_type()==at::kFloat){ maxpool3d_tile44_kernel<<<(long)N*C*16*16,256,11*11*128*sizeof(float),stream>>>(x.data_ptr<float>(),y.data_ptr<float>()); } else { generic<<<(total+255)/256,256,0,stream>>>(x.data_ptr<float>(),y.data_ptr<float>(),total,(int)D,(int)H,(int)W,(int)OD,(int)OH,(int)OW,(int)K,(int)S,(int)P,(int)Dil); } return y; }\n\"\"\"\n_ext=load_inline(name=\"maxpool3d_ext_tile44\",cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=[\"maxpool3d_forward\"],extra_cuda_cflags=[\"-O3\",\"--use_fast_math\"],extra_cflags=[\"-O3\"],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,kernel_size:int,stride:int=None,padding:int=0,dilation:int=1,return_indices:bool=False,ceil_mode:bool=False):\n super().__init__(); self.kernel_size=int(kernel_size); self.stride=stride; self.padding=int(padding); self.dilation=int(dilation); self.return_indices=bool(return_indices); self.ceil_mode=bool(ceil_mode)\n def forward(self,x):\n return _ext.maxpool3d_forward(x,self.kernel_size,self.stride,self.padding,self.dilation,self.return_indices,self.ceil_mode)\n"
}