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>\n#include <vector>\nstd::vector<torch::Tensor> hmc_forward_cuda(torch::Tensor q, torch::Tensor p0, torch::Tensor u, int64_t steps, double eps);\nstd::vector<torch::Tensor> hmc_forward(torch::Tensor q, torch::Tensor p0, torch::Tensor u, int64_t steps, double eps){return hmc_forward_cuda(q,p0,u,steps,eps);}'''\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 <vector>\n__inline__ __device__ float warp_sum(float v){v+=__shfl_down_sync(0xffffffff,v,16);v+=__shfl_down_sync(0xffffffff,v,8);v+=__shfl_down_sync(0xffffffff,v,4);v+=__shfl_down_sync(0xffffffff,v,2);v+=__shfl_down_sync(0xffffffff,v,1);return v;}\n__global__ void hmc64_kernel(const float* __restrict__ q_in,const float* __restrict__ p0_in,const float* __restrict__ u,float* __restrict__ q_out,bool* __restrict__ acc_out,float aq,float bp,float cp,float dp){\n int b=blockIdx.x, tid=threadIdx.x; int idx=(b<<6)+tid; float q0=q_in[idx], p0=p0_in[idx]; float q=fmaf(bp,p0,aq*q0); float p=fmaf(dp,p0,cp*q0); float sum=0.5f*(q0*q0+p0*p0-q*q-p*p); sum=warp_sum(sum); __shared__ float ws[2]; __shared__ int accepted; if((tid&31)==0) ws[tid>>5]=sum; __syncthreads(); if(tid==0){float s=ws[0]+ws[1]; int a=(u[b]<__expf(s)); accepted=a; acc_out[b]=(bool)a;} __syncthreads(); q_out[idx]=accepted?q:q0;}\n__global__ void hmc_generic_kernel(const float* __restrict__ q_in,const float* __restrict__ p0_in,const float* __restrict__ u,float* __restrict__ q_out,bool* __restrict__ acc_out,int D,float aq,float bp,float cp,float dp){int b=blockIdx.x,tid=threadIdx.x; extern __shared__ float smem[]; float sum=0.f,q0=0.f,p0=0.f,q=0.f,p=0.f; if(tid<D){int idx=b*D+tid; q0=q_in[idx]; p0=p0_in[idx]; q=fmaf(bp,p0,aq*q0); p=fmaf(dp,p0,cp*q0); sum=0.5f*(q0*q0+p0*p0-q*q-p*p);} smem[tid]=sum; __syncthreads(); for(int s=blockDim.x>>1;s>0;s>>=1){if(tid<s) smem[tid]+=smem[tid+s]; __syncthreads();} bool acc=false; if(tid==0){acc=(u[b]<__expf(smem[0])); acc_out[b]=acc;} __syncthreads(); acc=acc_out[b]; if(tid<D){int idx=b*D+tid; q_out[idx]=acc?q:q0;}}\nstd::vector<torch::Tensor> hmc_forward_cuda(torch::Tensor q,torch::Tensor p0,torch::Tensor u,int64_t steps64,double epsd){int B=q.size(0),D=q.size(1); float e=(float)epsd; float aq=1.f,bp=0.f,cp=-0.5f*e,dp=1.f; for(int s=0;s<(int)steps64-1;++s){float naq=fmaf(e,cp,aq); float nbp=fmaf(e,dp,bp); float ncp=fmaf(-e,naq,cp); float ndp=fmaf(-e,nbp,dp); aq=naq;bp=nbp;cp=ncp;dp=ndp;} aq=fmaf(e,cp,aq); bp=fmaf(e,dp,bp); cp=fmaf(-0.5f*e,aq,cp); dp=fmaf(-0.5f*e,bp,dp); auto qo=torch::empty_like(q); auto acc=torch::empty({B},q.options().dtype(torch::kBool)); cudaStream_t st=at::cuda::getCurrentCUDAStream(); if(D==64){hmc64_kernel<<<B,64,0,st>>>(q.data_ptr<float>(),p0.data_ptr<float>(),u.data_ptr<float>(),qo.data_ptr<float>(),acc.data_ptr<bool>(),aq,bp,cp,dp);} else {int threads=1; while(threads<D)threads<<=1; if(threads<32)threads=32; if(threads>1024)threads=1024; hmc_generic_kernel<<<B,threads,threads*sizeof(float),st>>>(q.data_ptr<float>(),p0.data_ptr<float>(),u.data_ptr<float>(),qo.data_ptr<float>(),acc.data_ptr<bool>(),D,aq,bp,cp,dp);} return {qo,acc};}\n'''\n_ext=load_inline(name='hmc_ext_v6c',cpp_sources=[_cpp_src],cuda_sources=[_cuda_src],functions=['hmc_forward'],extra_cuda_cflags=['-O3','--use_fast_math'],extra_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,dim,num_leapfrog_steps=10,step_size=0.1):\n super().__init__(); self.dim=dim; self.num_leapfrog_steps=num_leapfrog_steps; self.step_size=step_size; self.register_buffer('mu',torch.zeros(dim))\n def forward(self,q):\n p=torch.randn_like(q); u=torch.rand((q.shape[0],),device=q.device,dtype=q.dtype); return tuple(_ext.hmc_forward(q,p,u,int(self.num_leapfrog_steps),float(self.step_size)))\n"
}