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:

  1. 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
  2. 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
  3. 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-clocks tool 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 states
  • amdgpu-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

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