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 dot_forward_cuda(torch::Tensor src_idx, torch::Tensor dst_idx, torch::Tensor src_feat, torch::Tensor dst_feat);\ntorch::Tensor dot_forward(torch::Tensor src_idx, torch::Tensor dst_idx, torch::Tensor src_feat, torch::Tensor dst_feat){return dot_forward_cuda(src_idx,dst_idx,src_feat,dst_feat);}'''\n_cuda_src=r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda_runtime.h>\ntemplate<typename T> __device__ __forceinline__ int cvt(T x){return (int)x;}\ntemplate<> __device__ __forceinline__ int cvt<float>(float x){return __float2int_rz(x);} \ntemplate<typename T>\n__global__ __launch_bounds__(256,2) void kern16(const T* __restrict__ si,const T* __restrict__ di,const float* __restrict__ sf,const float* __restrict__ df,float* __restrict__ out,int E){\n int tid=threadIdx.x, group=tid>>4, lane=tid&15, e=(blockIdx.x<<4)+group; if(e>=E)return;\n int s=cvt<T>(si[e]), d=cvt<T>(di[e]); const float* sp=sf+((long long)s<<7); const float* dp=df+((long long)d<<7);\n float sum=0.f;\n #pragma unroll\n for(int off=0; off<128; off+=16) sum += sp[lane+off]*dp[lane+off];\n unsigned mask = 0xffffu << ((tid & 16));\n sum += __shfl_down_sync(mask,sum,8,16); sum += __shfl_down_sync(mask,sum,4,16); sum += __shfl_down_sync(mask,sum,2,16); sum += __shfl_down_sync(mask,sum,1,16);\n if(lane==0) out[e]=sum;\n}\ntorch::Tensor dot_forward_cuda(torch::Tensor si,torch::Tensor di,torch::Tensor sf,torch::Tensor df){int E=si.numel(); auto out=torch::empty({E},sf.options()); dim3 block(256),grid((E+15)/16); auto stream=at::cuda::getCurrentCUDAStream(); if(si.scalar_type()==torch::kFloat32) kern16<float><<<grid,block,0,stream>>>(si.data_ptr<float>(),di.data_ptr<float>(),sf.data_ptr<float>(),df.data_ptr<float>(),out.data_ptr<float>(),E); else if(si.scalar_type()==torch::kInt32) kern16<int><<<grid,block,0,stream>>>(si.data_ptr<int>(),di.data_ptr<int>(),sf.data_ptr<float>(),df.data_ptr<float>(),out.data_ptr<float>(),E); else kern16<long long><<<grid,block,0,stream>>>(reinterpret_cast<const long long*>(si.data_ptr<int64_t>()),reinterpret_cast<const long long*>(di.data_ptr<int64_t>()),sf.data_ptr<float>(),df.data_ptr<float>(),out.data_ptr<float>(),E); return out;}\n'''\n_ext=load_inline(name='edge_dot_ext_v8_16lane',cpp_sources=[_cpp_src],cuda_sources=[_cuda_src],functions=['dot_forward'],extra_cflags=['-O3'],extra_cuda_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self): super().__init__()\n def forward(self,src_idx,dst_idx,src_feat,dst_feat): return _ext.dot_forward(src_idx,dst_idx,src_feat,dst_feat)\n"
}