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 conv_t1d_cuda(torch::Tensor x, torch::Tensor weight, torch::Tensor bias,int64_t stride,int64_t padding,int64_t dilation,bool has_bias);\ntorch::Tensor conv_t1d(torch::Tensor x, torch::Tensor weight, torch::Tensor bias,int64_t stride,int64_t padding,int64_t dilation,bool has_bias){return conv_t1d_cuda(x,weight,bias,stride,padding,dilation,has_bias);}\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 BX 128\n#define OT 16\n__device__ __forceinline__ float tf32muladd(float a,float b,float c){ return fmaf(__float_to_tf32(a), __float_to_tf32(b), c); }\n__global__ void opt(const float* __restrict__ x,const float* __restrict__ w,const float* __restrict__ bias,float* __restrict__ out,int B,int Cin,int Cout,int L,int Lout,bool has_bias){\n int j=blockIdx.x*BX+threadIdx.x; int ocb=blockIdx.y*OT; int b=blockIdx.z; if(j>=L) return; float acc[OT];\n #pragma unroll\n for(int o=0;o<OT;o++){int oc=ocb+o; acc[o]=(has_bias&&oc<Cout)?bias[oc]:0.f;}\n const float* xb=x+(long long)b*Cin*L;\n for(int ic=0; ic<Cin; ++ic){\n const float* xic=xb+(long long)ic*L; float xv0=(j+1<L)?xic[j+1]:0.f; float xv1=xic[j]; float xv2=(j>0)?xic[j-1]:0.f; const float* wic=w+(long long)ic*Cout*3+ocb*3;\n #pragma unroll\n for(int o=0;o<OT;o++){ if(ocb+o<Cout){const float* wp=wic+o*3; acc[o]=tf32muladd(xv0,wp[0],acc[o]); acc[o]=tf32muladd(xv1,wp[1],acc[o]); acc[o]=tf32muladd(xv2,wp[2],acc[o]);} }\n }\n #pragma unroll\n for(int o=0;o<OT;o++){int oc=ocb+o; if(oc<Cout){float even=has_bias?bias[oc]:0.f; float* yo=out+((long long)b*Cout+oc)*Lout; yo[2*j]=even; yo[2*j+1]=acc[o]; if(j==L-1) yo[2*L]=even;}}\n}\n__global__ void gen(const float* x,const float* w,const float* bias,float* out,long long total,int B,int Cin,int Cout,int K,int L,int Lout,int stride,int padding,int dilation,bool has_bias){long long idx=(long long)blockIdx.x*blockDim.x+threadIdx.x; if(idx>=total)return; int pos=idx%Lout; long long t=idx/Lout; int oc=t%Cout; int b=t/Cout; float sum=has_bias?bias[oc]:0.f; for(int ic=0;ic<Cin;ic++){const float* xic=x+((long long)b*Cin+ic)*L; const float* wic=w+((long long)ic*Cout+oc)*K; for(int k=0;k<K;k++){int num=pos+padding-k*dilation; if(num>=0 && num%stride==0){int ip=num/stride; if(ip>=0&&ip<L) sum=fmaf(xic[ip],wic[k],sum);}}} out[idx]=sum;}\ntorch::Tensor conv_t1d_cuda(torch::Tensor x,torch::Tensor weight,torch::Tensor bias,int64_t stride64,int64_t padding64,int64_t dilation64,bool has_bias){int B=x.size(0),Cin=x.size(1),L=x.size(2),Cout=weight.size(1),K=weight.size(2); int stride=stride64,padding=padding64,dilation=dilation64; int Lout=(L-1)*stride-2*padding+dilation*(K-1)+1; auto out=torch::empty({B,Cout,Lout},x.options()); cudaStream_t s=at::cuda::getCurrentCUDAStream(); if(stride==2&&padding==1&&dilation==2&&K==3&&Lout==2*L+1){dim3 block(BX),grid((L+BX-1)/BX,(Cout+OT-1)/OT,B); opt<<<grid,block,0,s>>>(x.data_ptr<float>(),weight.data_ptr<float>(),has_bias?bias.data_ptr<float>():nullptr,out.data_ptr<float>(),B,Cin,Cout,L,Lout,has_bias);} else {long long total=(long long)B*Cout*Lout; gen<<<(total+255)/256,256,0,s>>>(x.data_ptr<float>(),weight.data_ptr<float>(),has_bias?bias.data_ptr<float>():nullptr,out.data_ptr<float>(),total,B,Cin,Cout,K,L,Lout,stride,padding,dilation,has_bias);} return out;}\n'''\n_ext=load_inline(name='conv_t1d_ext_opt_v4',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['conv_t1d'],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,bias:bool=False):\n super().__init__(); self.conv1d_transpose=nn.ConvTranspose1d(in_channels,out_channels,kernel_size,stride=stride,padding=padding,dilation=dilation,bias=bias); self.stride=stride; self.padding=padding; self.dilation=dilation\n def forward(self,x):\n b=self.conv1d_transpose.bias; hb=b is not None\n if b is None: b=torch.empty(0,device=x.device,dtype=x.dtype)\n return _ext.conv_t1d(x,self.conv1d_transpose.weight,b,self.stride,self.padding,self.dilation,hb)\n"
}