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 matvec_forward(torch::Tensor A, torch::Tensor B);\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#include <c10/cuda/CUDAException.h>\n#define THREADS 512\n#define WARPS 16\nstatic __inline__ __device__ float warp_reduce_sum(float v){#pragma unroll for(int o=16;o>0;o>>=1) v+=__shfl_down_sync(0xffffffff,v,o); return v;}\n__global__ __launch_bounds__(THREADS,2)\nvoid matvec8_kernel(const float* __restrict__ A,const float* __restrict__ B,float* __restrict__ C,int M,int K){\n int tid=threadIdx.x; int base=blockIdx.x*8; int K4=K>>2; const float4* __restrict__ B4=(const float4*)B;\n float s0=0.f,s1=0.f,s2=0.f,s3=0.f,s4=0.f,s5=0.f,s6=0.f,s7=0.f;\n const float4* __restrict__ A0=(const float4*)(A+(long long)(base+0)*K);\n const float4* __restrict__ A1=(const float4*)(A+(long long)(base+1)*K);\n const float4* __restrict__ A2=(const float4*)(A+(long long)(base+2)*K);\n const float4* __restrict__ A3=(const float4*)(A+(long long)(base+3)*K);\n const float4* __restrict__ A4=(const float4*)(A+(long long)(base+4)*K);\n const float4* __restrict__ A5=(const float4*)(A+(long long)(base+5)*K);\n const float4* __restrict__ A6=(const float4*)(A+(long long)(base+6)*K);\n const float4* __restrict__ A7=(const float4*)(A+(long long)(base+7)*K);\n for(int i=tid;i<K4;i+=THREADS){\n float4 b=B4[i];\n float4 a=A0[i]; s0=fmaf(a.x,b.x,s0); s0=fmaf(a.y,b.y,s0); s0=fmaf(a.z,b.z,s0); s0=fmaf(a.w,b.w,s0);\n a=A1[i]; s1=fmaf(a.x,b.x,s1); s1=fmaf(a.y,b.y,s1); s1=fmaf(a.z,b.z,s1); s1=fmaf(a.w,b.w,s1);\n a=A2[i]; s2=fmaf(a.x,b.x,s2); s2=fmaf(a.y,b.y,s2); s2=fmaf(a.z,b.z,s2); s2=fmaf(a.w,b.w,s2);\n a=A3[i]; s3=fmaf(a.x,b.x,s3); s3=fmaf(a.y,b.y,s3); s3=fmaf(a.z,b.z,s3); s3=fmaf(a.w,b.w,s3);\n a=A4[i]; s4=fmaf(a.x,b.x,s4); s4=fmaf(a.y,b.y,s4); s4=fmaf(a.z,b.z,s4); s4=fmaf(a.w,b.w,s4);\n a=A5[i]; s5=fmaf(a.x,b.x,s5); s5=fmaf(a.y,b.y,s5); s5=fmaf(a.z,b.z,s5); s5=fmaf(a.w,b.w,s5);\n a=A6[i]; s6=fmaf(a.x,b.x,s6); s6=fmaf(a.y,b.y,s6); s6=fmaf(a.z,b.z,s6); s6=fmaf(a.w,b.w,s6);\n a=A7[i]; s7=fmaf(a.x,b.x,s7); s7=fmaf(a.y,b.y,s7); s7=fmaf(a.z,b.z,s7); s7=fmaf(a.w,b.w,s7);\n }\n s0=warp_reduce_sum(s0);s1=warp_reduce_sum(s1);s2=warp_reduce_sum(s2);s3=warp_reduce_sum(s3);s4=warp_reduce_sum(s4);s5=warp_reduce_sum(s5);s6=warp_reduce_sum(s6);s7=warp_reduce_sum(s7);\n __shared__ float sm[8][WARPS]; int lane=tid&31, warp=tid>>5; if(lane==0){sm[0][warp]=s0;sm[1][warp]=s1;sm[2][warp]=s2;sm[3][warp]=s3;sm[4][warp]=s4;sm[5][warp]=s5;sm[6][warp]=s6;sm[7][warp]=s7;} __syncthreads();\n if(warp==0){float t0=(lane<WARPS)?sm[0][lane]:0.f,t1=(lane<WARPS)?sm[1][lane]:0.f,t2=(lane<WARPS)?sm[2][lane]:0.f,t3=(lane<WARPS)?sm[3][lane]:0.f,t4=(lane<WARPS)?sm[4][lane]:0.f,t5=(lane<WARPS)?sm[5][lane]:0.f,t6=(lane<WARPS)?sm[6][lane]:0.f,t7=(lane<WARPS)?sm[7][lane]:0.f; t0=warp_reduce_sum(t0);t1=warp_reduce_sum(t1);t2=warp_reduce_sum(t2);t3=warp_reduce_sum(t3);t4=warp_reduce_sum(t4);t5=warp_reduce_sum(t5);t6=warp_reduce_sum(t6);t7=warp_reduce_sum(t7); if(lane==0){C[base]=t0;C[base+1]=t1;C[base+2]=t2;C[base+3]=t3;C[base+4]=t4;C[base+5]=t5;C[base+6]=t6;C[base+7]=t7;}}\n}\ntorch::Tensor matvec_forward(torch::Tensor A,torch::Tensor B){int M=(int)A.size(0),K=(int)A.size(1);auto C=torch::empty({M,1},A.options());cudaStream_t stream=at::cuda::getCurrentCUDAStream();matvec8_kernel<<<M/8,THREADS,0,stream>>>(A.data_ptr<float>(),B.data_ptr<float>(),C.data_ptr<float>(),M,K);C10_CUDA_KERNEL_LAUNCH_CHECK();return C;}\n\"\"\"\n_ext=load_inline(name=\"matvec_ext_v4\", cpp_sources=[_cpp_src], cuda_sources=[_cuda_src], functions=[\"matvec_forward\"], extra_cuda_cflags=[\"-O3\",\"--use_fast_math\"], extra_cflags=[\"-O3\"], verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self): super(ModelNew,self).__init__()\n def forward(self,A:torch.Tensor,B:torch.Tensor)->torch.Tensor: return _ext.matvec_forward(A,B)\n"
}