Rendered live by your GPU, naturally

GPU compute for phones.

Write a kernel. Run it on the GPU in your pocket, and on every desktop GPU too. Gemma 3 1B at 60 tokens/sec on a phone — held flat across the whole conversation, from a 1.7 MB runtime.

0× llama.cpp’s Adreno backend
0dispatches, one submit
0tok/s · Gemma 3 1B
1.7MB runtime

THE MANIFESTO

WE WRITE OPENCL C. WE COMPILE ONCE. WE DISPATCH ON ANY VULKAN GPU, PHONE OR DESKTOP. NO SDK, NO CEREMONY, NO EXCUSES.

ADRENO 840 ✓ 38/38 ON-DEVICE91/91 · FIVE DRIVERSGEMMA 3 · 60 TOK/S2× LLAMA.CPP ON ADRENOMALI-G57 ✓ VERIFIED1.7 MB RUNTIME
COMPUTE
saxpy.spv SPIR-V 1.3 · 64×1×1

01 · The pitch

Raw Vulkan is a
1,000-line setup.
Xpose is one line.

Your phone's GPU can do trillions of operations per second. Android gives you almost no way to use it: no CUDA, no guaranteed OpenCL, RenderScript deprecated.

Xpose closes the gap: real OpenCL C kernels, zero Vulkan ceremony, one kernel on Adreno, Mali, NVIDIA and AMD.

  • Buffers → descriptors, automatically
  • PODs → push constants, automatically
  • Barriers between dispatches, automatically
vector_add.cpp
#include <xpose/xpose.hpp>

xpose::Context ctx;                          // finds the GPU
xpose::Buffer<float> a(ctx, n), b(ctx, n);
xpose::Program prog(ctx, "kernels.spv");
auto add = prog.kernel("vector_add");

xpose::launch(add, {n}, a, b, n).wait();  // ← the whole API

02 · Positioning

clvk's language.
Kompute's ergonomics.
A fraction of the code.

XposeclvkKomputeRaw Vulkan
Kernel languageOpenCL C · pointers & structsOpenCL CGLSLGLSL / HLSL
Dispatchlaunch(k, grid, …)Full OpenCL APIManager / Tensor~300 lines each
Kernel compileBuild timeRuntime (ships LLVM)Runtime (glslang)Offline
Arg bindingAutomatic ✓AutomaticManual tensorsManual
Non-coherent memoryTested on-device ✓DIY
Vulkan SDK neededNo, vendoredYesYesYes

Looking for LiteRT or ONNX Runtime here? Different lane: they run model graphs; Xpose lets you write the kernels. Honest details in the FAQ.

03 · Built for the real world

Desktop-green
is not device-green.

Every desktop driver hides the bugs that kill you on phones. Xpose is engineered, and regression-tested on real hardware, around the traps that make mobile compute fail.

One-liner dispatch

Variadic launch(kernel, grid, args…) with compile-time static_asserts and runtime errors that name the exact mismatched argument.

Correct on Mali

Transfer strategy keyed on mappability, not coherency. Zero-copy on UMA phones with precise cache flush/invalidate, verified on Mali-G57.

No Vulkan SDK

Headers vendored, volk dlopens libvulkan.so at runtime. Clone recursive, cmake, done. On any machine.

CUDA semantics

Grid{x,y,z} is global thread counts. wait_idle() is your cudaDeviceSynchronize. Muscle memory intact.

Slim by design

A ~1.3k-LOC static library. clvk ships LLVM; Kompute ships a framework. Xpose ships a fence.

Proven on hardware

91/91 tests across five drivers, 38/38 on-device on Qualcomm's proprietary driver. Every number measured on real hardware, and every measurement we got wrong is documented in the repo.

04 · The dispatch path

Correct at
every milestone.

Reflection parsed

clspv's NonSemantic reflection is read once at Program::from_file, so every argument's binding, size and kind known before you launch.

Arguments bound

Buffers become descriptor set 0. PODs pack into one push-constant block. A mismatch names the exact offending argument.

Barriers placed

upload → launch → download and launch → launch chains are fenced with pipeline barriers on the compute queue, automatically.

Fence returned

wait() fires a completion hook that recycles the command buffer and descriptor sets. Nothing leaks, nothing stalls.

05 · Proof, not promises

A transformer.
On a phone GPU.

Measured on a OnePlus 15 — Snapdragon 8 Elite Gen 5, Adreno 840, under Qualcomm’s own driver. Same phone, same model file, same int4 weights for every runtime in the chart.

