Skip to content

av1gpu v0.9.0

Choose a tag to compare

@github-actions github-actions released this 03 Nov 11:40
· 84 commits to main since this release

Linux x86_64 and Windows x64 binaries for NVIDIA GPUs from Turing (RTX 20, T4) to Blackwell (RTX 50). They need only the NVIDIA driver; the Windows zips include nvJPEG's DLL. See the README for usage.

Which download

Take the CUDA 13 build unless your driver is older than 580. Both builds give the same files: on an L4 and on an RTX PRO 4500, the CUDA 13 and CUDA 12 Linux builds gave identical output for all 1,220 test files compared.

File Built with NVIDIA driver
av1gpu-0.9.0-linux-x86_64.tar.gz CUDA 13.4 580 or newer
av1gpu-0.9.0-linux-x86_64-cuda12.tar.gz CUDA 12.9 525 or newer
av1gpu-0.9.0-windows-x86_64.zip CUDA 13.4 580 or newer
av1gpu-0.9.0-windows-x86_64-cuda12.zip CUDA 12.9 528 or newer

New: one image 2–3× faster, batches 5–11 % faster, same files

Every output file is byte-identical to v0.8.0's. Across 103 test runs (5,679 files: every preset, quality 30–95, 4:4:4, 10-bit, monochrome, lossless, alpha, palette mode, odd sizes, thumbnails, short batch lists and single-file mode) there were 0 differences, on an NVIDIA L4 and on an RTX PRO 4500 Blackwell. The two GPUs also wrote the same bytes as each other.

One image as its own process, CUDA start-up included (Linux, driver 595, median of 12 cold runs):

Input L4, v0.8.0 L4, v0.9.0 RTX PRO 4500, v0.8.0 RTX PRO 4500, v0.9.0
2.5 MP JPEG 1.06 s 0.36 s 1.03 s 0.51 s
10.5 MP JPEG 1.21 s 0.47 s 1.14 s 0.58 s
512 × 384 thumbnail 1.06 s 0.35 s 1.04 s 0.50 s
a photo and its thumbnail as one --batch 1.24 s 0.58 s 1.19 s 0.68 s

Converting an upload (a photo and its thumbnail) as two processes now takes 0.71 s instead of 2.12 s on the L4. If you set GP_MAX_CONNECTIONS=1 to speed up v0.8.0, you can drop it: v0.9.0 asks for one hardware queue by itself for a single image and for lists of up to 8 encodes.

Batch mode (MP/s, or images/s for the thumbnails; median of 6 runs, with v0.8.0 alternating in the same session; v0.8.0 against a second copy of itself moved by 0.7 % at most):

Set L4, v0.8.0 L4, v0.9.0 RTX PRO 4500, v0.8.0 RTX PRO 4500, v0.9.0
Photos 0.2–24 MP, default 236 257 +9.1 % 406 434 +6.9 %
~1 MP photos, default 76.4 81.1 +6.2 % 141 148 +4.9 %
Thumbnails, images/s 416 450 +8.1 % 776 831 +7.1 %
Photos, --yuv 444 --depth 10 170 190 +11.4 % 293 325 +10.9 %

With GP_ENCODERS=4 the L4 does 261 MP/s on the photos (v0.8.0: 236), 420 with --preset turbo3 --small-preset none (377), and 645 Kodak images per second (585). It runs at its 72 W cap with either version, so energy per megapixel drops from 0.29 to 0.27 J. At the same file size, one L4 is now 9.1× libaom speed 6 on all 16 CPU threads (was 8.0×) and 17× NVENC AV1 on the same card (was 15×).

Where it came from:

  • Start-up (#56): one hardware queue instead of 32 for short runs, the JPEG decoded while the encoder sets up, the pinned staging buffer allocated only when a JPEG needs the CPU decoder, and a plain exit once the output is written (Linux).
  • Pipeline (#56): no CDEF apply and no reconstruction download when nothing reads them, and one variance-boost table row per encoder instead of all of them.
  • Reconstruction (#57): 32-bit inverse transforms and unrolled forward-transform loops.
  • Analysis (#58): a warp-parallel intra edge filter and less shared memory.
  • Entropy coding (#59): the window coder split across three warps, and a single image uploaded without a host copy.

Every test output decodes exactly in dav1d and aomdec (691/691 encodes and 35/35 alpha items, on both GPUs), and compute-sanitizer memcheck, racecheck and synccheck are clean. Details: RESULTS.md, raw results.

Known limitations

  • Not implemented: intra block copy, loop restoration, superres, film grain. Lossy frames use luma palettes only.
  • Start-up on Blackwell takes about 0.15 s longer than on an L4. Most of that is loading the sm_120 reconstruction kernels, 38 MB each: av1gpu loads all four variants at start, though an image uses one.
  • Windows: its speed was measured with v0.5.0 (67–83 % of Linux), and v0.9.0's start-up hasn't been timed there. CPU limits set by job objects or containers aren't read (the thread count follows the process's CPU affinity), and the tests run on Linux only.
  • GPUs newer than Blackwell first compile the code from PTX, which took over ten minutes in a test. Give av1gpu its own compute cache so it is kept (README, Download).
  • PNG and WebP metadata: their ICC profiles and EXIF orientation are not read yet. JPEG profiles are kept, and JPEG orientation is signalled in the AVIF (irot / imir).
  • compute-sanitizer on Blackwell: memcheck on the CUDA 13 build needs compute-sanitizer 2026.3 (CUDA 13.4) or newer. 2026.1 reports a false error inside CUB's scan kernel there, for v0.8.0 too.