Experimental · v0.2

Explore memory
beyond VRAM.

GPU memory experiments: segmented Vulkan allocations with native RAM backing, plus lossless idle snapshots for eligible Vulkan and HIP allocations.

40 GiB Vulkan pool and HIP checks · RX 7900 XTX · 24 GiB VRAM

Experimental boundary: opt-in active eviction passed a narrow two-queue check. A newer opt-in 32 MiB range mode selects sparse chunks from narrow descriptor or transfer ranges; a 64 MiB two-chunk check and one small-model cold-restore run passed. Fault-driven paging remains unfinished; this does not prove 40 GiB streaming or broad workload behavior. Unknown commands and BDA shaders restore all; dynamic storage descriptors widen tracking to whole buffers. Default presentation retains the conservative fallback; see the narrow opt-in path below. HIP idle hibernation covers tracked VMM allocations on one tested ROCm ABI. Active work still needs VRAM plus GTT.

Measured on hardware

Capacity verified. Compression measured.

One 40 GiB Vulkan buffer passed full readback through 160 native chunks; full 96 GiB backing remains unverified. Read the segmented-buffer evidence.

Two clean-first BP16 runs on the unchanged InternLM2.5-20B F16 workload measured 1.16969830 and 1.17068766 tokens/s. Both produced the exact 92-token output with 49/49 layers offloaded.

RunTokens/sOutput
Prior native reference1.7092 tokens
BP16 GPU-encoder baseline1.09 / 1.10Exact, 49/49
BP16 clean-first repeat1.17 / 1.17Exact, 49/49

The 1.17 runs are historical, not a current rate guarantee. Later 26 GiB capped runs measured 0.7432 tokens/s with a 2.5 GiB reserve and 0.7205 with a 1.5 GiB reserve; changed clock and background-memory conditions leave no accepted regression or improvement claim. Research notes · 1.5 GiB reserve archive.

A newer native run after the VRAM clock-cap removal measured 1.46258 tokens/s with exact 92-token output and 49/49 layers. Compressed uncapped trials with 26, 22, and 18 GiB cold-store ceilings stopped at RAM guards and have no accepted rates. Native run · 26 GiB trial · 22 GiB trial · 18 GiB trial.

These runs were sequential, with clocks and background activity uncontrolled; they do not isolate a clean-first effect. BP16 clean-first remains experimental and off by default.

The 7 GiB local-owner / 12 GiB shared-raw trial passed with exact 92-token output, 49/49 layers, and zero GPU restore fallback. It measured 1.07647639 tokens/s, below the separate 1.1725 profile; the owner tier remains experimental and off by default. Trial results · Owner fixture results.

An alternating metadata fixture measured the host-encode component at about 27 ms with the current metadata path versus 2,345 ms before it, across exact-byte fixture runs. Desktop activity was uncontrolled; this is component timing, not model throughput or evidence of a native-model speed gain. Fixture results and provenance.

The current build passed 129/129 regression checks in 100.67 seconds, including bounded raw-owner fallback and clean-cache trimming. The installed build passed 115/115 checks. Test evidence.

An alternating four-run Qwen 27B Q4 trial with a 12 GiB residency ceiling and 8 GiB cold/owner ceilings measured 1.75–1.78 tokens/s with BP16 raw-owner input off and 2.29 with it on; all runs matched exact output and 66/66 layers. The measured rate was about 30% higher with the feature on, but desktop activity was uncontrolled and per-run swap growth ranged from 88 to 2,305 MiB. A separate native 34.56 tokens/s result is a capacity baseline, not a matched throughput comparison; this is a 27B Q4 forced-spill result, separate from the 39.73 GB F16 model. Run details and provenance · Native capacity baseline.