ON-DEVICE LLM

Gemma 3 1B, generating on the phone GPU

A full transformer — 26 layers, 838 dispatches per token, all of it Vulkan compute we wrote — running at 60 tokens/sec in airplane mode. No llama.cpp. No TFLite. No NNAPI. The binary contains nothing but Xpose.

838 dispatches, 1 submit1.9 s model load8192-token context
gemma 3 1B · adreno 840 · int4
decode 60.6 tok/s load 1.9 s device GPU
Xpose60.6
LiteRT-LM48.0
llama.cpp GPU29.6
llama.cpp CPU29.1
decode tok/ssame phone · same model · same int4

FLAT UNDER LOAD

It doesn’t slow down as you talk

Most on-device LLMs decay as context grows. Ours holds ~60 tok/s from token 128 to token 4,095 — flat to within 6% — because Gemma’s sliding-window attention is applied properly and the softmax that dominates it runs parallel.

flat to 6%2.62× → 1.81× spread38/38 on-device
0–12770.9
128–51164.1
512–102361.1
1024–204760.7
2048–409560.6
0tok/s, held across the conversation

06 · THE ECONOMICS

THE CHEAPEST COMPUTE ON EARTH IS ALREADY IN YOUR USERS' POCKETS.

$0

marginal cost

Compute on your users' devices costs you nothing per call. No datacenter bill, no scaling curve. The silicon is already paid for.

Enough

is the whole point

Right-sized workloads don't need a datacenter GPU. A phone delivers real TFLOP/s. Xpose is how you actually use them.

~3B

stranded GPUs

Vulkan-capable Android devices already shipped: fragmented and hostile to program. The fragmentation is the part we solve.

07 · Open core

Open source, forever.
Cloud, when you scale.

The framework

Apache-2.0
  • No API key, no phone-home, no telemetry
  • Every kernel, backend and test in the repo
  • Clone → cmake → computing in four commands
Read the source

Xpose Cloud

in design · talk to us
  • Compile & validate kernels across the whole Android GPU matrix
  • Fleet rollout, A/B and monitoring for GPU workloads
  • Managed on-device personalization backend
Become a design partner

Priced per active device, not per inference. The compute already runs free on your users' phones; metering it would mean phoning home.

Free
$0up to 10k devices
Starter
$99up to 50k devices
Growth
$499up to 250k devices
Scale
$1,999up to 1M devices
Enterprise
Custom1M+ · on-prem · SLA

Replacing a cloud inference bill? We price as a share of what you stop spending. Device makers & embedded: flat annual license.

08 · Straight answers

The questions
we want you to ask.

Yes, and Core ML has had updatable models since 2019. They fine-tune a graph prepared ahead of time. None of them let you write an arbitrary kernel, own the training loop, or run non-ML compute at all. Xpose is the programmable layer, not another model runner.

Any GPU with a Vulkan 1.1 driver, the floor Android has required on modern 64-bit devices for years. Tested green on Adreno 840 (proprietary driver), Adreno X1-85, Mali-G57, NVIDIA, RADV and llvmpipe. Not "every phone ever made", any modern Vulkan one.

It's OpenCL C, a C dialect with pointers, structs and loops, compiled by clspv. A supported subset of OpenCL C 1.2: no function pointers, no malloc, no recursion. Real enough to port real kernels; honest enough to say what's missing.

Measured, not modelled, on a OnePlus 15 (Adreno 840). Gemma 3 1B decodes at 60.6 tok/s and holds it from token 128 to 4,095 — flat to within 6%. On the same phone, same model, same int4 weights, llama.cpp’s OpenCL backend does 29.6 and its CPU backend 29.1. Model load is 1.9 s. Every number comes from a benchmark you can run from the repo, and every number we previously got wrong is documented there too.

09 · Quick start

Cloned to computing
in four commands.

Everything is vendored as submodules. No system Vulkan SDK, no environment setup, no drivers to hunt. And when you're ready for real hardware, run-android.sh pushes the whole suite to your phone over adb.

Open the repo
bash
$ git clone --recursive https://github.com/mansiverma897993/Xpose.git
$ cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
$ cmake --build build
$ ./build/tests/xpose_tests
[==========] 82 tests passed.

# run the whole suite on a real phone:
$ ./scripts/run-android.sh --build

Ship compute
on billions of phones.