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 L, double eps);\nstd::vector<torch::Tensor> hmc_forward(torch::Tensor q, torch::Tensor p0, torch::Tensor u, int64_t L, double eps) { return hmc_forward_cuda(q, p0, u, L, eps); }\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 <vector>\n#include <cmath>\n\n__device__ __forceinline__ float row_delta(float qi, float pi, float aq, float ap, float bq, float bp, float &qf) {\n qf = aq * qi + ap * pi;\n float pf = bq * qi + bp * pi;\n return 0.5f * ((qi * qi + pi * pi) - (qf * qf + pf * pf));\n}\n\n__global__ __launch_bounds__(32, 16) void hmc64_kernel(const float* __restrict__ q0, const float* __restrict__ p0,\n const float* __restrict__ u, float* __restrict__ qout, bool* __restrict__ acc,\n float aq, float ap, float bq, float bp) {\n int b = blockIdx.x;\n int lane = threadIdx.x;\n int idx0 = (b << 6) + lane;\n int idx1 = idx0 + 32;\n float qi0 = q0[idx0], pi0 = p0[idx0], qf0;\n float qi1 = q0[idx1], pi1 = p0[idx1], qf1;\n float delta = row_delta(qi0, pi0, aq, ap, bq, bp, qf0) + row_delta(qi1, pi1, aq, ap, bq, bp, qf1);\n unsigned mask = 0xffffffffu;\n delta += __shfl_down_sync(mask, delta, 16);\n delta += __shfl_down_sync(mask, delta, 8);\n delta += __shfl_down_sync(mask, delta, 4);\n delta += __shfl_down_sync(mask, delta, 2);\n delta += __shfl_down_sync(mask, delta, 1);\n int accept = 0;\n if (lane == 0) {\n accept = (logf(fmaxf(u[b], 1.0e-10f)) < delta);\n acc[b] = (accept != 0);\n }\n accept = __shfl_sync(mask, accept, 0);\n qout[idx0] = accept ? qf0 : qi0;\n qout[idx1] = accept ? qf1 : qi1;\n}\n\n__global__ __launch_bounds__(32, 16) void hmc_warp_kernel(const float* __restrict__ q0, const float* __restrict__ p0,\n const float* __restrict__ u, float* __restrict__ qout, bool* __restrict__ acc,\n int D, float aq, float ap, float bq, float bp) {\n int b = blockIdx.x, lane = threadIdx.x, base = b * D;\n float delta = 0.0f;\n for (int d = lane; d < D; d += 32) {\n float qi = q0[base+d], pi = p0[base+d], qf;\n delta += row_delta(qi, pi, aq, ap, bq, bp, qf);\n }\n unsigned mask = 0xffffffffu;\n delta += __shfl_down_sync(mask, delta, 16); delta += __shfl_down_sync(mask, delta, 8); delta += __shfl_down_sync(mask, delta, 4); delta += __shfl_down_sync(mask, delta, 2); delta += __shfl_down_sync(mask, delta, 1);\n int accept = 0;\n if (lane == 0) { accept = (logf(fmaxf(u[b], 1.0e-10f)) < delta); acc[b] = (accept != 0); }\n accept = __shfl_sync(mask, accept, 0);\n for (int d = lane; d < D; d += 32) {\n float qi = q0[base+d], pi = p0[base+d];\n float qf = aq * qi + ap * pi;\n qout[base+d] = accept ? qf : qi;\n }\n}\n\nstd::vector<torch::Tensor> hmc_forward_cuda(torch::Tensor q, torch::Tensor p0, torch::Tensor u, int64_t L64, double epsd) {\n int B=(int)q.size(0), D=(int)q.size(1);\n auto qout=torch::empty_like(q);\n auto acc=torch::empty({B}, torch::TensorOptions().device(q.device()).dtype(torch::kBool));\n float eps=(float)epsd;\n float aq=1.0f, ap=0.0f, bq=-0.5f*eps, bp=1.0f;\n int L=(int)L64;\n for(int i=0;i<L-1;++i){ aq=aq+eps*bq; ap=ap+eps*bp; bq=bq-eps*aq; bp=bp-eps*ap; }\n aq=aq+eps*bq; ap=ap+eps*bp; bq=bq-0.5f*eps*aq; bp=bp-0.5f*eps*ap;\n cudaStream_t st=at::cuda::getCurrentCUDAStream();\n if (D == 64) hmc64_kernel<<<B,32,0,st>>>(q.data_ptr<float>(),p0.data_ptr<float>(),u.data_ptr<float>(),qout.data_ptr<float>(),acc.data_ptr<bool>(),aq,ap,bq,bp);\n else hmc_warp_kernel<<<B,32,0,st>>>(q.data_ptr<float>(),p0.data_ptr<float>(),u.data_ptr<float>(),qout.data_ptr<float>(),acc.data_ptr<bool>(),D,aq,ap,bq,bp);\n return {qout, acc};\n}\n\"\"\"\n_ext = load_inline(name=\"hmc_inline_ext_v5\", cpp_sources=_cpp_src, cuda_sources=_cuda_src, functions=[\"hmc_forward\"], extra_cflags=[\"-O3\"], extra_cuda_cflags=[\"-O3\", \"--use_fast_math\"], 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: torch.Tensor) -> tuple:\n p=torch.randn_like(q); u=torch.rand((q.shape[0],), device=q.device); return tuple(_ext.hmc_forward(q,p,u,int(self.num_leapfrog_steps),float(self.step_size)))\n"
}