| name | cuda-scaffold |
| description | Scaffold a new CUDA kernel with Rust integration via cudarc. Args: kernel_name [f32|f16]. Creates .cu kernel, Rust wrapper, CPU fallback, and benchmark. |
Scaffold GPU kernel integration for moon.
Usage
/cuda-scaffold vector_l2_distance f32 — L2 distance kernel
/cuda-scaffold batch_cosine f16 — half-precision cosine kernel
Generated Artifacts
src/gpu/kernels/{name}.cu — CUDA kernel source
src/gpu/{name}.rs — Rust wrapper using cudarc
src/gpu/fallback/{name}.rs — CPU scalar + SIMD fallback
build.rs entry for kernel compilation (if not present)
- Feature gate:
#[cfg(feature = "gpu-cuda")]
- Criterion benchmark in
benches/gpu_{name}.rs
CUDA Kernel Template
#include <cuda_runtime.h>
__global__ void {name}_kernel(
const float* __restrict__ a,
const float* __restrict__ b,
float* __restrict__ out,
const int n,
const int dim
) {
const int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= n) return;
const float* va = a + idx * dim;
const float* vb = b + idx * dim;
float acc = 0.0f;
for (int d = 0; d < dim; d += 4) {
float4 fa = *reinterpret_cast<const float4*>(va + d);
float4 fb = *reinterpret_cast<const float4*>(vb + d);
acc += fa.x * fb.x + fa.y * fb.y + fa.z * fb.z + fa.w * fb.w;
}
out[idx] = acc;
}
Rust Wrapper Template
#[cfg(feature = "gpu-cuda")]
pub fn {name}_gpu(a: &[f32], b: &[f32], dim: usize) -> Vec<f32> {
use cudarc::driver::*;
let dev = CudaDevice::new(0).expect("CUDA device");
let module = dev.load_ptx(PTX_SRC.into(), "{name}", &["{name}_kernel"]).unwrap();
let f = module.get_fn("{name}_kernel").unwrap();
}
pub fn {name}_cpu(a: &[f32], b: &[f32], dim: usize) -> Vec<f32> {
let n = a.len() / dim;
let mut out = Vec::with_capacity(n);
for i in 0..n {
let va = &a[i * dim..(i + 1) * dim];
let vb = &b[i * dim..(i + 1) * dim];
out.push(va.iter().zip(vb).map(|(x, y)| x * y).sum());
}
out
}
Steps
- Create directory structure:
src/gpu/kernels/, src/gpu/fallback/
- Generate CUDA kernel from template
- Generate Rust wrapper with cudarc bindings
- Generate CPU fallback (scalar + optional SIMD)
- Add feature flag
gpu-cuda to Cargo.toml if not present
- Add build.rs kernel compilation step
- Generate Criterion benchmark
- Verify CPU fallback compiles without CUDA:
cargo check
- If CUDA available, verify GPU path:
cargo check --features gpu-cuda