A full 92-token InternLM2.5-20B F16 run with a 1 GiB clean-cache cap completed at 1.03189 tokens/s with exact output and 49/49 layers. This is below the separate native 1.46258 reference and historical 1.17 clean-first runs; memory and clock conditions differed, so they do not isolate a cap effect. The raw-owner path was not exercised (zero RAW snapshots; all snapshots compressed), swap grew by 6,161 MiB, and minimum available RAM was 18,205 MiB. A later 4 GiB cap trial stopped at the RAM guard (16,374 MiB available against a 16,384 MiB floor) before model work and has no accepted rate. A fresh native rerun also stopped at the guard (16,365 MiB) and produced no new rate; the 1.46258 result remains the prior accepted native reference. Further trials are underway. 1 GiB result · 4 GiB guard stop · Fresh native guard stop.

Prior native reference · Clean-first repeat

Earlier benchmark runs and implementation notes

Earlier capacity and integration checks: a 320 MiB Vulkan idle-snapshot test released 320 MiB of process resident VRAM and passed full-byte wake checks, including partial-freeze and restore-retry cases. The full CTest run before optional GDeflate integration passed 101/101 with zero validation errors or VUIDs. A 512 MiB allocation passed full-byte checks across three promoted storage buffers, including snapshots across allocation gaps. An unchanged 135M F16 Vulkan model passed 11 selective-restore checks with identical output, 31/31 layers, and zero fallback. An official 39.73 GB InternLM2.5-20B F16 model loaded through HIP VMM/GTT with 49/49 layers; native full-GPU HIP allocation OOMed. Native partial HIP offload and zVram's Vulkan virtual heap matched output. N-gram self-drafting reached 6.33 vs 1.10 tokens/s on repeated text, but 1.45 vs 1.43 on ordinary prose with differing transcripts. These short app checks do not establish general speedup. A 40 GiB GPU model buffer remains untested. A separate 40 GiB HIP pointer passed GPU-write verification using 20 GiB each of VRAM and GTT, and unchanged 30B and 27B models ran together with 34.2 GB of GPU model buffers.

The five-case active-eviction gate passed across synthetic and adopted native pools. B restored and passed byte checks before A's host-gated queue was released; the watchdog did not fire. Unknown command use kept both pools resident for 300 ms. A separate unchanged 135M model run passed 12 checks with identical output and cold restore; it does not establish a speedup. This confirms a narrow allocation-granularity path, not 40 GiB compression speed, VRChat compatibility, or broad workload behavior. Read the focused evidence and limits.

The opt-in --vulkan-range-mib 32 path passed 4/4 focused checks. An unchanged 135M model passed 13/13 checks with identical output; one submission selected ten chunks together. The --vulkan-resident-mib 192 check passed 21/21 model checks and the focused resident-pressure gate passed 6/6; after full cold startup, tracked backing peaked at 165.8125 MiB, with 354 evictions and identical native/wrapped output. A paired clean-snapshot cache run passed 25/25 with identical output, 405 cache reuses, and 3 invalidations. In short separate decode runs, the pressure baseline measured 2.82 tokens/s and cached mode 6.23; native runs measured 123.25 and 123.74 tokens/s. These workload-specific figures are not a general speed claim. Six focused synthetic/native checks also verified read-only reuse, dirty writes, quota trimming, and accepted unknown writes. The cache shares the cold-store quota and is limited to proven read-only accesses. --vulkan-clean-cache-mib N optionally caps expendable cached snapshots; it requires --vulkan-clean-cache, --vulkan-range-mib, and --vulkan-cold-mib, with a positive value no greater than the cold quota. Omitting the cap keeps existing uncapped-cache behavior. Trimming may cause later re-encoding; the cap does not guarantee a full model fits. This is not a global VRAM cap or proof of 40 GiB streaming or game behavior. Read clean-cache evidence and limits.

