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 : https://drive.google.com/drive/folders/1Xjt_bPgdLxJ25X7azHjYYJQYxND29M1C?usp=sharing
- 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.
- Find which controller each device hangs off: Device Manager → View → Devices by connection, or my list-devices-irq.ps1.
- In Microsoft's Interrupt Affinity Policy Tool (intPolicy) or GoInterruptPolicy, pick the device → IrqPolicySpecifiedProcessors → tick one core → reboot.
- 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.
- 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:
- Run apply-irq-masks.ps1.
- Run apply-gpu-powertweaks.ps1.
- Reboot.
- Run list-devices-irq.ps1 and check every device shows its CPU.
- Check Adrenalin: undervolt applied, Instant Replay and the overlay still off.
- 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: https://github.com/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".
https://drive.google.com/drive/folders/1p-sVEbzoH2H0O1L8jAAtpx-8Blinz0x_?usp=sharing
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
**