Take this model to an agent
The box on the left is a request body. The same model runs three ways, and all three give the same answer for the same seed.
Or as a .ftp program, which carries the schedule and the coloring as well
as the model. This is written here in the browser and parses unchanged on the CPU.
Install with cargo install ferrotherm-serve, then run
ferrotherm-serve for the HTTP endpoint or point an MCP client at
ferrotherm-mcp.
Run the same sweep on your GPU
The shader is emitted by the Rust crate and read out of the wasm module, so the arithmetic the GPU runs is the arithmetic the test suite pins. Nodes of one colour share no edge, so a whole colour class updates in one dispatch.
The check that matters is the first line of the output: the local field each GPU lane computed, against the field this crate computes on the CPU for the same state. On a 32×32 lattice that agreement is exact. The two final states still differ, and are supposed to — every lane draws from its own counter-based stream rather than one sequential one, so the backends agree in distribution, not byte for byte.
On throughput, expect the GPU to lose here. A thousand nodes is far too small: two dispatches per sweep carry a fixed cost that dominates the work. The crossover needs a much larger model, and quoting this figure as a GPU benchmark would be dishonest.
not run
Check the sampler against exact enumeration
For a model small enough to enumerate, every state's Boltzmann weight can be computed directly and compared against what the sampler actually produced. Judge the result against the noise floor printed with it, not against zero.
not run