--vulkan-min-savings-percent 0–100 keeps weak Zstd savings as lossless RAW snapshots; at 100 it bypasses Zstd entirely. RAW uses the shared cold/cache quota and can need more RAM. A focused six-case gate covered 30 fresh RAW snapshots with full-byte checks and cache-write invalidation; the full suite passed 92/92 with zero validation diagnostics. One matched 135M model pair measured 17.53 tokens/s at 100% versus 8.26 at 0%, with native references at 125.63 and 121.84; this single pair is workload-specific and far below native throughput. It does not establish large-model, 40 GiB, or game performance. Read cutoff evidence and limits.

GDeflate remains experimental: the optional CPU codec requires -DZVRAM_ENABLE_GDEFLATE=ON; Zstd stays the default. A separate opt-in --vulkan-gdeflate-gpu path restores compressed chunks up to 32 MiB directly to private sparse backing views; RAW chunks stay on CPU/copy. One small-model GPU layer run passed 14/14 checks with matching output, 31/31 layers, 11 GPU calls over 308,084,736 bytes, and zero fallback or validation diagnostics. The strict focused GPU layer suite passes 5/5. In short sequential 135M comparisons with validation off, wrapped first output was 0.17 s on GPU decode and 1.08 s on CPU GDeflate; generation rates were close to native (259 vs 270 and 312 vs 316 tokens/s). Active desktop load, unfixed clocks, and native timing variation mean this does not establish a steady-state speed gain or 40 GiB performance. A 20B GPU-pressure attempt timed out waiting for readiness after 388 GPU decode calls during weight loading, with no wrapped output or token rate. A separate retry with a 900-second timeout was stopped after a reported transient game stall; the game recovered, but no GPU fault or OOM evidence was found and the cause is unknown. Startup backing is not yet fully covered by the 20 GiB admission accounting; a CPU-only correction is underway. Hardware cold-draw fixtures passed 3/3 with exact pixels and 32 MiB readback; a newer opt-in X11 presentation fixture also passed three exact-pixel/full-buffer cycles; broad game behavior remains unverified. Research and build notes · GDeflate behavior and benchmark limits · 20B pressure run · graphics fixture evidence.

The separate experimental --vulkan-lazy-backing mode passed a CPU production-path harness for zero-allocation startup, exact-cap restore, refusal before allocation above cap, cold disjoint binding, rollback, retry, and sparse-failure accounting. Tiny hardware and small-model gates now pass; game and 40 GiB behavior remain unverified; default presentation retains the conservative fallback, and explicit app sparse submissions remain unsupported. Allocation/bind failure can prevent paging. Lazy-backing requirements and limits.

Two opt-in steps toward broader use: base Vulkan presentation can retain buffer paging with --vulkan-buffer-presentation, with three presented cold-restore frames passing in a hidden X11 fixture; game behavior and frame times remain unverified. A native headless Wayland control failed without zVram, so hardware presentation proof is X11-only. GDeflate encoding now accepts 1–32 CPU workers; on one 32 MiB model slice, 32 workers took 29.8 ms versus 346 ms with one, with identical bytes. This is CPU encoder speed, not token or frame-time improvement. Presentation scope · Worker measurements.

New opt-in --vulkan-async-compression encodes one idle range up to 32 MiB outside device and queue locks, then rechecks allocation, write, binding, activity, and budget state before committing. GPU capture and commit still use locks; urgent admission compression stays synchronous. Async Zstd and 32-worker GDeflate with direct GPU restore passed three hidden X11 frames with exact pixels and full-buffer checks. These are correctness results, without a token or frame-time speed claim. Evidence and scope.

Opt-in --vulkan-headroom-mib N further lowers lazy backing admission using the native driver memory-budget estimate and a requested margin. CPU checks passed 10/10; later tiny hardware gates verified native budget queries, zero-budget refusal before allocation, and lazy startup. The combined small-model path passed 32/32 with matching output, 31/31 GPU layers, and real background commits; game and 40 GiB behavior remain unverified. It requires a supported properties2 path, memory-budget extension, and one native local heap. The estimate is not reserved capacity or a guarantee against stalls. Calculation and limits.

