amd-gpu-mclk-behavior
Context
Investigation into why AMD GPU memory clocks (MCLK) remain constant and don’t dynamically scale with workload like core clocks (SCLK) do.
Key Findings
Normal Behavior vs Issue
Expected Behavior:
- Core clock (SCLK) dynamically scales based on workload
- Memory clock (MCLK) should also scale down during idle/light workloads to save power
Observed Issue:
- SCLK scales normally (e.g., 38MHz idle → 2000-3000MHz under load)
- MCLK stays constant (e.g., locked at 1218MHz or higher) regardless of workload
Technical Explanation
Why MCLK Stays Constant
AMD GPUs must maintain constant memory clocks in certain scenarios due to display timing constraints:
-
Blanking Period Requirement
- GPUs need specific blanking periods (when the display isn’t actively drawing pixels) to safely switch memory clock frequencies
- Changing MCLK during active pixel output causes visible flickering
- The hardware must “hide” the clock switch during display blanking
-
When Blanking Periods Are Insufficient
- High refresh rates (144Hz, 240Hz+) create shorter blanking windows
- High resolutions require tighter pixel clock constraints
- Non-standard monitor timings may have insufficient vertical/horizontal blanking
- Multi-monitor setups with mismatched timings that can’t align
-
Driver Solution
- When safe clock switching isn’t possible, the driver forces MCLK to stay at maximum frequency
- This prevents flickering but increases idle power consumption and temperatures
Common Triggers
Single Monitor Issues:
- High refresh rates (>120Hz) at standard resolutions
- Monitors not using Coordinated Video Timings (CVT) with adequate V-Blank values
- HDMI 1.4 bandwidth constraints at high refresh rates (pixel clock exceeds limits needed for adequate blanking time)
Multi-Monitor Issues:
- Two or more displays connected
- Mismatched refresh rates between monitors
- Mixed connection types (DisplayPort + HDMI)
- Different resolutions across monitors
- Power consumption can double (e.g., 13W → 44W idle)
- Temperature increases of ~25°C at idle
Impact
- Power Consumption: Significantly higher idle power draw (can double)
- Temperature: Increased idle temperatures (~25°C higher)
- Performance: No negative performance impact (always at high memory clock)
- Noise: Potentially higher fan speeds due to elevated temperatures
Solutions & Workarounds
1. Custom Display Timings (Primary Solution)
- Use Custom Resolution Utility (CRU) or similar tools
- Create custom resolutions with CVT Reduced Blanking (CVT-RB v2) timings
- Increase V-blank values (sometimes just 6 additional lines is sufficient)
- This extends blanking periods to allow safe MCLK switching
2. Refresh Rate Adjustment
- Reduce desktop refresh rate to 60Hz or 120Hz
- Slightly lower refresh rate (144Hz → 120Hz, 75Hz → 74Hz)
- Use game profiles to increase refresh only when needed
3. Multi-Monitor Optimization
- Match settings across all displays (resolution, refresh rate, connection type)
- Use identical monitors with identical connections
- Consider disconnecting secondary monitors when not needed
4. Manual Clock Control (Linux)
- Use
amdgpu-clockstool to manually control power states - Create custom power state profiles
- Force specific memory clock states
5. Monitor Selection
- Choose monitors with proper CVT timings
- Prefer monitors with higher V-blank values in their EDID
Linux-Specific Notes
Tools for Managing MCLK
rocm-smi- Monitor current clock speeds and power statesamdgpu-clocks- Manually control GPU power states- Custom Resolution Utility (CRU) - Windows tool, but can export timings for Linux
Kernel Behavior
- Linux kernel 6.4.x had issues with MCLK locking too low (96 MHz) with FreeSync enabled
- Modern kernels should handle dynamic MCLK better, but display timing constraints still apply
Additional Context
This has been a longstanding issue across multiple AMD GPU generations:
- RDNA (RX 5000 series)
- RDNA 2 (RX 6000 series)
- RDNA 3 (RX 7000 series)
The behavior is by design to prevent visual artifacts, but can be optimized through proper display timing configuration.
References
- GitHub: Fix AMD GPU high idle power MCLK stuck
- GitHub: amdgpu-clocks tool
- AMD Community forums: Multiple reports of MCLK stuck with multi-monitor setups
Your System
- Discrete GPU: AMD RX 7000 series (Device ID: 0x747e)
- Integrated GPU: Device ID: 0x13c0
- Observed Behavior: SCLK scales dynamically (38MHz - 2000+MHz), MCLK stays constant at ~1218MHz
- Status: This is normal behavior for your display configuration; MCLK staying constant is expected when blanking periods are insufficient for safe clock switching