gpu-unlock is a Linux kernel module that doubles the FP16 and BF16 instruction-issue rate on GA102, GA103, GA104 and GA106 cards by writing speed selectors before the NVIDIA driver binds. The unlock targets most GeForce RTX 3000-series and some professional RTX cards. The README shows an RTX 3090 Ti dense 8192³ GEMM going from 87 to 157 TFLOPS for BF16, and a PNY RTX 3080 climbing from 65 to 110–113 TFLOPS at the stock 320 W limit.
What gpu-unlock changes
The module writes two speed-selector registers (SS0 0x88888888 for full BF16 rate and SS1 0x8 for IMLA4) and performs a function-level reset before the NVIDIA driver initializes the card. The effect is to double the instruction-issue speed of FP/BF16 floating-point fused multiply-add (FMA) into FP32 operations on GA102, GA103, GA104 and GA106 chips. The README provides 3090 Ti GEMM figures at 450 W with FP32 accumulation: FP16 goes from 87.46 to 118.39 TFLOPS (+35%), BF16 from 87.50 to 157.41 TFLOPS (+80%), and TF32 from 42.58 to 82.61 TFLOPS (+94%).
Issue #25 reports a +33% prefill gain for vLLM serving a 27B BF16 model on a stock RTX 3090, with decode throughput staying flat at 112–114 tok/s because that phase is bandwidth-bound. On the RTX 3080 tested in issue #14, FP32 and INT8 throughput stayed flat, outputs were bit-identical (SHA-256 hash match for FP16, BF16 and TF32), and power at the 320 W cap was unchanged. You'll see the largest uplift in workloads that are compute-bound on FP16/BF16 matmuls with FP32 accumulation; mixed workloads (quantized inference, INT4 diffusion) benefit less.
Check card compatibility and Secure Boot before installing
The module targets cards with GA102, GA103, GA104 and GA106 chips. Run lspci -nnk and note your GPU's PCI address and device ID. The sources do not supply a device-ID-to-chip-family map; you can search the issue tracker for your model or device ID to see whether others have tested it. The module logs and ignores addresses that don't correspond to one of the four chip families when you set gpu_unlock.targets=all.
Issue #21 reports that a GA106 RTX 3060 LHR configuration failed with -ETIMEDOUT at the CPUCTL halt check, -EIO at the WPR2 size check, and a SEC2 reachability problem after FWSEC ran. The README lists GA106, but the only detailed GA106 report in the sources describes a failure that required modifications beyond version 1.0.0.
The module is unsigned and taints the kernel. Secure Boot must be disabled. The tested RTX 3080 and RTX 3090 reports used Secure Boot off; readers with module-signature enforcement will be unable to load the module.
Check for Ubuntu and CachyOS initramfs ordering traps
Issue #11 reports that on Ubuntu systems where the NVIDIA driver packages place nvidia.ko inside the initramfs, the initramfs-tools coldplug trigger loads nvidia before load_modules processes /conf/modules, so the unlock fails with -EBUSY. Check lsinitramfs /boot/initrd.img-$(uname -r) | grep nvidia.ko. If it appears, you will need an init-top hook that loads gpu_unlock ahead of the udev coldplug script (instructions follow installation).
Issue #14 describes a CachyOS system using the mkinitcpio systemd hook, where the ? suffix in gpu_unlock? is written literally into the image's /etc/modules-load.d/MODULES.conf and systemd-modules-load looks for a module named gpu_unlock?. After the first boot, check journalctl -b | grep "gpu_unlock?". If you see Failed to find module 'gpu_unlock?', you will need to remove the ? and rebuild (instructions follow installation).
Install and opt in
Clone the repository and build the packages. The build downloads NVIDIA and CachyOS inputs over HTTPS, checks their SHA-256 hashes, and generates firmware in the build directory:
git clone https://github.com/Zagitta/gpu-unlock
cd gpu-unlock
make install
make install detects your distribution from /etc/os-release and selects the appropriate installer: makepkg -sif for Arch, apt-get build-dep then dpkg-buildpackage and apt-get install for Debian/Ubuntu, or dnf builddep, rpmbuild and dnf install for Fedora/RHEL/CentOS families (the RPM installer requires DNF).
The module does nothing until you opt in with a kernel command-line parameter. Append gpu_unlock.targets=all to unlock every unbound GA102/GA103/GA104/GA106 card, or list specific PCI addresses: gpu_unlock.targets=0000:21:00.0,0000:22:00.0. How you add the parameter depends on your bootloader:
- GRUB (Debian/Ubuntu/Mint): add
gpu_unlock.targets=allinsideGRUB_CMDLINE_LINUX_DEFAULTin/etc/default/grub, then runsudo update-grub. - GRUB (Arch/CachyOS): same edit, then
sudo grub-mkconfig -o /boot/grub/grub.cfg. - Fedora/RHEL:
sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all". - systemd-boot: append it to the
optionsline in your boot entry (bootctl statusshows the location). - UKI / generated entries: add it to
/etc/kernel/cmdlineand regenerate your boot images (sudo mkinitcpio -Pfor mkinitcpio UKIs).
Reboot with a full power cycle. The module loads from the initramfs, unlocks the cards (about a second in total), then the NVIDIA driver binds every card as usual. If your card serves as the display output, its screen blanks from the reset until nvidia-drm takes over.
Fix Ubuntu initramfs-tools ordering after first boot
If you saw nvidia.ko in the initramfs check above, run journalctl -k -b | grep gpu_unlock after the first boot. If you see unlock failed (-16), create an init-top hook that loads gpu_unlock ahead of the udev coldplug script (init-top scripts run in filename order, so gpu-unlock sorts before udev):
sudo tee /etc/initramfs-tools/scripts/init-top/gpu-unlock <<'EOF'
#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ"; }
case "$1" in prereqs) prereqs; exit 0;; esac
modprobe gpu_unlock 2>/dev/null || true
exit 0
EOF
sudo chmod 755 /etc/initramfs-tools/scripts/init-top/gpu-unlock
sudo update-initramfs -u -k all
Power off fully, then boot and confirm you see pci 0000:01:00.0: gpu_unlock: unlocked instead of unlock failed (-16).
Fix CachyOS/mkinitcpio systemd hook after first boot
If you use the mkinitcpio systemd hook, check journalctl -b | grep "gpu_unlock?" after the first boot. If you see Failed to find module 'gpu_unlock?', remove the ? and rebuild:
sudo sed -i 's/gpu_unlock?/gpu_unlock/g' /etc/mkinitcpio.conf.d/zz-gpu-unlock.conf
sudo mkinitcpio -P
Reboot and verify the unlock with journalctl -k -b | grep "gpu_unlock: unlocked".
Check status and stop opting in
After boot, check the kernel log and PCI device status:
journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:21:00.0
A successful unlock logs pci 0000:21:00.0: gpu_unlock: unlocked and the NVIDIA driver loads normally. The module also logs the ROM chain, BIT table, ucode table, FWSEC descriptor and signature selection during the unlock transaction. These checks confirm that the module loaded and the driver bound the card; they do not measure a workload speedup or numerical parity. The sources supply no general benchmark procedure.
To stop unlocking, remove gpu_unlock.targets= from the kernel command line, update your bootloader configuration, and reboot. For a one-time boot without the unlock, delete the parameter in the bootloader's edit screen. Removing the packages also removes the module and the initramfs drop-ins. Opting out is reversible; nothing is flashed to the card.
If the firmware on a card never stops, the module logs the failure and keeps the DMA buffers that firmware may still use until the next power-off. Issue #21 describes a failed unlock that retained resources until power-off and temporarily prevented the NVIDIA driver from using the card.
Suspend to RAM powers the cards off and resets the speed selectors. The module's resume handler re-unlocks every card it unlocked at boot before the NVIDIA driver resumes it, adding about a second to resume. A card that kept power (suspend to idle) is still unlocked and only read. A card the NVIDIA driver has already resumed, or that is bound to another driver, is left as it is. Add gpu_unlock.resume=0 to the kernel command line, or write 0 to /sys/module/gpu_unlock/parameters/resume, to turn off the resume re-unlock. Hibernation is not covered.
Licensing and maturity
The kernel module and local packaging are GPL-2.0-only. The generated payload derives from a pinned CMP reference; NVIDIA firmware remains under its own terms. See firmware/NOTICE.md and licenses/ for attribution and notices. Current version is 1.0.0. The sources do not provide a complete supported-card list by retail model or board revision, guarantee success for every card in the named chip families, establish a speedup or unchanged numerical output for your workload, specify complete kernel and NVIDIA driver version prerequisites, or comprehensively cover stability, warranty or vendor-support risks.
Confirm your card and boot setup, then measure your own workload
Check the gpu-unlock repository issue tracker for your card model or device ID before installing. Read open issues and pull requests for the latest compatibility notes, fixes and detailed benchmarks. After a successful unlock, measure your own workload with before-and-after runs to confirm the gain and numerical parity; the supplied benchmarks are workload-specific and do not generalize to every application or configuration.
Verification status: Supported by official documentation only under the conditions below; not reproduced in a test environment by IGPROD. Checked 2026-10-24.
Conditions:
- The documented target families are GA102, GA103, GA104, and GA106.
- The module acts only when the kernel command line includes gpu_unlock.targets=all or a targeted PCI address.
- The module must run before the NVIDIA driver binds the card; an already bound or powered-down card is skipped.
- The README says hibernation is not covered.
Sources:
- github.com/Zagitta/gpu-unlock
- github.com/Zagitta/gpu-unlock/blob/main/README.md
- github.com/Zagitta/gpu-unlock/issues/14
- github.com/Zagitta/gpu-unlock/issues/25
- github.com/Zagitta/gpu-unlock/issues/11
- github.com/Zagitta/gpu-unlock/issues/21
- gpu-unlock/VERSION at main · Zagitta/gpu-unlock · GitHub (github.com)
Leave a comment
Your email address will not be published. Required fields are marked *