A 5% cutoff run completed the 16.8107 GB Q4 model with 27/27 checks, identical output, 66/66 layers, and 4,891 pressure admissions under a 12 GiB tracked cap. It recorded mixed compressed and RAW snapshots and measured 0.41 tokens/s versus 13.30 native. The prior no-cutoff run measured 0.28 versus 6.00 native, so the changed baseline prevents attributing a speed gain to the cutoff. This remains a slow functional result, not 40 GiB or game proof. Read the run details.

The opt-in --vulkan-eviction-policy lru|mru selects the eligible completed chunk chosen first under resident admission; LRU remains the default. A matched small-model scan pair passed 26/26 checks each with identical output. One run measured 8.36 tokens/s for MRU versus 6.23 for LRU; native references were 119.43 and 122.04 tokens/s. Peak tracked backing was 185.875 MiB for MRU and 165.8125 MiB for LRU, under the 192 MiB limit. MRU restored 8,640 MiB versus LRU's 13,056 MiB. These single-run results have throughput variance and do not establish 40 GiB behavior or game performance. The helper's optional --min-available-mib stops its child process group at a system-wide available-memory floor; it is not a hard allocation cap. Read policy evidence and limits.

A longer-idle MRU run completed an unchanged 16.8107 GB Q4 model under a 12 GiB tracked-residency cap: 26/26 checks, identical native/wrapped output, 66/66 layers, and 4,952 pressure admissions. Wrapped decode was 0.28 tokens/s versus 6.00 native, so this is a functional result with a substantial slowdown. There is no large-model LRU comparison; this is not a 40 GB model or game result. Read the run details.

An unchanged 39,725,643,136-byte InternLM2.5-20B F16 model completed Vulkan inference with automatic compression: 28/28 checks, identical native/wrapped output, and 49/49 layers offloaded. After the first cold pass, tracked backing peaked at 21,471,690,752 bytes under the 20 GiB cap, with 1,212 MRU admissions and no refusals or restore fallbacks. Cold storage retained 38,749,798,400 logical bytes in 29,595,160,469 bytes (23.62% saved). Across 12 actual decode runs, wrapped throughput was 0.09 tokens/s versus 1.44 native. This demonstrates a slow compressed-pressure path for this setup; the cap covers eligible tracked backing only. It is not a 40 GiB GPU model, game, universal compatibility, or fast-inference result. Read the run details and limits.

The full 39.73 GB InternLM F16 model also completed with lazy backing, GPU GDeflate restore and MRU under an 18 GiB tracked cap plus a 3 GiB driver-budget reserve. Output matched native; 12 actual decode runs measured 0.09 tokens/s, with 8,883 GPU restores and zero fallback. A separate native nodes=4 reference measured 1.11 tokens/s, so this is not a paired speed comparison. The earlier 16 GiB Zstd run measured 0.03319 versus 1.69 native under different conditions. The GDeflate path completes this workload but remains very slow. Run details and limits.

A paired 32 MiB GPU component test decoded BP16 exactly in 0.11784 ms versus GDeflate in 5.77616 ms; BP16 stored 87.0% of raw bytes versus 81.1%. That decoder-only comparison does not predict model speed. The best measured 12-token BP16 short run used 32 encoding workers and eight opt-in upload-copy workers, an 8 GiB allocated-host cache, and a 24 GiB cold/cache quota, completing 12 decode runs at 0.61020197 tokens/s (reported as 0.61), with exact output, 49/49 layers, and zero GPU fallback. Sampled live cache use stayed below 8 GiB; cumulative accepted-use bytes are not resident memory. A repeat at eight workers measured 0.6070807 tokens/s; one and four workers measured 0.5331433 and 0.5966213. These same-runtime runs were sequential with uncontrolled clocks and background activity, so they do not establish that worker count caused the pattern. The prior 24 GiB run measured 0.5275435 tokens/s. A fresh native nodes=4 reference measured 1.6995 tokens/s (about 2.78x the BP16 rate), but used a different VRAM/GTT path under uncontrolled conditions. BP16 upload workers remain opt-in and default to one. The recorded source hashes and runtime library hash are preserved separately; the production shader was unchanged. A separate zVram virtual-native-spill run without snapshots or compression measured 1.69936 tokens/s; it is not a controlled comparison with compressed BP16. This is not a game-performance result. Virtual-spill evidence and limits. Latest completed BP16 run. Upload-worker comparison. Earlier direct-host run. Fresh native reference and limits.

