call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp=r'''\n#include <torch/extension.h>\ntorch::Tensor delta_attn_forward(torch::Tensor q, torch::Tensor k, torch::Tensor v, torch::Tensor gate, torch::Tensor beta);\n'''\n_cuda=r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n__global__ __launch_bounds__(32, 8)\nvoid delta_cols4_kernel(const float* __restrict__ q,const float* __restrict__ k,const float* __restrict__ v,const float* __restrict__ gate,const float* __restrict__ beta,float* __restrict__ out,int B,int T,int H,int D){\n int cg=blockIdx.x*4; int bh=blockIdx.y; int b=bh/H; int h=bh-b*H; int lane=threadIdx.x;\n float s0=0.f,s1=0.f,s2=0.f,s3=0.f;\n for(int t=0;t<T;++t){\n int gh=(b*T+t)*H+h; int base=gh*D;\n float g=gate[gh], be=beta[gh];\n float vv0=v[base+cg+0], vv1=v[base+cg+1], vv2=v[base+cg+2], vv3=v[base+cg+3];\n float p0=0.f,p1=0.f,p2=0.f,p3=0.f;\n if(lane<D){\n float ki=k[base+lane]; float qi=q[base+lane]; float bk=be*ki;\n s0=fmaf(g,s0,bk*vv0); s1=fmaf(g,s1,bk*vv1); s2=fmaf(g,s2,bk*vv2); s3=fmaf(g,s3,bk*vv3);\n p0=qi*s0; p1=qi*s1; p2=qi*s2; p3=qi*s3;\n }\n p0 += __shfl_down_sync(0xffffffff,p0,16); p1 += __shfl_down_sync(0xffffffff,p1,16); p2 += __shfl_down_sync(0xffffffff,p2,16); p3 += __shfl_down_sync(0xffffffff,p3,16);\n p0 += __shfl_down_sync(0xffffffff,p0,8); p1 += __shfl_down_sync(0xffffffff,p1,8); p2 += __shfl_down_sync(0xffffffff,p2,8); p3 += __shfl_down_sync(0xffffffff,p3,8);\n p0 += __shfl_down_sync(0xffffffff,p0,4); p1 += __shfl_down_sync(0xffffffff,p1,4); p2 += __shfl_down_sync(0xffffffff,p2,4); p3 += __shfl_down_sync(0xffffffff,p3,4);\n p0 += __shfl_down_sync(0xffffffff,p0,2); p1 += __shfl_down_sync(0xffffffff,p1,2); p2 += __shfl_down_sync(0xffffffff,p2,2); p3 += __shfl_down_sync(0xffffffff,p3,2);\n p0 += __shfl_down_sync(0xffffffff,p0,1); p1 += __shfl_down_sync(0xffffffff,p1,1); p2 += __shfl_down_sync(0xffffffff,p2,1); p3 += __shfl_down_sync(0xffffffff,p3,1);\n if(lane==0){ out[base+cg+0]=p0; out[base+cg+1]=p1; out[base+cg+2]=p2; out[base+cg+3]=p3; }\n }\n}\ntorch::Tensor delta_attn_forward(torch::Tensor q,torch::Tensor k,torch::Tensor v,torch::Tensor gate,torch::Tensor beta){int B=q.size(0),T=q.size(1),H=q.size(2),D=q.size(3); auto out=torch::empty_like(q); dim3 grid((D+3)/4,B*H); delta_cols4_kernel<<<grid,32>>>(q.data_ptr<float>(),k.data_ptr<float>(),v.data_ptr<float>(),gate.data_ptr<float>(),beta.data_ptr<float>(),out.data_ptr<float>(),B,T,H,D); return out;}\n'''\n_ext=load_inline(name='delta_attn_ext_cols4_v1c',cpp_sources=_cpp,cuda_sources=_cuda,functions=['delta_attn_forward'],verbose=False,extra_cuda_cflags=['-O3','--use_fast_math'])\nclass ModelNew(nn.Module):\n def __init__(self): super().__init__()\n def forward(self,q,k,v,gate,beta): return _ext.delta_attn_forward(q,k,v,gate,beta)\n"
}