Repository navigation
Install
curl -fsSL https://vxlang.org/install.sh | sh
The Linux toolchains include the LLVM they need. On macOS, Vx requires LLVM 22. For
--verify-seams, every platform needs the z3 binary. The installer checks for what
is missing and prints the command to install it. See
the install guide.
Platforms
| Platform | Artifact |
|---|---|
| macOS, Apple Silicon | vx-<version>-aarch64-apple-darwin.tar.gz |
| Linux x86_64, glibc 2.35+ | vx-<version>-x86_64-unknown-linux-gnu.tar.gz |
| Linux x86_64 with an NVIDIA GPU, glibc 2.35+ | vx-<version>-x86_64-unknown-linux-gnu-cuda.tar.gz |
Verify a download against its .sha256 before unpacking.
What's Changed
- stdlib: preserve file paths and use unsigned file I/O lengths by @minzyfox in #1076
- codegen: usize arithmetic traps on overflow and never wraps by @hiraditya in #1149
- core::libm: asin, acos, atan and atan2 for f32, f16 and bf16 by @hiraditya in #1156
- core::libm: hypot for f32, f16 and bf16 by @hiraditya in #1157
- core::libm: pow for f32, f16 and bf16 by @hiraditya in #1173
- core::libm: log, log2, log10 and log1p for f64 by @hiraditya in #1176
- core::libm: exp, exp2 and expm1 for f64 by @hiraditya in #1184
- hir: a call moves its by-value arguments wherever it is by @hiraditya in #1175
- hir: a unary operator drops the tensor it moves by @hiraditya in #1172
- hir: two drop points that would free a tensor twice, found in review of #1174 by @hiraditya in #1181
- docs: design note for the view type by @hiraditya in #1185
- Implement responsive styles for small screens of code blocks by @SebbeBroman in #1182
- blog: proving tensor indices at compile time by @hiraditya in #1196
- fuzz: count what each program frees, and a generator that moves tensors by @hiraditya in #1189
- blog: a layout diagram of the KV cache in the tensor-index post by @hiraditya in #1208
- flat: a row returned as a ?-shaped tensor is returned as a copy by @hiraditya in #1190
- hir: a call through an expression moves its by-value arguments by @hiraditya in #1198
- drops: free each tensor at its drop, on both code generators by @hiraditya in #1200
- core::libm: sin, cos and tan for f64 by @hiraditya in #1207
- codegen: share the type-lowering helpers in the legacy generator by @hiraditya in #1192
- core::libm: f16 and bf16 hypot keep a NaN input's payload by @hiraditya in #1199
- codegen: share the type-lowering helpers in the legacy generator by @hiraditya in #1193
- core::libm: asin, acos, atan and atan2 for f64 by @hiraditya in #1210
- core::libm: hypot for f64 by @hiraditya in #1213
- core::libm: pow and exp10 for f64 by @hiraditya in #1215
- cla: one queue per pull request, so waiting runs are not cancelled by @hiraditya in #1228
- update discord server invite link by @minzyfox in #1227
- www: keep wide posts from scrolling sideways on a phone by @SebbeBroman in #1201
- contributing: a person must be the author of every commit by @hiraditya in #1218
- core::libm: sinh, cosh and tanh for f64, built on its exp by @hiraditya in #1223
- drops: every program frees its tensors at their drops by @hiraditya in #1225
- drops: the Drop trait, and dropping a struct by @hiraditya in #1229
- emacs-vx: add an Emacs major mode for .vx files by @Andrewfeng123 in #1221
- examples: make llama.vx generate the right text by @Andrewfeng123 in #1217
- drops: a struct nothing names is dropped at the end of its statement by @hiraditya in #1231
- hir: a generic struct or enum moves as any other, unless it is Copy by @hiraditya in #1233
- core::libm: asinh, acosh and atanh for f64, f16 and bf16 by @hiraditya in #1244
- core::sync::atomic: atomic integers and bool over mlir! by @hiraditya in #1248
- core::num: shortest text for f64 and f32, written in Vx (Ryu) by @hiraditya in #1249
- tests: topology_dispatch expects the vx.drops module attribute by @hiraditya in #1254
- blog: Vx fully embraces {ML, IR, MLIR} by @hiraditya in #1257
- stdlib: use unsigned stdio and network I/O lengths by @minzyfox in #1214
- core::fmt: a Write trait, FormatSpec, and integers in any radix by @hiraditya in #1247
- check: Trait::method(&x) calls that trait's method by @hiraditya in #1256
- core::libm: cbrt for f64, f32, f16 and bf16 by @hiraditya in #1262
- core::libm: erf and rsqrt, for the activations and norms of ML models by @hiraditya in #1263
- core: usize gets the impls the other integer widths have by @hiraditya in #1261
- blog: correct the {ML, IR, MLIR} post by @hiraditya in #1270
- drops: dropping an enum drops its payload by @hiraditya in #1266
- drops: the library types implement Drop by @hiraditya in #1267
- lang: panic(msg), and expect on Option and Result by @hiraditya in #1274
- lang:
-> !for a function that never returns, and core::panic by @hiraditya in #1278 - check: an untyped number takes its enum payload's type by @hiraditya in #1294
- driver: print the flat-path line only when VX_FLAT_DBG is set (#1179) by @YodHeVauHe in #1191
- drops: a Vec drops its elements by @hiraditya in #1277
- views: a view of GPU memory keeps its placement, and a field read names itself by @joissriram99 in #1250
- codegen: a non-generic enum keeps its payload on the legacy path by @hiraditya in #1282
- codegen: a match binds every value of an enum variant on the legacy path by @hiraditya in #1285
- tests: two fixtures set VX_FLAT_DBG to see the flat-path line by @hiraditya in #1312
- lang: match on a tuple by @hiraditya in #1304
- lang: enum variants inside a tuple pattern by @hiraditya in #1305
- lang: operators on a struct call the core::ops traits by @hiraditya in #1313
- lang: a[i] on a struct goes through Index and IndexMut by @hiraditya in #1314
- lang: comparisons on a struct with only PartialOrd by @hiraditya in #1315
- drops: non-generic enums and variants of several values are dropped by @hiraditya in #1320
- flat: a struct inside a generic struct or an enum has a layout by @hiraditya in #1322
- flat: an Option can hold an enum whose variants carry nothing by @hiraditya in #1323
- flat: a field read through a returned reference knows its struct by @hiraditya in #1324
- lang: a call that never returns can stand where a value is expected by @hiraditya in #1327
- gid: remove TYPE_NEEDS_DROP, which nothing set or read by @hiraditya in #1332
- drops: a spawn region frees the tensors it makes by @hiraditya in #1333
- prover: a call must meet the called function's requires by @hiraditya in #1334
- drops: a spawn region's value moves to the function around it by @hiraditya in #1339
- prover: a call's result is known from the called function's ensures by @hiraditya in #1336
- drops: a placed tensor is freed by the drop of its last owner by @hiraditya in #1337
- blog: how Vx frees memory by @hiraditya in #1350
- check: a reference to a tensor in GPU memory can be passed to a kernel by @hiraditya in #1340
- docs: bring the drop semantics plan's status up to date by @hiraditya in #1345
- prover: facts follow the paths, and ensures is checked at each return by @hiraditya in #1346
- drops: a tensor a device region creates is made before the region by @hiraditya in #1347
- drops: a placed uninit() tensor is allocated on its device by @hiraditya in #1354
- drops: Verified<..> and Pinned<..> tensors are dropped like the tensor inside by @hiraditya in #1359
- provision: build our own LLVM in the checkout by @hiraditya in #1272
- ci: build and test against our own LLVM, kept in the Actions cache by @hiraditya in #1363
- lang: a for loop goes over the items of a tensor by @hiraditya in #1366
- benchmarks: RoPE uses the index within the head by @hiraditya in #1365
- codegen: c = a @ b is not written in place when c's pointer is taken by @hiraditya in #1377
- check: an empty shape means rank 0, not "any shape" by @hiraditya in #1378
- check: the liveness walk sees inside every kind of expression by @hiraditya in #1380
- check: a void value is not moved when it is used by @hiraditya in #1381
- codegen: an assert in a transfer lowering stays in that lowering by @hiraditya in #1379
- lowering: a transfer into shared memory must be inside a spawn region by @hiraditya in #1384
- codegen: a const generic function is named by its argument's value by @hiraditya in #1385
- blog: why void is a value in Vx by @hiraditya in #1390
- codegen: a rank-0 tensor is a buffer on the legacy code generator by @hiraditya in #1392
- codegen: rows of a tensor with run-time extents on the legacy code generator by @hiraditya in #1393
- codegen: the legacy code generator emits only the functions a program uses by @hiraditya in #1394
- blog: can a library describe the memory hierarchy? by @hiraditya in #1396
- tests: run the standard library's tests, and test a cloud fleet by @hiraditya in #1399
- docs: state when one tensor type fits another by @hiraditya in #1402
- blog: programming a GPU fleet as one program by @hiraditya in #1404
- check: print types in errors the way a program writes them by @hiraditya in #1405
- check: a wrong reshape gives one error, E3047, with its line by @hiraditya in #1406
- checker: an if with no else cannot be used as a value by @hiraditya in #1408
- check: Result<void, E>::Ok(..) has the type it names by @hiraditya in #1409
- codegen: a void function can be called through a function pointer by @hiraditya in #1410
- parse: a program cannot declare a type named void by @hiraditya in #1411
- docs: a plan for padding tensors by @hiraditya in #1425
- memory: a sub-byte tensor element takes a whole byte by @hiraditya in #1426
- check: PadMode::Pad and PadMode::Trim may only do what their names say by @hiraditya in #1423
- std::tensor: declare PadMode by @hiraditya in #1427
- reshape: PadMode::Pad makes a new tensor by @hiraditya in #1429
- flat codegen: lower reshape with PadMode::Pad by @hiraditya in #1430
- tensor: t.pad(shape) pads each axis with zeros by @hiraditya in #1431
- docs: reshape, PadMode and pad by @hiraditya in #1432
- checker: an array literal and Tensor::fill need as for another number type by @hiraditya in #1436
- docs: list the coercions the compiler actually allows by @hiraditya in #1412
- release: the Linux toolchains carry their own LLVM by @hiraditya in #1382
- stdlib: define the byte I/O error contract and fallible file bridge by @minzyfox in #1349
- docs: list the language rules that let bodies be checked in parallel by @hiraditya in #1442
- release: version 0.0.3 by @hiraditya in #1439
- blog: when the build order changes the program by @hiraditya in #1444
- docs: larger examples on the autodiff page, each checked by a test by @hiraditya in #1453
- release: ship the macOS dispatch library that
vxc --runlinks by @hiraditya in #1458 - install.sh: save Homebrew's LLVM link folder, which survives
brew upgradeby @hiraditya in #1461 - docs: set VX_VERSION for the sh that runs the installer by @hiraditya in #1465
- release: leave llama.vx out of the toolchain, and compile every shipped example by @hiraditya in #1466
- tests: topology_dispatch no longer expects unused printMemref declarations by @hiraditya in #1459
- docs: plan for addressability and scaled number formats by @hiraditya in #1438
- check: number literals given to grad, vjp and jvp take the parameter types by @hiraditya in #1460
- driver: run-jit passes only the program's own arguments by @hiraditya in #1478
- release: ship Enzyme in the macOS toolchain, so grad, vjp and jvp work by @hiraditya in #1482
- driver: --package name=dir imports a library by name by @hiraditya in #1484
- parser: accept
asafter an unsafe block by @hiraditya in #1480 - codegen: decline enums with unsupported payload layouts by @minzyfox in #1470
- docs: define the roadmap for GPU backends by @hiraditya in #1138
New Contributors
- @SebbeBroman made their first contribution in #1182
- @Andrewfeng123 made their first contribution in #1221
- @YodHeVauHe made their first contribution in #1191
Full Changelog: v0.0.2...v0.0.3