Two opt-in synchronous BP16 GPU-encoder runs completed the 92-token InternLM2.5-20B F16 workload at 1.09323773 and 1.10252711 tokens/s; both had identical exact output, 49/49 layers, and zero GPU restore fallback. The latest recorded 4,097 GPU encode calls over 135,199,260,672 raw bytes, with zero encoder fallback and zero final snapshot-copy bytes. It used 26 GiB cold/owner ceilings, 19 GiB tracked residency, a 2.5 GiB reserve, 32 encoder/eight upload workers, LFU, and immutable-owner validation caching. The earlier native result was 1.69935367 tokens/s; a fresh 92-token native refresh measured 1.6991 tokens/s. The clean-first runs were about 31% slower by rate (about 45% more time per token), but sequential clocks and background activity were uncontrolled. The 12-token 0.61020197 result remains separate. A same-runtime CPU-synchronous encoder comparison measured 0.85462257 tokens/s versus 1.10252711 with GPU encoding; exact output matched, but the sequential uncontrolled pair does not isolate cause. Historical four-frame BP16 restore-batching and combined-remap prototypes preserved exact output but showed no observed model speed gain; both were removed from the current runtime and their flags are no longer supported. A separate repeat of the earlier CPU-encoder 26 GiB setup ended in Vulkan out-of-device-memory without a result; both GPU-encoder runs above completed. Two same-profile clean-first runs measured 1.16969830 and 1.17068766 tokens/s, about 6.1–6.2% above the prior repeated 1.10252711 rate. Both preserved exact output, 49/49 layers, and zero GPU restore fallback or swap growth; minimum available RAM was 28.43 and 27.77 GiB. The runs were sequential with uncontrolled clocks/background activity, so they do not establish clean-first as the cause. A separate 28 GiB shared cold/owner-cap run measured 1.174347 tokens/s, only 0.31% above the 26 GiB repeat; this is no meaningful observed gain, so keep 26 GiB as the recommendation. A 20 GiB tracked-resident-cap attempt then exited with Vulkan out-of-device-memory; it has no rate, so retain the previous 19 GiB profile. Clean-first run evidence and limits; Fresh native 92-token reference; GPU-encoder repeat baseline.

A same-prompt 92-token comparison produced identical stdout across 49/49 layers: 1.69935 tokens/s native and 0.43978 allocated-host under the 8 GiB cache. A later child-only glibc mmap/trim-threshold run completed the same output at 0.46524 tokens/s; its default-threshold retry stopped at the RAM guard with no rate, so this does not prove an allocator speed effect. A later BMI2-inline BP16 encoder run with the same child-only thresholds completed the 92-token output at 0.57273 tokens/s; sequential runs do not isolate the encoder effect. These 92-token runs are distinct from the 12-token 0.61020 BP16 short-run result, which remains the best measured short run. A separate BMI2 12-token run measured 0.59393 tokens/s. Allocator thresholds are not application defaults. Two separate short runs with those thresholds measured 0.54232 tokens/s for normal upload reuse and 0.52496 with cached upload; the latter did not win this sequential pair, and neither replaced the 0.61020 best short run. Long-run comparison and limits. Allocator-threshold long run and monitored stop. Short-pair validation. BMI2 model-run evidence. BMI2 run archives. Short-run archives.

