← Back to Newsroom
News
May 21, 2026
8 Minutes

GPU Audio v2.3.0 - A Faster, Steadier Real-Time GPU Audio Pipeline

GPU Audio v2.3.0 - A Faster, Steadier Real-Time GPU Audio Pipeline

GPU Audio v2.3.0 is our biggest step toward making GPU-accelerated DSP feel as predictable as a tightly-tuned native audio path. This release is focused on the things our partners care about most: higher throughput on large graphs across Windows and macOS, lower, more deterministic latency on every supported platform, and a noticeably stronger Metal backend on the Mac. Here's what changed under the hood and why it matters.


1. A New Batched GPU Scheduling Backend


The headline engineering effort in v2.3.0 is a brand-new batched GPU scheduling backend that ships on both Windows and macOS. It generates a per-chain blueprint once and then dispatches dependent tasks through a per-block, lock-free batch queue, so the device can pipeline a graph's stages instead of paying per-task launch overhead between every dependency.

On the Mac, these lines up beautifully with Metal's stronger memory-ordering guarantees on Apple Silicon - letting us extract substantially more parallelism out of dependent execution graphs than was previously possible. On Windows, the same backend cuts launch overhead across the board.

The result, measured on our HS-TasNet stem-separation pipeline as a representative large-graph workload:

  • Up to ~10× faster execution on macOS
  • Up to ~2× faster execution on Windows

Bigger graphs benefit the most, because that's where the old per-task launch overhead had the most room to compound. A backwards-compatible legacy path lets previously-built processors run inside the new backend, so existing integrations get the win without a rebuild.


2. A Hardened macOS Metal Backend


Stability on Metal got a serious pass. We replaced raw `MTL::Library` pointers with smart-pointer ownership (`NS::SharedPtr`), tightened the lifecycle of dispatch objects with deterministic `dispatch_release()`, and corrected several buffer-management paths that - under specific patterns - could lead to crashes during long sessions or heavy plugin reloads.

The net effect: Metal now stays solid under the kind of multi-hour, plugin-heavy sessions our pro users actually run.


3. Tighter, Steadier Thread And OS-level Communication


Average latency is easy. Latency variance is the hard part - and it's what makes or breaks a real-time audio path. In v2.3.0 we audited the launcher thread and the cross-thread / OS-level hand-offs end-to-end on both Windows and macOS:

  • A new lightweight wait primitive (`wait_active()`) replaces blocking OS-event waits in the hot path, with first-class active-wait support.
  • Spin loops use `_mm_pause()` instead of `std::this_thread::yield()` for better cache and pipeline behavior.
  • On Windows, the launcher thread is pinned to a single core, runs at the *Pro Audio* MMCSS class, and we dial timer resolution down to 1 ms via NtSetTimerResolution`.
  • On macOS, the launcher loop was refactored around the same active-wait philosophy.

The upshot is a flatter latency distribution - fewer spikes, fewer "Where did that 200 µs come from?" moments, and a more predictable RT path for the DAW to trust.


4. Configurable Launcher Keep-alive


For light or sparse workloads, the most expensive thing in the pipeline is sometimes waking up. When the GPU-communication thread sleeps between launches, the cost of bringing it back - kernel-scheduler wake-up, cache warm-up, page faults - can add up to a noticeable, measurable hitch.

v2.3.0 introduces a configurable launcher keep-alive window (`KeepLauncherActiveMs`, set via `LauncherSpecification.reserved[]`). Within the configured window after the last launch, the launcher thread stays hot in user space - actively waiting on `_mm_pause()` rather than parking on an OS event - so the next launch fires with no thread-wakeup penalty.

It's opt-in and disabled by default, so integrations decide for themselves how to trade a small idle CPU cost against tighter low-latency behavior.


5. Optional GPU Heartbeat - Keep The GPU Out Of Low-power Mode


Modern GPUs aggressively drop into low-power states when idle, and they only re-evaluate that decision a handful of times per second. The first launches right after playback starts can land while the GPU is still spun down - so a demanding workload may briefly run at as little as ~1/10 of the available performance, and a DAW can incorrectly conclude it can't run in real-time.

The new GPU heartbeat quietly issues a low-load kernel on a configurable cadence (`HeartbeatKernelTimeMus`, default 1000 µs, auto-tuned via a feedback loop) so the GPU stays in a higher-performance power state even when no audio is being processed. Initial-launch latency stays predictable, and ambitious workloads start cleanly the moment the user hits play.

The heartbeat is opt-in on every platform (off by default), so integrations that don't need it pay nothing, and the ones that do can dial it in for their specific workload.


6. Stability & Polish


A handful of smaller, very welcome wins shipped alongside the headline work:

  • Strict task ordering on Metal - `MTL::ComputeCommandEncoder` is now created once per launch outside the kernel loop and shared via
  • `DispatchTypeSerial`, guaranteeing in-order execution for chains that depend on it.
  • macOS memory-leak fixes in the Metal scheduler and processor functions.
  • Graceful GPU-allocation failure - `AllocateGpuMemoryInternal()` now returns a null pointer on failure instead of taking the process down, letting integrations recover or surface a useful error.
  • In-place dual-buffer resize in `CopyManager::registerCompletedChain`, avoiding the deallocate-and-reallocate path that could fragment memory or briefly hang under pressure.


Roll-up

GPU Audio v2.3.0 is faster where it matters (large graphs on both Windows and macOS), steadier where it matters (jitter, light workloads, post-silence start-up), and sturdier under real-world session loads. If you're integrating GPU Audio, update at your earliest convenience - and try the new keep-alive and heartbeat knobs against your most latency-sensitive workloads. We think you'll feel the difference immediately.


Get the current GPU Audio SDK from our GitHub page and contact us if you'd like to know more.

Registration & Event Page →

Read Next