Show HN: Tilery-VM – run Nvidia cuTile GPU kernels on a CPU, no GPU required Tilery-VM, a virtual machine for NVIDIA's CUDA Tile IR bytecode, enables developers to run cuTile GPU kernels on a CPU without requiring a GPU or CUDA setup. The open-source project, hosted on GitHub, parses TileIR MLIR or bytecode and interprets it on the CPU, supporting 89 op forms and 90 test cases with 69 expected values from real cuTile. This allows cuTile kernels written in Python or Rust to be developed and tested on any CPU, serving as a reference for other backends. tilery-vm is a virtual machine for CUDA Tile IR bytecode. It executes TileIR bytecode on a CPU, so cuTile kernels can be developed and tested without a GPU. TileIR is NVIDIA's open, language-agnostic IR for CUDA kernels the PTX analogue for the tile programming model ; cuTile is the user-facing language that emits it, from both the Python and Rust clients. no GPU, no CUDA, no setup step: uv run examples/minimal.py 0.0320586 0.08714432 0.23688284 0.6439143 cargo test --workspace 136 tests One way you can use tilery-vm is by using tilery vm as a cpu backend for cuda-tile . This allows you to write native cutile in a environment that does not have a gpu, and run it on the cpu. /// script requires-python = " =3.10" dependencies = "cuda-tile tileiras ==1.4.0; sys platform = 'darwin'", "cuda-tile==1.4.0; sys platform == 'darwin'", "numpy", "tilery-vm", tool.uv.sources tilery-vm = { path = "../bindings" } cuda-tile = { path = "../parity/osx-cutile/cutile-shim", marker = "sys platform == 'darwin'" } /// import tilery vm.cpu noqa: F401 import cuda.tile as ct import numpy as np @ct.kernel def softmax a, result : x = ct.load a, index= 0, , shape= 4, e = ct.exp x - ct.max x, axis=0 ct.store result, index= 0, , tile=e / ct.sum e, axis=0 a = np.array 1, 2, 3, 4 , dtype=np.float32 result = np.zeros 4, dtype=np.float32 ct.launch None, 1, 1, 1 , softmax, a, result print result 0.0320586 0.08714432 0.23688284 0.6439143 or from rust use cutile::compile api::KernelCompiler; use tilery vm::{Arg, launch}; cutile::module mod my kernels { use cutile::core:: ; /// out i = scalar + 1, for a length- S f32 tensor. cutile::entry fn add scalar