GPU simulator · runs on the CPU · open source

Test CUDA software on a rack of GPUs you don’t have.

PantheonSim simulates NVIDIA GPUs on an ordinary CPU — the driver, the CUDA runtime and its libraries, nvidia-smi and NVML — so unmodified programs compile, run, and fail exactly where they would on a card.

No GPU, no sign-up. The playground gives you a Linux machine with the cards you pick, a CUDA compiler and a terminal, in the browser.

8 × H100, on a CPU
(vgpu 8xNVIDIA H100 80GB HBM3) ~$ nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.05              Driver Version: 560.35.05      CUDA Version: 12.6     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA H100 80GB HBM3          On  |   00000000:01:00.0 Off |                  N/A |
|  0%   32C    P8             56W /  700W |       0MiB /  81559MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   ...                                                                                   |
+-----------------------------------------+------------------------+----------------------+
|   7  NVIDIA H100 80GB HBM3          On  |   00000000:08:00.0 Off |                  N/A |
|  0%   32C    P8             56W /  700W |       0MiB /  81559MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
Real output from a simulated machine. There is no GPU in it.

Your program doesn’t know the difference

Build with the real CUDA toolkit, run the binary unchanged. The simulator answers every call a program makes, under the same library names a GPU driver installs.

Unmodified CUDA programs

nvcc-compiled binaries from CUDA 12 and 13 run as they are, with their kernels interpreted on the CPU.

nvcc -cudart shared app.cu -o app
vgpu run --gpu nvidia/h200 ./app

The libraries programs link

cuBLAS, cuBLASLt, cuDNN, cuFFT, cuRAND, cuSPARSE, cuSOLVER, NCCL, NVRTC, NPP and nvJPEG — each tested against NVIDIA’s own library on a physical GPU.

The tools people run

nvidia-smi, NVML, pynvml, gpustat, nvitop and lspci report the machine you asked for. Numba and Triton JIT kernels run too.

Cards measured, not guessed

11 GPU profiles were read off physical cards and checked against them, from Turing to Grace Hopper. The rest say they are not.

What a real GPU won’t tell you

A simulator sees every lane of every warp. These come straight from it.

Find the race

Two warps wrote the same word with no barrier. Hardware usually hides it; this names the kernel, the PTX line and the instruction.

$ VGPU_SCHEDULER=adversarial vgpu run --race ./race
[vgpu] data race: read-write race on shared memory at byte offset 0: warp 2 and warp 0 both reach it with no bar.sync between them
  in kernel '_Z5tallyPi', PTX line 38
  instruction: st.shared.u32[_ZZ5tallyPiE5local], %r4
  GPU profile: nvidia/h100

Run on every card at once

The same binary on each profile, outputs compared. A result that depends on the card shows up here, not in production.

$ vgpu test --matrix ./vectoradd
profile                    exit  output
nvidia/a10                    0  baseline
nvidia/a100                   0  identical
nvidia/h100                   0  identical
nvidia/rtx3060                0  identical
nvidia/a100-sxm4-40gb         0  identical
...
11 profiles: 10 identical to nvidia/a10, 0 different

Count, don’t sample

Exact instruction, memory and sector counts for every launch. They do not move between runs.

$ VGPU_COUNTERS=1 vgpu run ./vectoradd
[vgpu][counters] _Z3addPfPKfS1_i  grid=4x1x1 block=256x1x1
    inst_executed=704  thread_inst_executed=22528  lanes_active_avg=32.00/32
    global  ld=2048 st=1024  read=8192 B write=4096 B
    shared  bank_conflicts=0 over 0 requests
    mix     fp16=0 fp32=1024 fp64=0 int=5120 cvt=3072

Honest about what it is

  • It does not predict performance. There is no timing, cache or thermal model — timings mean nothing here, and counters mean everything.
  • It does not replace hardware. Run it on every commit; keep a nightly run on physical GPUs before a release.
  • Gaps fail loudly. Anything not implemented stops with the instruction, the PTX line, the kernel and the profile — never a quiet wrong answer.
every commit         PantheonSim, on CPU runners
nightly / release    physical GPUs

Try it without installing anything

Pick up to eight cards and an operating system and you get a Linux machine with nvcc, an editor and a terminal. Compile a kernel, run it, point the race detector at it. Sessions last an hour and the network reaches GitHub, PyPI and Hugging Face.

Open the playground
The PantheonSim playground: a CUDA editor beside a terminal that has just compiled and run a kernel on a simulated H100

GPUs

Every profile the simulator carries. “Measured” means its values were read off a physical card and diffed against it.

CardArchitectureMemoryComputeProfile
NVIDIA H100 SXM5 80GBHopper80 GB9.0measured
NVIDIA H100 PCIe 80GBHopper80 GB9.0measured
NVIDIA A100 80GBAmpere80 GB8.0measured
NVIDIA A100 SXM4 40GBAmpere40 GB8.0measured
NVIDIA A10Ampere24 GB8.6measured
NVIDIA A10GAmpere24 GB8.6measured
NVIDIA L4Ada Lovelace24 GB8.9measured
NVIDIA L40SAda Lovelace48 GB8.9measured
NVIDIA Tesla T4Turing16 GB7.5measured
NVIDIA RTX 3060Ampere12 GB8.6measured
NVIDIA GH200 480GBHopper/Grace96 GB9.0measured
NVIDIA H200Hopper141 GB9.0not yet measured
NVIDIA B200Blackwell192 GB10.0not yet measured

Run it on your own machine

Linux, CMake 3.20 or newer and a C++20 compiler. No GPU, no CUDA toolkit and no third-party libraries are needed to build it; the toolkit is only needed to compile your own CUDA programs.

Getting started →

$ git clone https://github.com/pantheongpu/pantheonsim
$ cd pantheonsim && ./scripts/build.sh
$ ./build/vgpu shell --gpu nvidia/h100 --count 8