RTX 30 Series BF16 Unlock Speeds Up ComfyUI by Up to 60%
An open-source Linux kernel module restores the FP/BF16 issue rate on RTX 30 cards. On one 3090 Ti, ComfyUI BF16 graphs run 31 to 60 percent faster while INT8 stays flat.
The card family has carried a software cap for years: consumer GA102, GA103, GA104 and GA106 chips issue FP/BF16 fused multiply-add into FP32 at half the rate of their professional siblings, with the same silicon underneath. gpu-unlock writes the speed selectors that lift that ceiling before nvidia loads, so the rest of the stack runs unmodified.
What the module changes
The project combines two earlier approaches: the CMP unlocker's V67/PLM technique, and the pre-driver timing of the UEFI method. Concretely, before the NVIDIA driver binds a card, the module writes speed selector SS0 0x88888888, which selects the full BF16 rate, and the 4-bit SS1 0x8 for IMLA4, then performs FLR and exits. It is neither a UEFI application nor a patched driver, which is the property its author emphasizes: there is no patch to redo every time NVIDIA ships a new driver version.
The README states the effect plainly: it doubles the instruction issue rate of FP/BF16 FMA into FP32 on those four chip families. The module does nothing unless the kernel command line opts in with gpu_unlock.targets=, either all or a list of PCI addresses, and cards are unlocked concurrently in about a second however many there are.
What the numbers look like
The project's own reference measurement is a dense 8192³ GEMM on an RTX 3090 Ti at 450 W, five-sample medians with FP32 accumulation:
BF16 goes from 87.5 to 157.4 TFLOP/s and TF32 from 42.6 to 82.6, nearly doubling, while FP16 gains less at 87.5 to 118.4. The README describes the change as doubling the issue rate of FP/BF16 FMA into FP32 without breaking the numbers down per data type, so the published table is the only measurement of that split.
User compatibility reports, collected in the repository README, cover the rest of the stack:
| Card | Result | BF16 GEMM gain |
|---|---|---|
| RTX 3090 Ti | Unlocked | +68–80% |
| RTX 3090 | Unlocked | +25–67% |
| RTX 3080 10 GB | Unlocked | +70–73% |
| RTX 3080 20 GB | Unlocked | +56–59% |
| RTX 3070 | Unlocked | +73–81% |
| RTX 3060 12 GB | Unlocked | about +80% |
| RTX 3080 Ti 20 GB (OEM) | Unlock completes, BF16 stays at half rate | none |
| RTX 3070 Ti | Not tested with this module | none |
The README is explicit that these figures come from each report's own benchmark and are not directly comparable. Power limit is the main confounder: the lowest figure, +25% on a 3090, comes from a card capped at 225 W.
Measured in ComfyUI
The useful test for this site is not GEMM but generation. An independent RTX 3090 Ti owner, u/under-_-null, ran the same graphs on stock and unlocked drivers and published median time per image or clip: up to 60% faster on BF16 pipelines, and close to unchanged on INT8.
| Model and precision | Stock | Unlocked | Gain |
|---|---|---|---|
| MOSS-Image SFT BF16 | 71.98 s | 45.40 s | +58.6% |
| Qwen-Image 2.1 Turbo BF16 | 8.51 s | 5.41 s | +57.2% |
| Z-Image Turbo BF16 | 6.79 s | 4.35 s | +56.1% |
| FLUX.1 dev FP8 checkpoint | 31.96 s | 20.66 s | +54.6% |
| Krea 2 Turbo BF16 | 15.65 s | 10.70 s | +46.3% |
| MiniMax H3 BF16 (video and audio) | 253.27 s | 158.05 s | +60.2% |
| LTX-2.5 distilled BF16 (video and audio) | 70.81 s | 60.63 s | +16.8% |
| MOSS-Image SFT INT8 | 27.31 s | 27.23 s | +0.3% |
| Qwen-Image 2.1 Turbo INT8 | 3.92 s | 3.75 s | +4.6% |
| MiniMax H3 INT8 ConvRot | 155.07 s | 118.21 s | +31.2% |
Two things stand out. The gains concentrate in BF16 work, which is where the issue rate matters; INT8 quantization paths are almost untouched, so a user who already runs INT8 ConvRot checkpoints gets a few percent, not 60. MiniMax H3 under INT8 ConvRot is the exception at 31%, far above the other INT8 rows in the same report.
Output fidelity held up: the same report matched 150 unlocked and stock still-image runs and found identical decoded RGB pixels. Other compatibility reports in the repository say the same, which is consistent with an issue-rate change rather than a precision change.
Requirements and risks
Details that matter before trying it, all from the project documentation:
- Linux only. The module builds against installed kernel headers and installs through mkinitcpio, initramfs-tools or dracut, with Arch, Debian and Fedora package targets.
- Opt in per card.
gpu_unlock.targets=allunlocks every unbound GA10x card; otherwise list PCI addresses aslspci -Dprints them. Cards already initialised by a driver are refused. - Cold boot. Loading the module by hand after boot does nothing to a card
nvidiahas already bound. - Suspend handling. Speed selectors reset on power loss, so the module re-unlocks on resume through a suspend notifier unless disabled with
gpu_unlock.resume=0. Hibernation is not covered. - Display cards work, with the console blanked from the reset until
nvidia-drmtakes over. - Not every card responds. The OEM RTX 3080 Ti 20 GB completes the unlock but keeps BF16 at half rate, and there are no reports yet for GA103.
A separate community project, impacifist/Windows-GPU-UNLOCK, ports the technique to a UEFI path for Windows users. It is not part of the original project and was not tested here.
Availability
- Module: Zagitta/gpu-unlock, version 1.0.0 in the repository, with the compatibility table and the firmware extraction code.
- Benchmark threads: RTX 30-series unlock discussion and the RTX 3090 Ti ComfyUI report.
- Windows port: impacifist/Windows-GPU-UNLOCK.
Comments
Sign in with GitHub to join the discussion.