What Vx refuses to do

Heterogeneity belongs in the type system, not in the runtime.

Vx has one idea. Most of what follows is a refusal that falls out of it.

The idea

A value's type says where it lives. Tensor<f32, [4, 4], Memory::GPU_HBM> is a different type from Tensor<f32, [4, 4]>. A device that cannot address the first will not compile against it, and the error names the space the value is in, the spaces the device can see, and the transfer that would fix it.

It will not move your data for you

Crossing a memory space takes an explicit transfer(), even where the hardware boundary is free. On Apple's unified memory that call lowers to almost nothing. It is still written down, because where a program moves its data should be legible in the source rather than recovered afterwards from a profile.

It will not guess the machine

Most compilers carry a cost model. Vx reads one. A machine file names a real part's memory spaces, their capacities and bandwidths, and the links between them; the compiler admits or rejects placements against that description. Fourteen ship with the toolchain — A100, H100, H200, B200, MI300X, an Apple M4, multi-GPU nodes, a Cortex-M7 — each citing its sources and marking unverified figures as unverified.

Units are exact integer conversions. GB is 109 and GiB is 230, so a figure copied off a vendor sheet means what the sheet meant.

It will not wait for the hardware to tell you

A tile that does not fit the space it is placed in is a compile error. So is a working set that fits tile by tile and not together. Those verdicts cost a rebuild on a laptop, rather than an afternoon on a machine billed by the hour.

It will not claim what it has not checked

Vx is an early research compiler. The placement and capacity rules have diagnostic codes and tests behind them; they do not have proofs. Where a check is young, the documentation says so and names the issue that tracks it.

One claim in particular it will not make. Vx is not zero-overhead end to end. Placement and capacity are resolved during compilation and cost nothing at run time — that much is true, and it is the part worth saying. Dispatch is a runtime, with host, CUDA and CoreML backends and a wire protocol for remote regions. Rounding that up to "zero overhead" would be easy and would be false.

What it costs you

PyTorch users mutate architecture mid-loop, print a tensor shape, branch on it, and carry on. In Vx — ahead-of-time, statically regioned — that same dynamism takes real work.

Vx is the right language for the thing that must be correct and fast across ten kinds of silicon. It is the wrong language for the thing you are still figuring out.

Check it in five minutes

None of the above is worth believing on our say-so. Install the toolchain, write six lines that place a tensor on a device, then delete the transfer and read what comes back:

Error[E6003]: 'a' lives in CPU_DRAM but NPU[0] sees only [NPU_HBM];
insert an explicit transfer to NPU_HBM (cost 50 on the declared path)

Every code the compiler can emit has a page of its own, with the message and, where the test suite has one, a program that triggers it.