The opt-in cached BP16 imported-host-input mode preserved full-model output across 49/49 layers but measured only 0.0718646 tokens/s, well below the latest 1.10252711 GPU-encoder long-run result. It is experimental correctness evidence, not a speed improvement. The 2,120 imports and 6,495 reuses are cumulative counters; submit/wait reached 121.592 seconds, with driver overhead only a hypothesis. Import evidence and limits.

For ranges above 32 MiB, snapshot decode can use up to three background workers plus the calling thread into existing staging (bounded to 128 MiB); freeze/restore batches up to four 32 MiB frames per GPU copy/wait. The current pipeline adds two host staging slots of at most 128 MiB each, overlapping CPU decode of the next admitted child with the GPU copy. It uses at most four CPU decode workers per restoration; whole-pool and oversized snapshots stay serial, and GPU allocations remain within resident admission. The pre-GDeflate-codec-integration full suite passed 101/101 in 68.13 seconds and the focused helper/pipeline suite passed 4/4 in 4.31 seconds, with no validation errors or VUIDs. A 20B first-submit run failed snapshot checks after 420 pre-prompt and 646 final failures; its 0.24 tokens/s is rejected. A later 300,000 ms long-idle retry passed 27/27 with identical output and 49/49 layers at 0.19 tokens/s, unchanged from the prior accepted result. The completed-restore peak stayed below 20 GiB, while the all-state observed peak briefly exceeded it because the cap checks admissions and completed restores rather than every transient allocation. Read the evidence and limits.

The existing 27B Q4_K_M HIP model matched output after idle restore with fully VRAM-resident active buffers: native 24.41 versus automatic 24.33 tokens/s over 45 decode runs each. Idle process VRAM fell from 16.30 GB to 0.155 GB; cold payload saved 2.86%, with a 12.9-second wake. The earlier forced-spill placement measured about 3 tokens/s and used a different memory placement.

Read the test evidence

The current prototype

Three experiments. Explicit limits.

01 / TELEMETRY

See allocation behavior

An opt-in layer can expose a configurable 96 GiB logical heap for eligible storage buffers, using stable sparse buffers backed by native chunks. A 40 GiB allocation passed full readback. The separate --vulkan-range-mib 32 mode uses sparse chunk ranges for selective restore and eviction; a 64 MiB check and one unchanged 135M F16 run passed. Broader model and API coverage remains untested.

Vulkan virtual heapAMD RADV
02 / VULKAN POOL

Evict and restore safely

A C++ API owns explicit buffers, pins them while in use, and stores lossless zstd or raw snapshots under a host budget. Default buffers need refreshed references after restore; an optional sparse mode preserves their handles at explicit acquire/release boundaries. The experimental Vulkan layer can also retain verified compressed ranges under a shared cold-store quota when read-only access is proven.

Bounded host storeC++17 API
03 / HIP FALLBACK

Route capped allocations

An optional hipMalloc shim supports native device allocations, mapped pinned host fallback, and an experimental VMM/GTT provider. Explicit userspace hibernate/resume preserves GPU pointers with compressed cold backing. On the tested ROCm HIP 7.2.53211 dispatch ABI, opt-in idle hooks snapshot tracked VMM allocations and restore them before work. The small 135M F16 llama.cpp check matched native output; the existing 27B model also passed idle restore and identical-output checks.

Opt-inPinned host RAM

Research direction

Prototype today. Learn what’s next.

NOW

Managed Vulkan pool

Chunked snapshots and LRU compute checks passed; optional sparse backing also preserved buffer handles under a 2 MiB resident budget.

NOW

Optional HIP allocation fallback

GPU-write integrity passed across native and host tiers. The 39.73 GB InternLM2.5-20B F16 model ran through VMM/GTT after the native full-GPU allocation OOMed; a separate 24/49-layer native CPU/GPU run matched its output. A 40 GiB GPU model buffer remains untested.

TESTED

Native Linux reclaim

