call → submit_kernel
callsubmit_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cpp_src = r\"\"\"\n#include <torch/extension.h>\n\ntorch::Tensor gibbs_forward_cuda(torch::Tensor x, torch::Tensor precision, torch::Tensor mu, torch::Tensor noise);\n\"\"\"\n\n_cuda_src = r\"\"\"\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n\n#ifndef __CUDA_ARCH__\n#define __CUDA_ARCH__ 0\n#endif\n\n__global__ void gibbs32_kernel(const float* __restrict__ x,\n const float* __restrict__ P,\n const float* __restrict__ mu,\n const float* __restrict__ z,\n float* __restrict__ out,\n int B) {\n int b = blockIdx.x * blockDim.x + threadIdx.x;\n if (b >= B) return;\n\n const float* xin = x + ((long long)b) * 32;\n float v0 = xin[0];\n float v1 = xin[1];\n float v2 = xin[2];\n float v3 = xin[3];\n float v4 = xin[4];\n float v5 = xin[5];\n float v6 = xin[6];\n float v7 = xin[7];\n float v8 = xin[8];\n float v9 = xin[9];\n float v10 = xin[10];\n float v11 = xin[11];\n float v12 = xin[12];\n float v13 = xin[13];\n float v14 = xin[14];\n float v15 = xin[15];\n float v16 = xin[16];\n float v17 = xin[17];\n float v18 = xin[18];\n float v19 = xin[19];\n float v20 = xin[20];\n float v21 = xin[21];\n float v22 = xin[22];\n float v23 = xin[23];\n float v24 = xin[24];\n float v25 = xin[25];\n float v26 = xin[26];\n float v27 = xin[27];\n float v28 = xin[28];\n float v29 = xin[29];\n float v30 = xin[30];\n float v31 = xin[31];\n\n #pragma unroll\n for (int i = 0; i < 32; ++i) {\n const float* p = P + i * 32;\n float sum = 0.0f;\n sum = fmaf(v0, p[0], sum);\n sum = fmaf(v1, p[1], sum);\n sum = fmaf(v2, p[2], sum);\n sum = fmaf(v3, p[3], sum);\n sum = fmaf(v4, p[4], sum);\n sum = fmaf(v5, p[5], sum);\n sum = fmaf(v6, p[6], sum);\n sum = fmaf(v7, p[7], sum);\n sum = fmaf(v8, p[8], sum);\n sum = fmaf(v9, p[9], sum);\n sum = fmaf(v10, p[10], sum);\n sum = fmaf(v11, p[11], sum);\n sum = fmaf(v12, p[12], sum);\n sum = fmaf(v13, p[13], sum);\n sum = fmaf(v14, p[14], sum);\n sum = fmaf(v15, p[15], sum);\n sum = fmaf(v16, p[16], sum);\n sum = fmaf(v17, p[17], sum);\n sum = fmaf(v18, p[18], sum);\n sum = fmaf(v19, p[19], sum);\n sum = fmaf(v20, p[20], sum);\n sum = fmaf(v21, p[21], sum);\n sum = fmaf(v22, p[22], sum);\n sum = fmaf(v23, p[23], sum);\n sum = fmaf(v24, p[24], sum);\n sum = fmaf(v25, p[25], sum);\n sum = fmaf(v26, p[26], sum);\n sum = fmaf(v27, p[27], sum);\n sum = fmaf(v28, p[28], sum);\n sum = fmaf(v29, p[29], sum);\n sum = fmaf(v30, p[30], sum);\n sum = fmaf(v31, p[31], sum);\n\n float cur;\n if (i == 0) cur = v0;\n else if (i == 1) cur = v1;\n else if (i == 2) cur = v2;\n else if (i == 3) cur = v3;\n else if (i == 4) cur = v4;\n else if (i == 5) cur = v5;\n else if (i == 6) cur = v6;\n else if (i == 7) cur = v7;\n else if (i == 8) cur = v8;\n else if (i == 9) cur = v9;\n else if (i == 10) cur = v10;\n else if (i == 11) cur = v11;\n else if (i == 12) cur = v12;\n else if (i == 13) cur = v13;\n else if (i == 14) cur = v14;\n else if (i == 15) cur = v15;\n else if (i == 16) cur = v16;\n else if (i == 17) cur = v17;\n else if (i == 18) cur = v18;\n else if (i == 19) cur = v19;\n else if (i == 20) cur = v20;\n else if (i == 21) cur = v21;\n else if (i == 22) cur = v22;\n else if (i == 23) cur = v23;\n else if (i == 24) cur = v24;\n else if (i == 25) cur = v25;\n else if (i == 26) cur = v26;\n else if (i == 27) cur = v27;\n else if (i == 28) cur = v28;\n else if (i == 29) cur = v29;\n else if (i == 30) cur = v30;\n else cur = v31;\n\n float pii = p[i];\n float residual = sum - cur * pii;\n float nv = mu[i] - residual / pii + rsqrtf(pii) * z[(long long)i * B + b];\n\n if (i == 0) v0 = nv;\n else if (i == 1) v1 = nv;\n else if (i == 2) v2 = nv;\n else if (i == 3) v3 = nv;\n else if (i == 4) v4 = nv;\n else if (i == 5) v5 = nv;\n else if (i == 6) v6 = nv;\n else if (i == 7) v7 = nv;\n else if (i == 8) v8 = nv;\n else if (i == 9) v9 = nv;\n else if (i == 10) v10 = nv;\n else if (i == 11) v11 = nv;\n else if (i == 12) v12 = nv;\n else if (i == 13) v13 = nv;\n else if (i == 14) v14 = nv;\n else if (i == 15) v15 = nv;\n else if (i == 16) v16 = nv;\n else if (i == 17) v17 = nv;\n else if (i == 18) v18 = nv;\n else if (i == 19) v19 = nv;\n else if (i == 20) v20 = nv;\n else if (i == 21) v21 = nv;\n else if (i == 22) v22 = nv;\n else if (i == 23) v23 = nv;\n else if (i == 24) v24 = nv;\n else if (i == 25) v25 = nv;\n else if (i == 26) v26 = nv;\n else if (i == 27) v27 = nv;\n else if (i == 28) v28 = nv;\n else if (i == 29) v29 = nv;\n else if (i == 30) v30 = nv;\n else v31 = nv;\n }\n\n float* y = out + ((long long)b) * 32;\n y[0] = v0; y[1] = v1; y[2] = v2; y[3] = v3;\n y[4] = v4; y[5] = v5; y[6] = v6; y[7] = v7;\n y[8] = v8; y[9] = v9; y[10] = v10; y[11] = v11;\n y[12] = v12; y[13] = v13; y[14] = v14; y[15] = v15;\n y[16] = v16; y[17] = v17; y[18] = v18; y[19] = v19;\n y[20] = v20; y[21] = v21; y[22] = v22; y[23] = v23;\n y[24] = v24; y[25] = v25; y[26] = v26; y[27] = v27;\n y[28] = v28; y[29] = v29; y[30] = v30; y[31] = v31;\n}\n\n__global__ void gibbs_generic_kernel(const float* __restrict__ x,\n const float* __restrict__ P,\n const float* __restrict__ mu,\n const float* __restrict__ z,\n float* __restrict__ out,\n int B, int D) {\n int b = blockIdx.x * blockDim.x + threadIdx.x;\n if (b >= B) return;\n float vals[64];\n for (int j = 0; j < D && j < 64; ++j) vals[j] = x[(long long)b * D + j];\n for (int i = 0; i < D && i < 64; ++i) {\n const float* p = P + (long long)i * D;\n float sum = 0.0f;\n for (int j = 0; j < D && j < 64; ++j) sum = fmaf(vals[j], p[j], sum);\n float pii = p[i];\n float residual = sum - vals[i] * pii;\n vals[i] = mu[i] - residual / pii + rsqrtf(pii) * z[(long long)i * B + b];\n }\n for (int j = 0; j < D && j < 64; ++j) out[(long long)b * D + j] = vals[j];\n}\n\ntorch::Tensor gibbs_forward_cuda(torch::Tensor x, torch::Tensor precision, torch::Tensor mu, torch::Tensor noise) {\n const int B = (int)x.size(0);\n const int D = (int)x.size(1);\n auto out = torch::empty_like(x);\n const int threads = 256;\n const int blocks = (B + threads - 1) / threads;\n if (D == 32) {\n gibbs32_kernel<<<blocks, threads>>>(x.data_ptr<float>(), precision.data_ptr<float>(), mu.data_ptr<float>(), noise.data_ptr<float>(), out.data_ptr<float>(), B);\n } else {\n gibbs_generic_kernel<<<blocks, threads>>>(x.data_ptr<float>(), precision.data_ptr<float>(), mu.data_ptr<float>(), noise.data_ptr<float>(), out.data_ptr<float>(), B, D);\n }\n return out;\n}\n\"\"\"\n\n_gibbs_ext = load_inline(\n name=\"gibbs_sweep_ext_v1\",\n cpp_sources=_cpp_src,\n cuda_sources=_cuda_src,\n functions=[\"gibbs_forward_cuda\"],\n with_cuda=True,\n extra_cflags=[\"-O3\"],\n extra_cuda_cflags=[\"-O3\", \"--use_fast_math\"],\n verbose=False,\n)\n\n\nclass ModelNew(nn.Module):\n def __init__(self, dim):\n super().__init__()\n self.dim = dim\n L = torch.randn(dim, dim) * 0.1\n precision = L @ L.t() + torch.eye(dim) * 2.0\n self.register_buffer(\"precision\", precision)\n self.register_buffer(\"mu\", torch.zeros(dim))\n\n def forward(self, x: torch.Tensor) -> torch.Tensor:\n # Match the reference RNG stream: reference draws one contiguous (B,) vector\n # for each coordinate, so a contiguous (dim, B) tensor has the same order.\n noise = torch.randn((self.dim, x.shape[0]), device=x.device, dtype=x.dtype)\n return _gibbs_ext.gibbs_forward_cuda(x, self.precision, self.mu, noise)\n"
}