DPC latency guide 733 µs to 11.6 µs (1 hour 10 minute test) on a 9950X3D + 9070 XT Every tweak I tried ranked by what actually worked
TL;DR
My worst idle interrupt-to-process latency in LatencyMon went from 733 µs to 11.6 µs over a 70-minute run (about 7 µs at rest) on a Ryzen 9 9950X3D + RX 9070 XT, Windows 11 25H2. The biggest wins came from giving every busy device its own CPU core instead of letting Windows use CPU 0 for everything, limiting CPU idle to C1
Proof Screenshots : drive.google.com
- Rig: Ryzen 9 9950X3D, Radeon RX 9070 XT, MSI MAG B850M Mortar WiFi, 32 GB DDR5-6000, Windows 11 Pro 25H2.
- Who it's for: anyone with audio pops, stutter, or LatencyMon numbers that won't come down. The ideas work on any PC; the registry keys and some BIOS names are AMD-specific.
- How it's sorted: Tier 1 = measured big wins, Tier 2 = smaller wins worth doing, Tier 3 = experiments to A/B, then a list of things to skip.
- Golden rule: change one thing, reboot, run LatencyMon 10–15 min, keep it only if the number moves. Back up before any registry or BIOS change.
Measure first
You can't fix what you can't see, and most "DPC tweak" posts never measure. Use LatencyMon (free, Resplendence). Close HWiNFO, Afterburner, Process Explorer and RGB apps while measuring: they poll hardware and add their own spikes.
How to run it: 10–15 minutes idle, then once during a game. A 2-minute run lies; the bad spikes can come once a minute.
|Number in LatencyMon|What it tells you|If it's high|
|:-|:-|:-|
||||
|Highest interrupt-to-process latency (Main tab)|How long a waiting thread waits after an interrupt. The best "how snappy is this PC" number|Clean drivers but high value = scheduling problem: a background app waking on a timer, VBS/hypervisor, CPU 0 overloaded, or deep C-states|
|Highest DPC routine execution time + driver name|The single slowest driver routine|That driver is your target. GPU drivers (amdkmdag.sys, nvlddmkm.sys) usually top this list|
|Drivers tab sorted by highest execution, and the CPUs tab|Which drivers run, how often, and on which core|Lots of DPCs on CPU 0 = interrupts haven't been divided (Tier 1 fix)|
Reading the pattern:
- Spikes every few seconds, on a rhythm = something polling. Open Process Explorer, add the CPU Cycles Delta column, sort, and watch what jumps in time with the spikes. In my case it was AMD Software's AMDRSSrcExt.exe, waking every ~2 s.
- Test per CCD: set LatencyMon's own affinity to one CCD, then the other. If only one side spikes, the problem lives there.
- Ignore LatencyMon's reported CPU speed on Ryzen (it showed me 430 MHz); it misreads clocks over WMI.
- For the full picture, an xperf trace gives you a histogram of every DPC, not just the worst one. The PC-Tuning repo ships xperf-dpcisr.bat for exactly this.
- My latency-check.ps1 does the first round of detective work in ~2 minutes (see The scripts).
Tier 1: the biggest measured wins
1. Interrupt affinity: get every busy device off CPU 0
This was the single biggest lever, and I proved it three times. Windows sends the interrupts and DPCs of most devices to CPU 0 by default, so the GPU, USB, audio and network all queue up on one core, and on a dual-CCD X3D chip that core is on the gaming CCD.
|What happened|Worst interrupt-to-process|DPCs on CPU 0|
|:-|:-|:-|
||||
|Nothing pinned|515 µs (about every minute)|67,015|
|GPU pinned to a CCD1 core|215 µs (once in 19 min)|710|
|A driver reinstall silently wiped the pin|100–400 µs, spikes every few seconds|CPU 0 busiest core again|
|Every busy device on its own CCD1 core|20.9 µs over 9.5 min|quiet|
|Plus the three CPU USB controllers on their own cores, device power saving off and the GPU registry keys|11.6 µs over 70 min|—|
The rules:
- One device per core, not "all of CCD1". It keeps the effect predictable and visible in LatencyMon's CPUs tab.
- Use first threads of physical cores (even numbers on a 16-core SMT chip: 16, 18, 20…). Each core's second thread shares its execution units.
- Dual-CCD X3D: put devices on the non-V-Cache CCD (16–31 on a 9950X3D) and keep games on the V-Cache CCD.
- Single-CCD or Intel: pick any cores except 0 that your game leans on least.
- Pinning moves a DPC; it doesn't make it shorter. A slow driver stays slow on any core.
the layout i used (9950X3D):
|Device|CPU|
|:-|:-|
|||
|RX 9070 XT|16|
|CPU USB 2.0 controller|18|
|Realtek 5GbE (via RSS)|20, 22|
|Chipset USB (keyboard dongle, Bluetooth, onboard USB audio)|24|
|GPU HDMI audio (TV sound)|26|
|CPU USB 3.x controllers|28, 30|
Pinning the USB controllers mattered a lot , Don't skip them.
How to set it:
Which core for the GPU? Benchmark it with AutoGpuAffinity. Run it uncapped (V-Sync off, No RTSS) with the benchmark pinned to your game cores, or every core reads the same capped number. On my chip, CCD1 beat CCD0 clearly, and CPUs 16 and 26 had the steadiest 1% lows.
1. Find which controller each device hangs off: Device Manager → View → Devices by connection, or my list-devices-irq.ps1.
2. In Microsoft's Interrupt Affinity Policy Tool (intPolicy) or GoInterruptPolicy, pick the device → IrqPolicySpecifiedProcessors → tick one core → reboot.
3. Or do it in the registry, under HKLM\SYSTEM\CurrentControlSet\Enum\PCI<device><instance>\Device Parameters\Interrupt Management\Affinity Policy: DWORD DevicePolicy = 4, and binary AssignmentSetOverride = the CPU mask.
4. Or run my apply-irq-masks.ps1, which finds devices by hardware ID, backs up first and writes an undo script.
|CPU|AssignmentSetOverride bytes|
|:-|:-|
|||
|16|00 00 01 00 00 00 00 00|
|18|00 00 04 00 00 00 00 00|
|20|00 00 10 00 00 00 00 00|
|24|00 00 00 01 00 00 00 00|
|26|00 00 00 04 00 00 00 00|
|28|00 00 00 10 00 00 00 00|
|30|00 00 00 40 00 00 00 00|
Network card: don't pin it, steer RSS instead. RSS never uses SMT sibling threads, so pick even numbers , adjust depending on your cpu core count
Set-NetAdapterRss -Name "Ethernet" -BaseProcessorNumber 20 -MaxProcessorNumber 22 -MaxProcessors 2
Set-NetAdapterRss -Name "Ethernet" -NumberOfReceiveQueues 2
Get-NetAdapterRss
Gotchas:
- A GPU driver reinstall and every AutoGpuAffinity run reset the GPU pin to Windows' default. Re-apply after both.
- Never pin NVMe drives. They give each core its own queue on purpose.
i made scripts to reapply everything for me but they are specific to my build
2. Kill everything that polls hardware on a timer
Polling apps cause the classic "spike every few seconds" pattern, because each poll stalls a core. After my background cleanup, the occasional 215 µs spike stopped showing up altogether.
- RGB software: iCUE, Armoury Crate, Mystic Light, L-Connect. Set the lighting once, then don't keep the app running.
- Sensor monitors: HWiNFO (polls every 2 s by default) sensor polling. Close them when you're not looking at them.
- AMD Software extras: Instant Replay (keeps the video encoder running), the metrics overlay (cpumetricsserver.exe), AMD Link. AMDRSSrcExt.exe woke every ~2 s on my system.
- Vendor : MSI Center , Ryzen Master's SDK task, ASUS Armory crate, Adobe and AMD updater tasks.
- Anything that keeps respawning wmiprvse.exe, which means something is querying WMI for sensors.
3. Power plan: cap CPU idle at C1 (i did this over the ultimate performance powerplan)
Waking a core from a deep sleep state takes time, and every interrupt pays it. The fix is a tuned Ultimate Performance plan with "light C-states": my cores may only enter C1. It costs about 20 W at idle (my package at idle went from ~30 W to ~50 W), and in HWiNFO w C1 around 94%.
I didn't measure this one in isolation; it was in place before my first logged run. Every serious latency guide agrees on it, though, and it's the foundation for everything else.
|Setting|Stock Ultimate|Set to|
|:-|:-|:-|
||||
|Processor idle state maximum|0|1|
|Idle promote threshold|60|100|
|Idle demote threshold|40|100|
|Minimum processor state|0%|100%|
|Energy performance preference (EPP)|10|0|
|Latency sensitivity hint EPP|100|0|
|USB selective suspend|Enabled|Disabled|
|USB 3 link power management|Moderate|Off|
|Allow throttle states|Automatic|Off|
Already right on stock Ultimate (check it on your rig): core parking min cores 100%, PCIe link state power management Off, boost mode Aggressive. ( i use process lasso for scheduling on 9950x3d )
The commands (run cmd as admin, paste your Ultimate GUID from powercfg /list):
powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61
powercfg /list
set ULT=PASTE-ULTIMATE-GUID-HERE
set PROC=54533251-82be-4824-96c1-47b60b740d00
set USB=2a737441-1930-4402-8d77-b2bebba308a3
set PCIE=501a4d13-42af-4429-9fd1-a8218c268e20
powercfg /export "%USERPROFILE%\Desktop\Ultimate_stock.pow" %ULT%
powercfg /setacvalueindex %ULT% %USB% 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0
powercfg /setacvalueindex %ULT% %USB% d4e98f31-5ffe-4ce1-be31-1b38b384c009 0
powercfg /setacvalueindex %ULT% %PROC% 36687f9e-e3a5-4dbf-b1dc-15eb381c6863 0
powercfg /setacvalueindex %ULT% %PROC% 4b70f900-cdd9-4e66-aa26-ae8417f98173 0
powercfg /setacvalueindex %ULT% %PROC% 893dee8e-2bef-41e0-89c6-b55d0929964c 100
powercfg /setacvalueindex %ULT% %PROC% 3b04d4fd-1cc7-4f23-ab1c-d1337819c4bb 0
powercfg /setacvalueindex %ULT% %PROC% 9943e905-9a30-4ec1-9b99-44dd3b76f7a2 1
powercfg /setacvalueindex %ULT% %PROC% 7b224883-b3cc-4d79-819f-8374152cbe7c 100
powercfg /setacvalueindex %ULT% %PROC% 4b92d758-5a24-4851-a470-815d78aee119 100
powercfg /setacvalueindex %ULT% %PROC% 0cc5b647-c1df-4637-891a-dec35c318583 100
powercfg /setacvalueindex %ULT% %PCIE% ee12f906-d277-404b-b6da-e5fa1a576df5 0
powercfg /setactive %ULT%
To go back to Windows' deep idle for a comparison, set idle state max / promote / demote back to 0 / 60 / 40. Don't disable idle completely (idle disable = 1) for daily use: cores never rest and run much hotter.
Tier 2: solid, smaller wins
None of these moved my numbers as much as Tier 1 on its own, but together they keep the floor low and stop regressions. Roughly most to least useful:
|#|Tweak|How|Why|
|:-|:-|:-|:-|
|||||
|1|Turn off devices you don't use|Wi-Fi card: Device Manager → Disable (or BIOS, if Bluetooth isn't on the same card). iGPU: BIOS, once the dGPU drives every screen|Every enabled device can raise interrupts. An idle Wi-Fi card still scans. Updates can silently re-enable Wi-Fi, so re-check|
|2|MSI mode on anything still line-based|list-devices-irq.ps1 or MSI Utility v3. Set MSISupported = 1 under ...Interrupt ManagementMessageSignaledInterruptProperties, reboot|My GPU's HDMI audio device (all my TV sound) was on an old shared line-based IRQ while everything else used MSI. Check your sound still works after; revert if not|
|3|Device power saving off|Untick "Allow the computer to turn off this device to save power" on every device. My disable-device-powersave.ps1 does all of them and re-applies at boot|Windows re-ticks it whenever a device is re-plugged or its driver reinstalls. Network adapters also need PnPCapabilities = 24|
|4|Network adapter power features off|Adapter → Advanced: Energy-Efficient Ethernet, Green Ethernet, Power Saving Mode → Off. Leave Interrupt Moderation on|Link wake-ups add latency. Use Ethernet, not Wi-Fi|
|5|AMD Software: full install, extras off|Off: Instant Replay, Record Desktop, in-game overlay, metrics overlay/logging, AMD Link, Settings → System → Issue Detection, Preferences → web browser, ads, game adjustment tracking, animations|Background GPU work = more driver events. Keep the full install: Minimal and Driver Only drop Performance → Tuning, so your undervolt goes|
|6|Driver-side clock games off globally|Radeon Chill, Radeon Boost, Enhanced Sync → Off. Anti-Lag: off globally, on per game if it helps|They change clocks and resolution on the fly, which means more power-state switching|
|7|Separate game cores from everything else (X3D)|Process Lasso: games → V-Cache CCD (0–15), a "Game Mode" profile sends . → 16–31 (rule at the bottom), dwm.exe → 0–15. Turn every automatic feature off (ProBalance, IdleSaver, SmartTrim, Performance Mode, Bitsum plan) and make it start with your tuned plan|Background threads never land on your game's cores, and the device interrupts already live on the other CCD|
|8|No hypervisor running|msinfo32 → "Virtualization-based security" should say Not enabled. Hyper-V, Virtual Machine Platform and Windows Sandbox all start the hypervisor|A hypervisor adds overhead to every interrupt on every core. Trade-off: Memory Integrity is a real security feature and some anti-cheats need VBS. Your call|
|9|BIOS: DRAM Power Down Enable → Disabled|Advanced DRAM settings|Stops RAM powering down between accesses; steadier wake latency for a little idle power|
|10|Mouse/keyboard at 1000 Hz|Vendor software (web drivers work too, and run nothing in the background)|4k/8k polling multiplies USB interrupts. 1000 Hz is plenty|
|11|Keep the GPU in the top x16 slot at full width|GPU-Z → Bus Interface, read it during the render test|Mine showed x8 at idle and scared me. That's just the card narrowing its link to save power; under load it's x16|
Tier 3: experiments to A/B yourself
These target the GPU driver's own DPC time (amdkmdag.sys peaked at 350–530 µs on my card in every run before these keys, and 338 µs after). Pinning can't shorten that; only giving the driver less work or a different driver build can. Status: the registry keys below gave me a clear in-game win I didn't expect: much steadier 1% lows in light, frame-capped games (details under the table). With them and a few other changes on, my next LatencyMon run came in at 11.6 µs worst over 70 minutes (see the results log). Treat everything here as an experiment: one change, reboot, test, keep only what helps.
AMD GPU driver registry keys
They live in the GPU's driver key, HKLM\SYSTEM\CurrentControlSet\Control\Class{4d36e968-e325-11ce-bfc1-08002be10318}\000X (the subkey whose DriverDesc is your Radeon). MoreClockTool shows them all in one place. Export the key before you touch anything. Every driver install resets them.
|Key|Stock|Try|What it does|
|:-|:-|:-|:-|
|||||
|EnableAspmL0s, EnableAspmL1|1|0|Lets the driver put the GPU's PCIe link to sleep. Waking it costs time. Your power plan's PCIe setting doesn't stop the driver doing this itself. Most promising|
|EnableUlps|1|0|Ultra Low Power State at idle. A 9070 XT owner on Guru3D also blamed it for freezes|
|EnableUlps_NA|"1"|"0"|Text value, not the real switch; set it to match|
|PP_GPUPowerDownEnabled|1|0|Deep GPU power-down when there's nothing to show. Waking from it is a heavy driver job, e.g. when screens sleep and wake|
|KMD_EnableContextBasedPowerManagement|1|0|Changes GPU power level based on what's running. Fewer changes = fewer heavy driver events|
|KMD_EnableVcnRTPM|1|0|Powers the video engine up and down (e.g. every time a browser video starts). Test with a YouTube video playing|
|PP_SclkDeepSleepDisable, PP_DisableVoltageIsland|—|1|Core-clock deep sleep and per-block power gating off. Already 1 on my card|
Leave these alone: the PP_AutoCurveOptimizer…, PP_AutoOC…, PP_AutoUV… slots (Adrenalin's auto-tuning, they fight a manual undervolt), DisableSAMU/UVD/VCE… and EnableUvd/VceClockGating (older video engines; RDNA4 uses VCN), everything on the UMD page (per-game rendering, not kernel DPCs), and the DAL display keys. DalWFDEnable (Miracast) and DalEnableRemoteDisplayPath can go to 0 as cleanup, but don't expect a change.
What they did for me: in Mortal Kombat 1 which is capped at 60 fps , the GPU barely has to work. Before the keys, its power draw kept jumping around and the 1% lows dipped in step with it: the card was dropping into low-power states between frames and paying to wake back up. With the keys it holds a steady 100–120 W and the 1% lows stay consistent. If stutter shows up in light or frame-capped games (fighting games, esports titles, older games) and your GPU power graph looks jagged, try these . The cost is a bit more power in light games and at idle.
Other experiments
|Experiment|How|What to expect|
|:-|:-|:-|
||||
|Different driver build|DDU in safe mode, then the full installer of the other version (e.g. AMD's recommended WHQL vs the optional one). Re-enter your undervolt and re-run your scripts|GPU driver DPC behaviour really does change between releases. Probably the biggest lever left on amdkmdag|
|One screen while gaming|Win+P → PC screen only, run LatencyMon, compare|Every screen's refresh is an event the driver handles. Mismatched screens also pin VRAM clocks high (more idle power, fewer clock switches), so measure before you decide|
|Processor performance time check interval → 5000 ms|powercfg /setacvalueindex scheme_current 54533251-82be-4824-96c1-47b60b740d00 4d2b0152-7d5c-498b-88e2-34345392a2c5 5000 then powercfg /setactive scheme_current (undo: 15)|Fewer periodic power-manager DPCs. At 100% min state and EPP 0 the checks do little. Anecdotal, low risk|
|MPO off (Windows 11 25H2)|DWORD DisableOverlays = 1 in HKLMSYSTEMCurrentControlSetControlGraphicsDrivers. The old OverlayTestMode = 5 no longer works there. Verify with dxdiag → Display → MPO MaxPlanes: 1|One 9070 XT owner went from 5,000–8,000 µs to 800 µs, but his system was badly broken to start with. Another got flashing black screens in games and reverted. Can break HDR, FreeSync and overlays. Revert at the first flicker|
|HAGS on vs off|Settings → Display → Graphics → Advanced, reboot between runs|No DPC data either way. Keep whichever measures lower|
|NIC Interrupt Moderation off|Adapter → Advanced|Shorter network DPCs but more of them. Keep only if LatencyMon improves|
|Keyboard/mouse dongle on its own CPU USB controller|Move it to a rear port on a CPU controller, re-run list-devices-irq.ps1, pin that controller|Separates your input from Bluetooth and onboard USB audio traffic|
Skip these
They show up in every "ultimate tweak" list. On a modern Ryzen + Windows 11 system they either do nothing measurable or cost more than they give.
|Tweak|Why skip it|
|:-|:-|
|||
|Forcing 0.5 ms timer resolution (GlobalTimerResolutionRequests + a timer tool)|Doubles timer interrupts on every core. RTSS front edge sync and Reflex-style limiters don't depend on it. Mixed results at best|
|HPET and bcdedit timer flags (useplatformclock, useplatformtick, disabledynamictick)|No measured gain on modern Windows; some people report worse frametimes. Leave the defaults|
|Disabling CPU idle completely ("C0 forever")|Hurts single-thread boost with SMT on and runs much hotter. Capping at C1 gets you the latency benefit|
|BIOS DF C-states / Global C-state Control off|Experienced tuners disagree, and turning Global C-states off can cost boost. The power-plan C1 cap does the job|
|Disabling CPPC|The EPP setting is the configuration of CPPC and is needed for X3D core steering it also. (i use process lasso to pin absloutly every task on ccd1 using a wild card , and use exception rules for the games to be on ccd0 )|
|Spectre/Meltdown mitigations off, IOMMU off|Real security cost, some anti-cheats require them, no measured latency gain|
|SVM / virtualization off in BIOS|Costs nothing while no hypervisor runs, and you need it for VMs|
|Pinning NVMe interrupts|They use one queue per core on purpose; a mask makes I/O worse|
|Windows' interrupt steering power setting|its Global ; Per-device affinity allows us to pick the best cores specifically|
|MSI "X3D Gaming Mode" (BIOS)|Switches off the second CCD, which is exactly where interrupts should live|
|Adrenalin Minimal or Driver Only install|i use Tuning on the amd driver ,i tried the moreclock tool it's good but the amd driver Ui i like better|
Keep it fixed
My whole regression came from this: an AMD driver reinstall quietly wiped the GPU's interrupt pin, and my 10–40 µs turned into 100–400 µs with spikes every few seconds. Nothing told me; LatencyMon did.
|What resets your tweaks|What it undoes|
|:-|:-|
|||
|GPU driver install or update|GPU interrupt pin, MSI mode on the GPU's audio device, every GPU registry key|
|Every AutoGpuAffinity run|GPU interrupt pin (it restores Windows' default when it finishes)|
|Windows Update silently pushing an AMD driver|Same as a driver install, without you noticing|
|Re-plugging a device, driver reinstalls|"Allow the computer to turn off this device" comes back on|
|Some Windows updates|Can re-enable a disabled Wi-Fi adapter|
After every GPU driver update:
1. Run apply-irq-masks.ps1.
2. Run apply-gpu-powertweaks.ps1.
3. Reboot.
4. Run list-devices-irq.ps1 and check every device shows its CPU.
5. Check Adrenalin: undervolt applied, Instant Replay and the overlay still off.
6. LatencyMon for 15 minutes, compare with your last good run.
Stop Windows Update replacing your GPU driver: run Microsoft's wushowhide.diagcab → Hide updates → tick everything starting with "AMD" or "Advanced Micro Devices". Or: System → About → Advanced system settings → Hardware → Device Installation Settings → No.
When your numbers move and you don't know why, run latency-check.ps1. Its "what changed in the last 14 days" list is how I found the driver reinstall that caused my regression.
The scripts
All PowerShell, Windows PowerShell 5.1 compatible. Right-click → Run with PowerShell, or powershell -ExecutionPolicy Bypass -File .\name.ps1. They ask for admin themselves. Read a script before you run it
|Script|Changes anything?|What it does|
|:-|:-|:-|
||||
|latency-check.ps1|No|~2.5 min diagnostic, report to your Desktop. Checks VBS/hypervisor, timer overrides, devices that should be off, the GPU interrupt pin, WHEA hardware errors (14 days), a change timeline (Windows updates, driver installs, new services, programs), a 60 s per-core DPC sample with per-process "wake strips" that show who polls on a timer, and which apps force a high timer resolution|
|list-devices-irq.ps1|No|Lists every PCI device with its IRQ vectors, MSI state and current CPU mask, which controller each keyboard, mouse, Bluetooth and audio device hangs off, and your RSS setup. Copies the result to the clipboard|
|apply-irq-masks.ps1|Yes, backs up first|Pins each device to its own core and sets RSS. Finds devices by hardware ID, so it survives driver reinstalls. Writes undo.ps1 to a Desktop backup folder. -DryRun previews. Edit the plan table at the top for your own devices and cores first: the IDs and CPU numbers are for my rig|
|apply-gpu-powertweaks.ps1|Yes, backs up first|Sets the seven AMD GPU registry keys from Tier 3. Finds the Radeon's driver key itself and exports it as a .reg backup . AMD only|
|disable-device-powersave.ps1|Yes, backs up first|Unticks "Allow the computer to turn off this device" on every device (WMI MSPower_DeviceEnable), sets PnPCapabilities = 24 on network adapters, and installs a startup task that re-applies it 30 s after each boot. -NoInstall, -Uninstall, -Restore|
Tools I used alongside them: LatencyMon, Process Explorer (CPU Cycles Delta column), HWiNFO, GPU-Z, intPolicy / GoInterruptPolicy, MSI Utility v3, AutoGpuAffinity, MoreClockTool, Process Lasso, DDU, wushowhide.
My rig and the full results log
Hardware: Ryzen 9 9950X3D · ASUS TUF RX 9070 XT OC · MSI MAG B850M Mortar WiFi · 32 GB DDR5-6000 (EXPO) · Lexar NM1090 Pro Gen5 (C:) + WD SN850X Gen4 · 1000 W ATX 3.0 PSU · Windows 11 Pro 25H2 · i use Ethernet only.
LatencyMon, idle, newest first:
|Date|State|time|Worst interrupt-to-process|Worst DPC|
|:-|:-|:-|:-|:-|
||||||
|Oct 12|Oct 11 setup + the 3 CPU USB controllers pinned, device power saving off, the 7 GPU registry keys|1 h 10 min 48 s|11.6 µs (7.4 µs current)|487.6 µs, ntoskrnl.exe|
|Oct 11|Every busy device on its own CCD1 core|9 min 27 s|20.9 µs (7.3 µs current)|384.9 µs, amdkmdag.sys|
|Oct 10|GPU pin lost after a driver reinstall|spot checks|100–400 µs, ~200 µs spikes every few seconds|531 µs, amdkmdag.sys|
|Oct 2|GPU + iGPU pinned to CCD1|19 min 07 s|215 µs (once)|437.6 µs, amdkmdag.sys|
|Oct 2|Tuned power plan, nothing pinned|6 min 36 s|515 µs (~every minute)|353.6 µs, amdkmdag.sys|
|Oct 1|Right after the power-plan tweaks|2 min|733 µs|1,130 µs, amdkmdag.sys|
The Oct 12 run stacks several changes since Oct 11, so it shows their combined effect, not any one tweak's. Its worst DPC came from ntoskrnl.exe (the Windows kernel itself), not amdkmdag.sys, which means the GPU driver stayed under 487 µs for the whole 70 minutes. A second run's Drivers tab put amdkmdag.sys at 337.9 µs, its lowest peak in this log, with ntoskrnl.exe at 471 µs and every other driver under 63 µs.
Sources and credits
Tools: LatencyMon (Resplendence), PC-Tuning and AutoGpuAffinity (valleyofdoom), GoInterruptPolicy (spddl), MoreClockTool (Igor's Lab), Process Lasso (Bitsum), Microsoft's Interrupt Affinity Policy Tool.
- Debloating windows install: christitustech/winutil
- Tuning research: valleyofdoom PC-Tuning, PC-Tuning research notes, PC-Tuning post-install (mirror), AutoGpuAffinity
- Network: Microsoft: Introduction to RSS, Microsoft: Set-NetAdapterRss
- Board: MSI B850M Mortar WiFi specs, MSI B850M Mortar WiFi manual
- AMD driver: AMD install types (DH3-039), Guru3D Adrenalin 26.2.2 thread, MPO and DPC posts (p. 6), same thread, follow-ups (p. 7), Phoronix: AMD VRAM clocks with multiple monitors
- MPO and HAGS: Winhance issue #494 (MPO key on 25H2), BoosterX: how MPO works
- Power and BIOS: Level1Techs: perf check interval, Blur Busters: AM5 BIOS latency settings, Blur Busters: HPET and timer tweaks
- Audio and measuring: USB audio codecs and DPC latency, Resplendence: CPU stalls and SMIs
- Also cross-checked against the r/AMDHelp "Ultimate AMD Performance Fix Guide".
drive.google.com
Note: i won't share the other scripts because they're built around specific hardware IDs
Do the Amd gpu power tweak manually or using moreclock tool , Apply the irq affinity manually using int policy (after benchmarking your cores to check the best cores and rank them and reserve the best one for your GPU)
If you try any of this, post your before/after LatencyMon numbers and your CPU/GPU in the comments. I'll add what works to the guide.
Also if Amd ever reads this we want a prefer max performance (making the base clock of the gpu the minimum) like in Nvidia cards , we don't have to change registry keys or create artificial loads (like super resoloution to increase gpu load)
Also we want to set shader cache size to unlimited
**
46 points · 9 comments
Mentions
Winhance - optymalizator Windowsa dla każdego 00:00 Wstęp 00:48 instalacja 05:19 Programy i Aplikacje 14:29 szablony instalacyjne 15:55 Optymalizuj Prywatność i Bezpieczeństwo 22:56 Zasilanie 24:09 Gry i Wydajność 27:04 Aktualizacje 28:22 Powiadomienia 28:51 Dźwięk 29:22 Dostosuj System 34:40 Zaawansowane - modyfikuj ISO 37:02 inne opcje Winhance 38:21 podsumowanie 42:04 zakończenie 43:04 blooopers Winhance na platformie GitHub memstechtips/Winhance Veracrypt do szyfrowania dysków veracrypt.io youtu.be ––– *Nowości i wiadomości ze świata technologii* youtube.com ––– *Link do platformy Discord* discord.gg ––– *Zacznij wspierać ten kanał, a dostaniesz te bonusy:* youtube.com ––– [en-US] Winhance - A Windows optimizer for everyone 00:00 Introduction 00:48 Installation 05:19 Programs and Applications 14:29 Installation Templates 15:55 Optimize Privacy and Security 22:56 Power 24:09 Games and Performance 27:04 Updates 28:22 Notifications 28:51 Sound 29:22 Customize System 34:40 Advanced - Modify ISO 37:02 Other Winhance Options 38:21 Summary 42:04 Conclusion 43:04 Bloopers Winhance on GitHub memstechtips/Winhance Veracrypt for Disk Encryption veracrypt.io youtu.be ––– *News and News from the world of technology* youtube.com ––– *Discord link* discord.gg ––– *Support this channel and get these bonuses:* youtube.com –––
みーっけ(笑) Windows11のメモ帳をレガシー版に戻させてくれない原因は、'NoOpenWith'が原因。値を削除で解決。 [SUGGESTION] When enabling legacy notepad on windows 11 offer the option to allow it to associate/open .txt files · Issue #378 · memstechtips/Winhance Winhance#378
Winhance - Windows Enhancement Utility 🚀 Windows experience. From software management to system optimizations and customization, Winhance provides everything you need to enhance Windows 10 and 11 systems. #Windows memstechtips/Winhance
Winhance: Windows Enhancement Utility (14k stars) What it does All text below is quoted directly from the project README. >Application designed to optimize, customize and enhance your Windows experience. Current Features: - Winhance is a C# application designed to debloat, optimize and customize your Windows experience. From software management to system optimizations and customization, Winhance provides everything you need to enhance Windows 10 and 11 systems. - Windows Apps & Features Section: Searchable interface with explanatory legend; Organized sections for Windows Apps, Legacy Capabilities, and Optional Features; One-click removal and installation of selected items - External Apps Section: Install various useful applications via WinGet; Categories include Browsers, Multimedia utilities, Document viewers, and more - Optimize: Set UAC Notification Level, Privacy Settings, Gaming and Performance Optimizations, Windows Updates, Power Settings with Power Plan selection, Sound Settings, Notification Preferences - Customize: Windows Theme selector (Dark/Light Mode), Taskbar Customization, Start Menu Customization, Explorer Customizations - Create Custom Windows ISO's with WIMUtil (Windows Installation Media Utility) including adding drivers from current OS - Create autounattend.xml files based on your Winhance selections - Save settings currently applied in Winhance to a config file for easy importing on a new system or after a fresh Windows install. >Paste this command into PowerShell to download and run the installer: irm "https://get.winhance.net" | iex Repository memstechtips/Winhance Repository stats |Metric|Value| |:-|:-| |Stars|13,974| |Forks|661| |Last release|v26.06.12 (2026-06-12)| |Languages|C# 98.5%, PowerShell 1.3%, Inno Setup 0.2%| |Contributors|8| |AI contributor accounts (Claude / Codex / Cursor / Copilot)|claude: 97| |AI co-authored commits|Claude: 97| Main contributor |Field|Value| |:-|:-| |Name|Marco du Plessis| |GitHub|@memstechtips| |Commits to this repo|630 (top contributor)| |Bio|Content Creator & Software Developer (with AI)| |Website|memstechtips.com| |Followers|848| |Public repos|6| |On GitHub since|2024-06-13| ────────────────────────────── 📌 How many great GitHub repos have you discovered and completely forgotten about? Don't let another useful tool disappear into your Reddit feed. Get the community's best repos, organized by category, plus key takeaways from real developer discussions, delivered to your inbox twice a week. 📬 Never lose track of great repos again. Subscribe free.
DPC latency guide 733 µs to 11.6 µs (1 hour 10 minute test) on a 9950X3D + 9070 XT Every tweak I tried ranked by what actually worked TL;DR My worst idle interrupt-to-process latency in LatencyMon went from 733 µs to 11.6 µs over a 70-minute run (about 7 µs at rest) on a Ryzen 9 9950X3D + RX 9070 XT, Windows 11 25H2. The biggest wins came from giving every busy device its own CPU core instead of letting Windows use CPU 0 for everything, limiting CPU idle to C1 Proof Screenshots : drive.google.com - Rig: Ryzen 9 9950X3D, Radeon RX 9070 XT, MSI MAG B850M Mortar WiFi, 32 GB DDR5-6000, Windows 11 Pro 25H2. - Who it's for: anyone with audio pops, stutter, or LatencyMon numbers that won't come down. The ideas work on any PC; the registry keys and some BIOS names are AMD-specific. - How it's sorted: Tier 1 = measured big wins, Tier 2 = smaller wins worth doing, Tier 3 = experiments to A/B, then a list of things to skip. - Golden rule: change one thing, reboot, run LatencyMon 10–15 min, keep it only if the number moves. Back up before any registry or BIOS change. Measure first You can't fix what you can't see, and most "DPC tweak" posts never measure. Use LatencyMon (free, Resplendence). Close HWiNFO, Afterburner, Process Explorer and RGB apps while measuring: they poll hardware and add their own spikes. How to run it: 10–15 minutes idle, then once during a game. A 2-minute run lies; the bad spikes can come once a minute. |Number in LatencyMon|What it tells you|If it's high| |:-|:-|:-| |||| |Highest interrupt-to-process latency (Main tab)|How long a waiting thread waits after an interrupt. The best "how snappy is this PC" number|Clean drivers but high value = scheduling problem: a background app waking on a timer, VBS/hypervisor, CPU 0 overloaded, or deep C-states| |Highest DPC routine execution time + driver name|The single slowest driver routine|That driver is your target. GPU drivers (amdkmdag.sys, nvlddmkm.sys) usually top this list| |Drivers tab sorted by highest execution, and the CPUs tab|Which drivers run, how often, and on which core|Lots of DPCs on CPU 0 = interrupts haven't been divided (Tier 1 fix)| Reading the pattern: - Spikes every few seconds, on a rhythm = something polling. Open Process Explorer, add the CPU Cycles Delta column, sort, and watch what jumps in time with the spikes. In my case it was AMD Software's AMDRSSrcExt.exe, waking every ~2 s. - Test per CCD: set LatencyMon's own affinity to one CCD, then the other. If only one side spikes, the problem lives there. - Ignore LatencyMon's reported CPU speed on Ryzen (it showed me 430 MHz); it misreads clocks over WMI. - For the full picture, an xperf trace gives you a histogram of every DPC, not just the worst one. The PC-Tuning repo ships xperf-dpcisr.bat for exactly this. - My latency-check.ps1 does the first round of detective work in ~2 minutes (see The scripts). Tier 1: the biggest measured wins 1. Interrupt affinity: get every busy device off CPU 0 This was the single biggest lever, and I proved it three times. Windows sends the interrupts and DPCs of most devices to CPU 0 by default, so the GPU, USB, audio and network all queue up on one core, and on a dual-CCD X3D chip that core is on the gaming CCD. |What happened|Worst interrupt-to-process|DPCs on CPU 0| |:-|:-|:-| |||| |Nothing pinned|515 µs (about every minute)|67,015| |GPU pinned to a CCD1 core|215 µs (once in 19 min)|710| |A driver reinstall silently wiped the pin|100–400 µs, spikes every few seconds|CPU 0 busiest core again| |Every busy device on its own CCD1 core|20.9 µs over 9.5 min|quiet| |Plus the three CPU USB controllers on their own cores, device power saving off and the GPU registry keys|11.6 µs over 70 min|—| The rules: - One device per core, not "all of CCD1". It keeps the effect predictable and visible in LatencyMon's CPUs tab. - Use first threads of physical cores (even numbers on a 16-core SMT chip: 16, 18, 20…). Each core's second thread shares its execution units. - Dual-CCD X3D: put devices on the non-V-Cache CCD (16–31 on a 9950X3D) and keep games on the V-Cache CCD. - Single-CCD or Intel: pick any cores except 0 that your game leans on least. - Pinning moves a DPC; it doesn't make it shorter. A slow driver stays slow on any core. the layout i used (9950X3D): |Device|CPU| |:-|:-| ||| |RX 9070 XT|16| |CPU USB 2.0 controller|18| |Realtek 5GbE (via RSS)|20, 22| |Chipset USB (keyboard dongle, Bluetooth, onboard USB audio)|24| |GPU HDMI audio (TV sound)|26| |CPU USB 3.x controllers|28, 30| Pinning the USB controllers mattered a lot , Don't skip them. How to set it: Which core for the GPU? Benchmark it with AutoGpuAffinity. Run it uncapped (V-Sync off, No RTSS) with the benchmark pinned to your game cores, or every core reads the same capped number. On my chip, CCD1 beat CCD0 clearly, and CPUs 16 and 26 had the steadiest 1% lows. 1. Find which controller each device hangs off: Device Manager → View → Devices by connection, or my list-devices-irq.ps1. 2. In Microsoft's Interrupt Affinity Policy Tool (intPolicy) or GoInterruptPolicy, pick the device → IrqPolicySpecifiedProcessors → tick one core → reboot. 3. Or do it in the registry, under HKLM\SYSTEM\CurrentControlSet\Enum\PCI<device><instance>\Device Parameters\Interrupt Management\Affinity Policy: DWORD DevicePolicy = 4, and binary AssignmentSetOverride = the CPU mask. 4. Or run my apply-irq-masks.ps1, which finds devices by hardware ID, backs up first and writes an undo script. |CPU|AssignmentSetOverride bytes| |:-|:-| ||| |16|00 00 01 00 00 00 00 00| |18|00 00 04 00 00 00 00 00| |20|00 00 10 00 00 00 00 00| |24|00 00 00 01 00 00 00 00| |26|00 00 00 04 00 00 00 00| |28|00 00 00 10 00 00 00 00| |30|00 00 00 40 00 00 00 00| Network card: don't pin it, steer RSS instead. RSS never uses SMT sibling threads, so pick even numbers , adjust depending on your cpu core count Set-NetAdapterRss -Name "Ethernet" -BaseProcessorNumber 20 -MaxProcessorNumber 22 -MaxProcessors 2 Set-NetAdapterRss -Name "Ethernet" -NumberOfReceiveQueues 2 Get-NetAdapterRss Gotchas: - A GPU driver reinstall and every AutoGpuAffinity run reset the GPU pin to Windows' default. Re-apply after both. - Never pin NVMe drives. They give each core its own queue on purpose. i made scripts to reapply everything for me but they are specific to my build 2. Kill everything that polls hardware on a timer Polling apps cause the classic "spike every few seconds" pattern, because each poll stalls a core. After my background cleanup, the occasional 215 µs spike stopped showing up altogether. - RGB software: iCUE, Armoury Crate, Mystic Light, L-Connect. Set the lighting once, then don't keep the app running. - Sensor monitors: HWiNFO (polls every 2 s by default) sensor polling. Close them when you're not looking at them. - AMD Software extras: Instant Replay (keeps the video encoder running), the metrics overlay (cpumetricsserver.exe), AMD Link. AMDRSSrcExt.exe woke every ~2 s on my system. - Vendor : MSI Center , Ryzen Master's SDK task, ASUS Armory crate, Adobe and AMD updater tasks. - Anything that keeps respawning wmiprvse.exe, which means something is querying WMI for sensors. 3. Power plan: cap CPU idle at C1 (i did this over the ultimate performance powerplan) Waking a core from a deep sleep state takes time, and every interrupt pays it. The fix is a tuned Ultimate Performance plan with "light C-states": my cores may only enter C1. It costs about 20 W at idle (my package at idle went from ~30 W to ~50 W), and in HWiNFO w C1 around 94%. I didn't measure this one in isolation; it was in place before my first logged run. Every serious latency guide agrees on it, though, and it's the foundation for everything else. |Setting|Stock Ultimate|Set to| |:-|:-|:-| |||| |Processor idle state maximum|0|1| |Idle promote threshold|60|100| |Idle demote threshold|40|100| |Minimum processor state|0%|100%| |Energy performance preference (EPP)|10|0| |Latency sensitivity hint EPP|100|0| |USB selective suspend|Enabled|Disabled| |USB 3 link power management|Moderate|Off| |Allow throttle states|Automatic|Off| Already right on stock Ultimate (check it on your rig): core parking min cores 100%, PCIe link state power management Off, boost mode Aggressive. ( i use process lasso for scheduling on 9950x3d ) The commands (run cmd as admin, paste your Ultimate GUID from powercfg /list): powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 powercfg /list set ULT=PASTE-ULTIMATE-GUID-HERE set PROC=54533251-82be-4824-96c1-47b60b740d00 set USB=2a737441-1930-4402-8d77-b2bebba308a3 set PCIE=501a4d13-42af-4429-9fd1-a8218c268e20 powercfg /export "%USERPROFILE%\Desktop\Ultimate_stock.pow" %ULT% powercfg /setacvalueindex %ULT% %USB% 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0 powercfg /setacvalueindex %ULT% %USB% d4e98f31-5ffe-4ce1-be31-1b38b384c009 0 powercfg /setacvalueindex %ULT% %PROC% 36687f9e-e3a5-4dbf-b1dc-15eb381c6863 0 powercfg /setacvalueindex %ULT% %PROC% 4b70f900-cdd9-4e66-aa26-ae8417f98173 0 powercfg /setacvalueindex %ULT% %PROC% 893dee8e-2bef-41e0-89c6-b55d0929964c 100 powercfg /setacvalueindex %ULT% %PROC% 3b04d4fd-1cc7-4f23-ab1c-d1337819c4bb 0 powercfg /setacvalueindex %ULT% %PROC% 9943e905-9a30-4ec1-9b99-44dd3b76f7a2 1 powercfg /setacvalueindex %ULT% %PROC% 7b224883-b3cc-4d79-819f-8374152cbe7c 100 powercfg /setacvalueindex %ULT% %PROC% 4b92d758-5a24-4851-a470-815d78aee119 100 powercfg /setacvalueindex %ULT% %PROC% 0cc5b647-c1df-4637-891a-dec35c318583 100 powercfg /setacvalueindex %ULT% %PCIE% ee12f906-d277-404b-b6da-e5fa1a576df5 0 powercfg /setactive %ULT% To go back to Windows' deep idle for a comparison, set idle state max / promote / demote back to 0 / 60 / 40. Don't disable idle completely (idle disable = 1) for daily use: cores never rest and run much hotter. Tier 2: solid, smaller wins None of these moved my numbers as much as Tier 1 on its own, but together they keep the floor low and stop regressions. Roughly most to least useful: |#|Tweak|How|Why| |:-|:-|:-|:-| ||||| |1|Turn off devices you don't use|Wi-Fi card: Device Manager → Disable (or BIOS, if Bluetooth isn't on the same card). iGPU: BIOS, once the dGPU drives every screen|Every enabled device can raise interrupts. An idle Wi-Fi card still scans. Updates can silently re-enable Wi-Fi, so re-check| |2|MSI mode on anything still line-based|list-devices-irq.ps1 or MSI Utility v3. Set MSISupported = 1 under ...Interrupt ManagementMessageSignaledInterruptProperties, reboot|My GPU's HDMI audio device (all my TV sound) was on an old shared line-based IRQ while everything else used MSI. Check your sound still works after; revert if not| |3|Device power saving off|Untick "Allow the computer to turn off this device to save power" on every device. My disable-device-powersave.ps1 does all of them and re-applies at boot|Windows re-ticks it whenever a device is re-plugged or its driver reinstalls. Network adapters also need PnPCapabilities = 24| |4|Network adapter power features off|Adapter → Advanced: Energy-Efficient Ethernet, Green Ethernet, Power Saving Mode → Off. Leave Interrupt Moderation on|Link wake-ups add latency. Use Ethernet, not Wi-Fi| |5|AMD Software: full install, extras off|Off: Instant Replay, Record Desktop, in-game overlay, metrics overlay/logging, AMD Link, Settings → System → Issue Detection, Preferences → web browser, ads, game adjustment tracking, animations|Background GPU work = more driver events. Keep the full install: Minimal and Driver Only drop Performance → Tuning, so your undervolt goes| |6|Driver-side clock games off globally|Radeon Chill, Radeon Boost, Enhanced Sync → Off. Anti-Lag: off globally, on per game if it helps|They change clocks and resolution on the fly, which means more power-state switching| |7|Separate game cores from everything else (X3D)|Process Lasso: games → V-Cache CCD (0–15), a "Game Mode" profile sends . → 16–31 (rule at the bottom), dwm.exe → 0–15. Turn every automatic feature off (ProBalance, IdleSaver, SmartTrim, Performance Mode, Bitsum plan) and make it start with your tuned plan|Background threads never land on your game's cores, and the device interrupts already live on the other CCD| |8|No hypervisor running|msinfo32 → "Virtualization-based security" should say Not enabled. Hyper-V, Virtual Machine Platform and Windows Sandbox all start the hypervisor|A hypervisor adds overhead to every interrupt on every core. Trade-off: Memory Integrity is a real security feature and some anti-cheats need VBS. Your call| |9|BIOS: DRAM Power Down Enable → Disabled|Advanced DRAM settings|Stops RAM powering down between accesses; steadier wake latency for a little idle power| |10|Mouse/keyboard at 1000 Hz|Vendor software (web drivers work too, and run nothing in the background)|4k/8k polling multiplies USB interrupts. 1000 Hz is plenty| |11|Keep the GPU in the top x16 slot at full width|GPU-Z → Bus Interface, read it during the render test|Mine showed x8 at idle and scared me. That's just the card narrowing its link to save power; under load it's x16| Tier 3: experiments to A/B yourself These target the GPU driver's own DPC time (amdkmdag.sys peaked at 350–530 µs on my card in every run before these keys, and 338 µs after). Pinning can't shorten that; only giving the driver less work or a different driver build can. Status: the registry keys below gave me a clear in-game win I didn't expect: much steadier 1% lows in light, frame-capped games (details under the table). With them and a few other changes on, my next LatencyMon run came in at 11.6 µs worst over 70 minutes (see the results log). Treat everything here as an experiment: one change, reboot, test, keep only what helps. AMD GPU driver registry keys They live in the GPU's driver key, HKLM\SYSTEM\CurrentControlSet\Control\Class{4d36e968-e325-11ce-bfc1-08002be10318}\000X (the subkey whose DriverDesc is your Radeon). MoreClockTool shows them all in one place. Export the key before you touch anything. Every driver install resets them. |Key|Stock|Try|What it does| |:-|:-|:-|:-| ||||| |EnableAspmL0s, EnableAspmL1|1|0|Lets the driver put the GPU's PCIe link to sleep. Waking it costs time. Your power plan's PCIe setting doesn't stop the driver doing this itself. Most promising| |EnableUlps|1|0|Ultra Low Power State at idle. A 9070 XT owner on Guru3D also blamed it for freezes| |EnableUlps_NA|"1"|"0"|Text value, not the real switch; set it to match| |PP_GPUPowerDownEnabled|1|0|Deep GPU power-down when there's nothing to show. Waking from it is a heavy driver job, e.g. when screens sleep and wake| |KMD_EnableContextBasedPowerManagement|1|0|Changes GPU power level based on what's running. Fewer changes = fewer heavy driver events| |KMD_EnableVcnRTPM|1|0|Powers the video engine up and down (e.g. every time a browser video starts). Test with a YouTube video playing| |PP_SclkDeepSleepDisable, PP_DisableVoltageIsland|—|1|Core-clock deep sleep and per-block power gating off. Already 1 on my card| Leave these alone: the PP_AutoCurveOptimizer…, PP_AutoOC…, PP_AutoUV… slots (Adrenalin's auto-tuning, they fight a manual undervolt), DisableSAMU/UVD/VCE… and EnableUvd/VceClockGating (older video engines; RDNA4 uses VCN), everything on the UMD page (per-game rendering, not kernel DPCs), and the DAL display keys. DalWFDEnable (Miracast) and DalEnableRemoteDisplayPath can go to 0 as cleanup, but don't expect a change. What they did for me: in Mortal Kombat 1 which is capped at 60 fps , the GPU barely has to work. Before the keys, its power draw kept jumping around and the 1% lows dipped in step with it: the card was dropping into low-power states between frames and paying to wake back up. With the keys it holds a steady 100–120 W and the 1% lows stay consistent. If stutter shows up in light or frame-capped games (fighting games, esports titles, older games) and your GPU power graph looks jagged, try these . The cost is a bit more power in light games and at idle. Other experiments |Experiment|How|What to expect| |:-|:-|:-| |||| |Different driver build|DDU in safe mode, then the full installer of the other version (e.g. AMD's recommended WHQL vs the optional one). Re-enter your undervolt and re-run your scripts|GPU driver DPC behaviour really does change between releases. Probably the biggest lever left on amdkmdag| |One screen while gaming|Win+P → PC screen only, run LatencyMon, compare|Every screen's refresh is an event the driver handles. Mismatched screens also pin VRAM clocks high (more idle power, fewer clock switches), so measure before you decide| |Processor performance time check interval → 5000 ms|powercfg /setacvalueindex scheme_current 54533251-82be-4824-96c1-47b60b740d00 4d2b0152-7d5c-498b-88e2-34345392a2c5 5000 then powercfg /setactive scheme_current (undo: 15)|Fewer periodic power-manager DPCs. At 100% min state and EPP 0 the checks do little. Anecdotal, low risk| |MPO off (Windows 11 25H2)|DWORD DisableOverlays = 1 in HKLMSYSTEMCurrentControlSetControlGraphicsDrivers. The old OverlayTestMode = 5 no longer works there. Verify with dxdiag → Display → MPO MaxPlanes: 1|One 9070 XT owner went from 5,000–8,000 µs to 800 µs, but his system was badly broken to start with. Another got flashing black screens in games and reverted. Can break HDR, FreeSync and overlays. Revert at the first flicker| |HAGS on vs off|Settings → Display → Graphics → Advanced, reboot between runs|No DPC data either way. Keep whichever measures lower| |NIC Interrupt Moderation off|Adapter → Advanced|Shorter network DPCs but more of them. Keep only if LatencyMon improves| |Keyboard/mouse dongle on its own CPU USB controller|Move it to a rear port on a CPU controller, re-run list-devices-irq.ps1, pin that controller|Separates your input from Bluetooth and onboard USB audio traffic| Skip these They show up in every "ultimate tweak" list. On a modern Ryzen + Windows 11 system they either do nothing measurable or cost more than they give. |Tweak|Why skip it| |:-|:-| ||| |Forcing 0.5 ms timer resolution (GlobalTimerResolutionRequests + a timer tool)|Doubles timer interrupts on every core. RTSS front edge sync and Reflex-style limiters don't depend on it. Mixed results at best| |HPET and bcdedit timer flags (useplatformclock, useplatformtick, disabledynamictick)|No measured gain on modern Windows; some people report worse frametimes. Leave the defaults| |Disabling CPU idle completely ("C0 forever")|Hurts single-thread boost with SMT on and runs much hotter. Capping at C1 gets you the latency benefit| |BIOS DF C-states / Global C-state Control off|Experienced tuners disagree, and turning Global C-states off can cost boost. The power-plan C1 cap does the job| |Disabling CPPC|The EPP setting is the configuration of CPPC and is needed for X3D core steering it also. (i use process lasso to pin absloutly every task on ccd1 using a wild card , and use exception rules for the games to be on ccd0 )| |Spectre/Meltdown mitigations off, IOMMU off|Real security cost, some anti-cheats require them, no measured latency gain| |SVM / virtualization off in BIOS|Costs nothing while no hypervisor runs, and you need it for VMs| |Pinning NVMe interrupts|They use one queue per core on purpose; a mask makes I/O worse| |Windows' interrupt steering power setting|its Global ; Per-device affinity allows us to pick the best cores specifically| |MSI "X3D Gaming Mode" (BIOS)|Switches off the second CCD, which is exactly where interrupts should live| |Adrenalin Minimal or Driver Only install|i use Tuning on the amd driver ,i tried the moreclock tool it's good but the amd driver Ui i like better| Keep it fixed My whole regression came from this: an AMD driver reinstall quietly wiped the GPU's interrupt pin, and my 10–40 µs turned into 100–400 µs with spikes every few seconds. Nothing told me; LatencyMon did. |What resets your tweaks|What it undoes| |:-|:-| ||| |GPU driver install or update|GPU interrupt pin, MSI mode on the GPU's audio device, every GPU registry key| |Every AutoGpuAffinity run|GPU interrupt pin (it restores Windows' default when it finishes)| |Windows Update silently pushing an AMD driver|Same as a driver install, without you noticing| |Re-plugging a device, driver reinstalls|"Allow the computer to turn off this device" comes back on| |Some Windows updates|Can re-enable a disabled Wi-Fi adapter| After every GPU driver update: 1. Run apply-irq-masks.ps1. 2. Run apply-gpu-powertweaks.ps1. 3. Reboot. 4. Run list-devices-irq.ps1 and check every device shows its CPU. 5. Check Adrenalin: undervolt applied, Instant Replay and the overlay still off. 6. LatencyMon for 15 minutes, compare with your last good run. Stop Windows Update replacing your GPU driver: run Microsoft's wushowhide.diagcab → Hide updates → tick everything starting with "AMD" or "Advanced Micro Devices". Or: System → About → Advanced system settings → Hardware → Device Installation Settings → No. When your numbers move and you don't know why, run latency-check.ps1. Its "what changed in the last 14 days" list is how I found the driver reinstall that caused my regression. The scripts All PowerShell, Windows PowerShell 5.1 compatible. Right-click → Run with PowerShell, or powershell -ExecutionPolicy Bypass -File .\name.ps1. They ask for admin themselves. Read a script before you run it |Script|Changes anything?|What it does| |:-|:-|:-| |||| |latency-check.ps1|No|~2.5 min diagnostic, report to your Desktop. Checks VBS/hypervisor, timer overrides, devices that should be off, the GPU interrupt pin, WHEA hardware errors (14 days), a change timeline (Windows updates, driver installs, new services, programs), a 60 s per-core DPC sample with per-process "wake strips" that show who polls on a timer, and which apps force a high timer resolution| |list-devices-irq.ps1|No|Lists every PCI device with its IRQ vectors, MSI state and current CPU mask, which controller each keyboard, mouse, Bluetooth and audio device hangs off, and your RSS setup. Copies the result to the clipboard| |apply-irq-masks.ps1|Yes, backs up first|Pins each device to its own core and sets RSS. Finds devices by hardware ID, so it survives driver reinstalls. Writes undo.ps1 to a Desktop backup folder. -DryRun previews. Edit the plan table at the top for your own devices and cores first: the IDs and CPU numbers are for my rig| |apply-gpu-powertweaks.ps1|Yes, backs up first|Sets the seven AMD GPU registry keys from Tier 3. Finds the Radeon's driver key itself and exports it as a .reg backup . AMD only| |disable-device-powersave.ps1|Yes, backs up first|Unticks "Allow the computer to turn off this device" on every device (WMI MSPower_DeviceEnable), sets PnPCapabilities = 24 on network adapters, and installs a startup task that re-applies it 30 s after each boot. -NoInstall, -Uninstall, -Restore| Tools I used alongside them: LatencyMon, Process Explorer (CPU Cycles Delta column), HWiNFO, GPU-Z, intPolicy / GoInterruptPolicy, MSI Utility v3, AutoGpuAffinity, MoreClockTool, Process Lasso, DDU, wushowhide. My rig and the full results log Hardware: Ryzen 9 9950X3D · ASUS TUF RX 9070 XT OC · MSI MAG B850M Mortar WiFi · 32 GB DDR5-6000 (EXPO) · Lexar NM1090 Pro Gen5 (C:) + WD SN850X Gen4 · 1000 W ATX 3.0 PSU · Windows 11 Pro 25H2 · i use Ethernet only. LatencyMon, idle, newest first: |Date|State|time|Worst interrupt-to-process|Worst DPC| |:-|:-|:-|:-|:-| |||||| |Oct 12|Oct 11 setup + the 3 CPU USB controllers pinned, device power saving off, the 7 GPU registry keys|1 h 10 min 48 s|11.6 µs (7.4 µs current)|487.6 µs, ntoskrnl.exe| |Oct 11|Every busy device on its own CCD1 core|9 min 27 s|20.9 µs (7.3 µs current)|384.9 µs, amdkmdag.sys| |Oct 10|GPU pin lost after a driver reinstall|spot checks|100–400 µs, ~200 µs spikes every few seconds|531 µs, amdkmdag.sys| |Oct 2|GPU + iGPU pinned to CCD1|19 min 07 s|215 µs (once)|437.6 µs, amdkmdag.sys| |Oct 2|Tuned power plan, nothing pinned|6 min 36 s|515 µs (~every minute)|353.6 µs, amdkmdag.sys| |Oct 1|Right after the power-plan tweaks|2 min|733 µs|1,130 µs, amdkmdag.sys| The Oct 12 run stacks several changes since Oct 11, so it shows their combined effect, not any one tweak's. Its worst DPC came from ntoskrnl.exe (the Windows kernel itself), not amdkmdag.sys, which means the GPU driver stayed under 487 µs for the whole 70 minutes. A second run's Drivers tab put amdkmdag.sys at 337.9 µs, its lowest peak in this log, with ntoskrnl.exe at 471 µs and every other driver under 63 µs. Sources and credits Tools: LatencyMon (Resplendence), PC-Tuning and AutoGpuAffinity (valleyofdoom), GoInterruptPolicy (spddl), MoreClockTool (Igor's Lab), Process Lasso (Bitsum), Microsoft's Interrupt Affinity Policy Tool. - Debloating windows install: christitustech/winutil - Tuning research: valleyofdoom PC-Tuning, PC-Tuning research notes, PC-Tuning post-install (mirror), AutoGpuAffinity - Network: Microsoft: Introduction to RSS, Microsoft: Set-NetAdapterRss - Board: MSI B850M Mortar WiFi specs, MSI B850M Mortar WiFi manual - AMD driver: AMD install types (DH3-039), Guru3D Adrenalin 26.2.2 thread, MPO and DPC posts (p. 6), same thread, follow-ups (p. 7), Phoronix: AMD VRAM clocks with multiple monitors - MPO and HAGS: Winhance issue #494 (MPO key on 25H2), BoosterX: how MPO works - Power and BIOS: Level1Techs: perf check interval, Blur Busters: AM5 BIOS latency settings, Blur Busters: HPET and timer tweaks - Audio and measuring: USB audio codecs and DPC latency, Resplendence: CPU stalls and SMIs - Also cross-checked against the r/AMDHelp "Ultimate AMD Performance Fix Guide". drive.google.com Note: i won't share the other scripts because they're built around specific hardware IDs Do the Amd gpu power tweak manually or using moreclock tool , Apply the irq affinity manually using int policy (after benchmarking your cores to check the best cores and rank them and reserve the best one for your GPU) If you try any of this, post your before/after LatencyMon numbers and your CPU/GPU in the comments. I'll add what works to the guide. Also if Amd ever reads this we want a prefer max performance (making the base clock of the gpu the minimum) like in Nvidia cards , we don't have to change registry keys or create artificial loads (like super resoloution to increase gpu load) Also we want to set shader cache size to unlimited **
Winhance is how I did this btw for anyone wondering. (Christitus app is also fire) Link: winhance.net Github: memstechtips/Winhance Chris Titus App: christitustech/winutil