A scoped dmem probe verified every byte of 64 MiB under a 16 MiB VRAM limit. RAM migration passed; swap compression remains unproven.

NOW

HIP VMM with GTT backing

A 39.73 GB InternLM2.5-20B F16 model loaded with 49/49 layers and a 36,798.77 MiB GPU model buffer; native full-GPU allocation OOMed. Partial native offload matched output at 1.38 tokens/s versus VMM at 1.09. One 40 GiB pointer passed integrity; a 40 GiB GPU model buffer remains untested.

NOW

Userspace HIP cold snapshots

32 MiB and 288 MiB allocations passed lossless restore, native readback, stable pointers, and failure recovery. Measured process backing was released while cold. Explicit lifecycle only; no root service needed.

NOW

HIP automatic idle snapshots

Opt-in idle hibernation and restore passed on HIP 7.2.53211 with the tested dispatch ABI, including a small unchanged 135M F16 llama.cpp run. Other ABI versions disable this mode; raw HSA/direct submissions and broader app paths are outside its coverage.

NOW

Vulkan automatic snapshots and active eviction

Native GPU-only allocations and stable device addresses passed full-byte checks across multiple queues. A focused active test compressed and restored an unused whole allocation while another tracked queue remained pending; unknown commands protected all pools. Opt-in 32 MiB range residency passed a two-chunk check and one unchanged small-model run; broader workloads remain untested.

NEXT

Broader workloads

Compare speed against a viable native placement and test more applications. A 40 GiB GPU model buffer and universal paging remain untested.

Try the prototype

Build. Inspect. Experiment.

Requires Vulkan headers, glslc, and zstd development files. HIP checks need ROCm; VMM/GTT also needs libdrm AMDGPU development files.

SHELL
# Get the source
git clone https://github.com/nerdrx/zVram.git
cd zVram

# Configure and build
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

# Run the managed Vulkan integrity check
./zvram --validate --isolate-layers -- ./build/zvram-managed-check

# 96 GiB logical heap, bounded 2 GiB memtest payload
./zvram --verbose --isolate-layers --vulkan-virtual-gib 96 -- \
  memtest_vulkan 1 2147483648

# Narrow 320 MiB automatic Vulkan idle-snapshot check
./zvram --verbose --isolate-layers --vulkan-virtual-gib 96 \
  --vulkan-auto-idle-ms 100 --vulkan-cold-mib 512 -- \
  ./build/zvram-vulkan-auto-check

# Active whole-allocation eviction during tracked queue work
./zvram --validate --isolate-layers --vulkan-virtual-mib 64 \
  --vulkan-auto-idle-ms 100 --vulkan-cold-mib 64 \
  --vulkan-selective-restore --vulkan-active-eviction -- \
  ./build/zvram-vulkan-auto-check --active-submit --two-queues

# Opt-in 32 MiB sparse range residency
./zvram --validate --isolate-layers --vulkan-virtual-mib 64 \
  --vulkan-auto-idle-ms 100 --vulkan-cold-mib 64 \
  --vulkan-selective-restore --vulkan-active-eviction --vulkan-range-mib 32 -- \
  ./build/zvram-vulkan-auto-check --range-submit

# Compare an unchanged Vulkan llama-completion run with idle snapshots
python3 check_vulkan_idle_model.py --binary /path/to/llama-completion \
  --model /path/to/SmolLM2-135M-F16.gguf

# HIP VMM/GTT, with opt-in capacity reporting through supported HIP queries
./zvram --hip --hip-vmm --hip-report-capacity \
  --hip-local-mib 20480 --hip-host-mib 20480 -- \
  ./build/hip_check --single-allocation --mib 40960

# Experimental automatic compression after an idle interval
./zvram --hip --hip-vmm --hip-local-mib 64 --hip-host-mib 2048 \
  --hip-auto-idle-ms 1000 --hip-cold-mib 1024 -- \
  ./your-hip-application