call → run_correctness
callrun_correctness
{
"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>\ntorch::Tensor depthwise_conv1d_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias, bool has_bias, int64_t stride, int64_t padding);\n\"\"\"\n_cuda_src = r\"\"\"\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#define THREADS 256\n#define TILE 1024\n\n__global__ void dwconv3p1_vec4_kernel(const float* __restrict__ x, const float* __restrict__ w,\n const float* __restrict__ bias, float* __restrict__ y,\n int C, int L, bool has_bias) {\n int row = blockIdx.y;\n int c = row % C;\n int l = blockIdx.x * TILE + threadIdx.x * 4;\n const float* xrow = x + (int64_t)row * L;\n float* yrow = y + (int64_t)row * L;\n float w0 = w[c*3+0], w1 = w[c*3+1], w2 = w[c*3+2];\n float bv = has_bias ? bias[c] : 0.0f;\n if (l + 3 < L) {\n float4 v = *reinterpret_cast<const float4*>(xrow + l);\n float xm1 = (l > 0) ? xrow[l-1] : 0.0f;\n float xp4 = (l + 4 < L) ? xrow[l+4] : 0.0f;\n yrow[l+0] = xm1*w0 + v.x*w1 + v.y*w2 + bv;\n yrow[l+1] = v.x*w0 + v.y*w1 + v.z*w2 + bv;\n yrow[l+2] = v.y*w0 + v.z*w1 + v.w*w2 + bv;\n yrow[l+3] = v.z*w0 + v.w*w1 + xp4*w2 + bv;\n } else {\n for(int j=0;j<4 && l+j<L;++j){\n int oi=l+j;\n float a = (oi>0)?xrow[oi-1]:0.0f;\n float b = xrow[oi];\n float cval = (oi+1<L)?xrow[oi+1]:0.0f;\n yrow[oi] = a*w0 + b*w1 + cval*w2 + bv;\n }\n }\n}\n\n__global__ void dwconv3s1_sh_kernel(const float* __restrict__ x, const float* __restrict__ w, const float* __restrict__ bias, float* __restrict__ y, int B, int C, int L, int Lout, int padding, bool has_bias) {\n __shared__ float sh[TILE+2];\n int row=blockIdx.y; int c=row%C; int start=blockIdx.x*TILE;\n const float* xrow=x+(int64_t)row*L; float* yrow=y+(int64_t)row*Lout;\n #pragma unroll\n for(int i=0;i<5;++i){int s=threadIdx.x+i*THREADS; if(s<TILE+2){int xi=start-padding+s; sh[s]=((unsigned)xi<(unsigned)L)?xrow[xi]:0.0f;}}\n __syncthreads();\n float w0=w[c*3],w1=w[c*3+1],w2=w[c*3+2]; float bv=has_bias?bias[c]:0.0f;\n #pragma unroll\n for(int i=0;i<4;++i){int off=threadIdx.x+i*THREADS; int out=start+off; if(out<Lout){yrow[out]=sh[off]*w0+sh[off+1]*w1+sh[off+2]*w2+bv;}}\n}\n\n__global__ void dwconv_generic_kernel(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ bias,float* __restrict__ y,int B,int C,int L,int K,int Lout,int stride,int padding,bool has_bias){\n int idx=blockIdx.x*blockDim.x+threadIdx.x; int total=B*C*Lout; for(;idx<total;idx+=blockDim.x*gridDim.x){int lo=idx%Lout; int row=idx/Lout; int c=row%C; int base=lo*stride-padding; const float* xr=x+(int64_t)row*L; const float* wc=w+(int64_t)c*K; float acc=has_bias?bias[c]:0.0f; for(int k=0;k<K;++k){int xi=base+k; if((unsigned)xi<(unsigned)L) acc+=xr[xi]*wc[k];} y[idx]=acc;}}\n\ntorch::Tensor depthwise_conv1d_forward(torch::Tensor x, torch::Tensor weight, torch::Tensor bias, bool has_bias, int64_t stride64, int64_t padding64){\n int B=x.size(0), C=x.size(1), L=x.size(2), K=weight.size(2); int stride=stride64,padding=padding64; int Lout=(L+2*padding-K)/stride+1; auto y=torch::empty({B,C,Lout}, x.options()); cudaStream_t stream=at::cuda::getCurrentCUDAStream();\n if(K==3 && stride==1 && padding==1 && Lout==L){dim3 block(THREADS); dim3 grid((L+TILE-1)/TILE, B*C); dwconv3p1_vec4_kernel<<<grid,block,0,stream>>>(x.data_ptr<float>(), weight.data_ptr<float>(), has_bias?bias.data_ptr<float>():nullptr, y.data_ptr<float>(), C, L, has_bias);} \n else if(K==3 && stride==1){dim3 block(THREADS); dim3 grid((Lout+TILE-1)/TILE, B*C); dwconv3s1_sh_kernel<<<grid,block,0,stream>>>(x.data_ptr<float>(), weight.data_ptr<float>(), has_bias?bias.data_ptr<float>():nullptr, y.data_ptr<float>(), B,C,L,Lout,padding,has_bias);} else {int total=B*C*Lout; int block=256; int grid=min((total+block-1)/block,65535); dwconv_generic_kernel<<<grid,block,0,stream>>>(x.data_ptr<float>(),weight.data_ptr<float>(),has_bias?bias.data_ptr<float>():nullptr,y.data_ptr<float>(),B,C,L,K,Lout,stride,padding,has_bias);} return y;}\n\"\"\"\n_ext=load_inline(name=\"dwconv1d_ext_v2\", cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=[\"depthwise_conv1d_forward\"], extra_cuda_cflags=[\"-O3\"], extra_cflags=[\"-O3\"], verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self, channels:int,kernel_size:int,stride:int=1,padding:int=0,bias:bool=False):\n super().__init__(); self.conv1d=nn.Conv1d(channels,channels,kernel_size,stride=stride,padding=padding,groups=channels,bias=bias); self.stride=stride; self.padding=padding\n def forward(self,x):\n b=self.conv1d.bias; has=b is not None\n if b is None: b=torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.depthwise_conv1d_forward(x.contiguous(), self.conv1d.weight.contiguous(), b, has, self.stride, self.padding)\n"
}