Question Why do AMD/Ryzen CPUs have so few frequencies and the lowest is so high?

yeshua

Member
Aug 7, 2019
166
134
86
While Intel CPUs have a ton of available frequency steps, Ryzen CPUs barely have any, so forcing an AMD CPU to work at a desired frequency is kinda problematic to say the least.

E.g. my Ryzen 3700X has just three steps: 3600000, 2800000 and 2200000 Hertz.

Does anyone know why AMD designed their CPUs this way? Is this an architectural limitation? Any insight is welcome.
 

samboy

Senior member
Aug 17, 2002
217
77
101
My understanding is that frequency is reduced to save power when there is not the load to warrant a higher/faster frequency.

The power/frequency curve is non-linear....... near the top end of the curve; raising the frequency results in a lot more power usage. Conversely, near the bottom end of the curve reducing the frequency doesn't reduce the power usage significantly.

My expectation is that AMD has simply tuned the frequencies according to the 7nm process. Remember that the goal is power savings not frequency reduction directly.
 

Topweasel

Diamond Member
Oct 19, 2000
5,436
1,654
136
I was thinking this was turbo question but re-reading it I am not sure I understand. I know for a fact I have seen ~1500MHz on a very lightly used core. But what are you trying to accomplish? Why does it matter what the non-idle, lightly used speed is?
 

tamz_msc

Diamond Member
Jan 5, 2017
3,770
3,590
136
The CPUs have low power states which aren't reported by most monitoring tools. Use Ryzen Master to observe those idle frequencies.
 

moinmoin

Diamond Member
Jun 1, 2017
4,944
7,656
136
While Intel CPUs have a ton of available frequency steps, Ryzen CPUs barely have any, so forcing an AMD CPU to work at a desired frequency is kinda problematic to say the least.

E.g. my Ryzen 3700X has just three steps: 3600000, 2800000 and 2200000 Hertz.

Does anyone know why AMD designed their CPUs this way? Is this an architectural limitation? Any insight is welcome.
Ryzen has a frequency granularity of 25MHz and makes use of that on-demand. The actual frequency a core uses at any given time is actually highly volatile, one seldom gets a single stable frequency. Your observation appears to not reflect reality but to be a simplified frequency reading, maybe you simply use the wrong software for that purpose?
 
  • Like
Reactions: VirtualLarry

yeshua

Member
Aug 7, 2019
166
134
86
I want my Ryzen CPU to work at a desired frequency (not confined to just 2.2/2.8/3.6 GHz) and there are just three steps to choose from which makes me wonder why I've received four totally irrelevant answers.

On any SkyLake and later Intel CPUs I can choose from a dozen of steps, from a base frequency down to 500MHz. AMD's lowest value is 2.2GHz.
 

scannall

Golden Member
Jan 1, 2012
1,946
1,638
136
I want my Ryzen CPU to work at a desired frequency (not confined to just 2.2/2.8/3.6 GHz) and there are just three steps to choose from.

Which makes me wonder why I've received four totally irrelevant answers.

On any SkyLake and later Intel CPUs I can choose from a dozen of steps, from the base frequency down to 500MHz. AMD's lowest value is 2.2GHz.
Probably because your question is somewhat unclear. What goal are you trying to achieve for example would help people figure out how to help you.
 

yeshua

Member
Aug 7, 2019
166
134
86
Probably because your question is somewhat unclear. What goal are you trying to achieve for example would help people figure out how to help you.

I want to test my applications when CPU is running at certain frequencies and there are just few of them available for Ryzen CPUs. Also some old applications run best when a CPU frequency is forced to some low value. There's no way to force a Ryzen 3000 CPU to run at any frequency below 2.2GHz.

What's there to understand? My question was plain simple and did not contain anything related to power saving modes or/and turbo boost. Also, if you're ill-equipped/don't have enough knowledge on the matter, why rush with your answer? It's a technical forum for knowledgeable people yet I get the answers which contain zero information. Weird.
 

scannall

Golden Member
Jan 1, 2012
1,946
1,638
136
I want to test my applications when CPU is running at certain frequencies and there are just few of them available for Ryzen CPUs. Also some old applications run best when a CPU frequency is forced to some low value. There's no way to force a Ryzen 3000 CPU to run at any frequency below 2.2GHz.

What's there to understand? My question was plain simple and did not contain anything related to power saving modes or/and turbo boost. Also, if you're ill-equipped/don't have enough knowledge on the matter, why rush with your answer? It's a technical forum for knowledgeable people yet I get the answers which contain zero information. Weird.
In Ryzen Master you can set the core speed to whatever you want, down to 600 Mhz or so. Easy enough to do for anyone tech minded. Just confirmed that on my own Ryzen rig.
 

yeshua

Member
Aug 7, 2019
166
134
86
In Ryzen Master you can set the core speed to whatever you want, down to 600 Mhz or so. Easy enough to do for anyone tech minded. Just confirmed that on my own Ryzen rig.

Can you confirm that the desired frequency is adhered to using e.g. HWInfo64? It would be great to see a screenshot.
 

teejee

Senior member
Jul 4, 2013
361
199
116
I want to test my applications when CPU is running at certain frequencies and there are just few of them available for Ryzen CPUs. Also some old applications run best when a CPU frequency is forced to some low value. There's no way to force a Ryzen 3000 CPU to run at any frequency below 2.2GHz.

What's there to understand? My question was plain simple and did not contain anything related to power saving modes or/and turbo boost. Also, if you're ill-equipped/don't have enough knowledge on the matter, why rush with your answer? It's a technical forum for knowledgeable people yet I get the answers which contain zero information. Weird.

Both your question and OP title are wrong. That is why people couldn’t give you a simple answer. Instead several persons took the time to give you valuable information and asked for more information to understand your needs. Your response to this was to call them ill-equipped and not having enough knowledge.
 

moinmoin

Diamond Member
Jun 1, 2017
4,944
7,656
136
At stock AMD Zen chips run fully automated depending on parameters like temperature, package power and current. The frequency used is a dynamic result of that, not something preset.

Your use case is one that these chips are simply not built for, so naturally you'll have a harder time achieving this. Let's us know if and how you achieve what you want, it's certainly an interesting exercise.
 

yeshua

Member
Aug 7, 2019
166
134
86
Both your question and OP title are wrong. That is why people couldn’t give you a simple answer. Instead several persons took the time to give you valuable information and asked for more information to understand your needs. Your response to this was to call them ill-equipped and not having enough knowledge.

Every x86 CPU which has been released in the past 20 years has built-in frequency steps which you can force to operate at. Intel CPUs have a lot more of these steps than AMD CPUs. I specifically asked why is that the case. I don't know how and where I was wrong.

E.g. here are the frequencies steps for the ages old Intel Core i7 3770 CPU:
3400000 3300000 3100000 3000000 2900000 2800000 2600000 2500000 2400000 2200000 2100000 2000000 1900000 1700000 1600000

Intel Core i5 6200U can ran at:
2400000 2300000 2100000 2000000 1800000 1700000 1500000 1400000 1300000 1100000 1000000 800000 700000 500000 400000

which again is a whole lot to choose from.

You can force the CPU to reliably work at any of them and the CPU will respect these frequencies no matter what.

With Ryzen 3000 CPUs you have just three guaranteed steps. I wonder why is that the case. I still haven't got a single answer while people veer into some very tangential matters.
 
Last edited:

Elfear

Diamond Member
May 30, 2004
7,097
644
126
Where are you only seeing the three frequency steps? In the bios? In Ryzen Master? You're not being very clear hence the variety of answers.

Also, normal forum etiquette is to treat others with respect, ESPECIALLY when you are asking a question looking for help. If you're not getting the answers you're looking for, probably safe to assume you didn't ask the right question.
 

tamz_msc

Diamond Member
Jan 5, 2017
3,770
3,590
136
You won't get what you're looking for under normal operating conditions. Ryzen features race-to-sleep wherein the cores boost to the highest possible frequency and then go into sleep mode as fast as possible once the task has been completed. Your only option is to manually downclock through adjusting the CPU ratio in the BIOS.
 

scannall

Golden Member
Jan 1, 2012
1,946
1,638
136
You won't get what you're looking for under normal operating conditions. Ryzen features race-to-sleep wherein the cores boost to the highest possible frequency and then go into sleep mode as fast as possible once the task has been completed. Your only option is to manually downclock through adjusting the CPU ratio in the BIOS.
You can in Ryzen Master as well, using the manual tab options.
 

yeshua

Member
Aug 7, 2019
166
134
86
Where are you only seeing the three frequency steps? In the bios? In Ryzen Master? You're not being very clear hence the variety of answers.

Also, normal forum etiquette is to treat others with respect, ESPECIALLY when you are asking a question looking for help. If you're not getting the answers you're looking for, probably safe to assume you didn't ask the right question.

Fire up any Linux live CD.

Issue this command:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

Get a built-in table of available frequencies the CPU can run at. The first frequency for some Intel CPUs is not a real number - it's an indication of turbo boost, e.g. that'll be 3701000 for Intel Core i7 2600K. I will patiently wait for someone with actual knowledge to chime in. There's not been a single even remotely relevant answer so far.

I have the actual knowledge of the matter and I'm being ridiculed. Whoa.


If you keep this up, your thread will be locked
Drop the smug, bad attitude.

AT Mod Usandthem
 

scannall

Golden Member
Jan 1, 2012
1,946
1,638
136
Fire up any Linux live CD.

Issue this command:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

Get a built-in table of available frequencies the CPU can run at. The first frequency for some Intel CPUs is not a real number - it's an indication of turbo boost, e.g. that'll be 3701000 for Intel Core i7 2600K. I will patiently wait for someone with actual knowledge to chime in. There's not been a single even remotely relevant answer so far.

I have the actual knowledge of the matter and I'm being ridiculed. Whoa.
You clearly aren't able to understand the answers given to you. And being a jerk about it, so I'm out. Don't bother replying as you will be residing on my ignore list.
 
  • Like
Reactions: Elfear

yeshua

Member
Aug 7, 2019
166
134
86
From the Linux kernel documentation:

Next, the scaling driver’s ->init() callback is invoked with the policy pointer of the new CPU passed to it as the argument. That callback is expected to initialize the performance scaling hardware interface for the given CPU (or, more precisely, for the set of CPUs sharing the hardware interface it belongs to, represented by its policy object) and, if the policy object it has been called for is new, to set parameters of the policy, like the minimum and maximum frequencies supported by the hardware, the table of available frequencies (if the set of supported P-states is not a continuous range), and the mask of CPUs that belong to the same policy (including both online and offline CPUs). That mask is then used by the core to populate the policy pointers for all of the CPUs in it.​

The relevant code to get the frequency table:

C:
static unsigned extract_msr(struct cpufreq_policy *policy, u32 msr)
{
    struct acpi_cpufreq_data *data = policy->driver_data;
    struct cpufreq_frequency_table *pos;
    struct acpi_processor_performance *perf;
    if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
        msr &= AMD_MSR_RANGE;
    else if (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
        msr &= HYGON_MSR_RANGE;
    else
        msr &= INTEL_MSR_RANGE;
  
    perf = to_perf_data(data);
  
    cpufreq_for_each_entry(pos, policy->freq_table)
        if (msr == perf->states[pos->driver_data].status)
            return pos->frequency;
    return policy->freq_table[0].frequency;
}
static unsigned extract_freq(struct cpufreq_policy *policy, u32 val)
{
    struct acpi_cpufreq_data *data = policy->driver_data;
  
    switch (data->cpu_feature) {
    case SYSTEM_INTEL_MSR_CAPABLE:
    case SYSTEM_AMD_MSR_CAPABLE:
        return extract_msr(policy, val);
    case SYSTEM_IO_CAPABLE:
        return extract_io(policy, val);
    default:
        return 0;
    }
}
static u32 cpu_freq_read_intel(struct acpi_pct_register *not_used)
{
    u32 val, dummy;
  
    rdmsr(MSR_IA32_PERF_CTL, val, dummy);
    return val;
}
 

Markfw

Moderator Emeritus, Elite Member
May 16, 2002
25,542
14,496
136
From the Linux kernel documentation:

Next, the scaling driver’s ->init() callback is invoked with the policy pointer of the new CPU passed to it as the argument. That callback is expected to initialize the performance scaling hardware interface for the given CPU (or, more precisely, for the set of CPUs sharing the hardware interface it belongs to, represented by its policy object) and, if the policy object it has been called for is new, to set parameters of the policy, like the minimum and maximum frequencies supported by the hardware, the table of available frequencies (if the set of supported P-states is not a continuous range), and the mask of CPUs that belong to the same policy (including both online and offline CPUs). That mask is then used by the core to populate the policy pointers for all of the CPUs in it.​

The relevant code to get the frequency table:

<snip>
AMD Ryzen 3000 series function way different internally than any CPU before, Intel or AMD. The code you have provided may or may not apply to Ryzen 3000 series. Unless you are an AMD engineer, you can not say that this code will give the right information for a Ryzen 3000 series CPU.

So what you need to do is start listening to the replies that are being given here, as most of them say to use Ryzen Master, and most also say that every frequency from 500 mhz up is possible, in 25 mhz increments. I have personally seen (at least twice) these CPU's run at 500 mhz (when overheated, cooling solution failed), but there may be many places where they run slower than you think.

And lastly, I agree with Usandthem, stop being so smug, you don't know more than every person in this thread.
 

Hitman928

Diamond Member
Apr 15, 2012
5,243
7,792
136
As MarkFW said, the new Ryzen's don't work the way that you are expecting given your experience with Intel CPUs. Try using this command with a light or mixed load:

sudo watch -n 1 cpupower monitor

You should see the CPU frequencies bouncing all around between the stated frequency steps from the Linux kernel and should see even below the lowest frequency listed though that's probably because the core is slipping into C-states rather than being in P-states. Modern AMD CPUs take much more control over their own frequency behavior as controlled on the chip itself compared to older AMD or intel CPUs and they can be very dynamic in their frequency scaling as well as very fine in their frequency steps (as mentioned down to 25 MHz steps). I will use your own quote but change the bolded words,

the table of available frequencies (if the set of supported P-states is not a continuous range)

So rather than fill a frequency table full of 25 MHz steps, they list a few basic frequencies (min, max unboosted, and 1 or 2 mid frequencies) and then will adjust between them, over them, or even under them though the OS governor may be calling for only one of the specific frequencies.

You can try using the cpupower tool to set or modify the listed frequencies but I have no idea if it will really work on Zen2 CPUs. If you are trying to set a specific CPU frequency, you're best bet is to do so through the BIOS. If that is not possible then you may have a lot of headaches trying to get it done through P-state overclocking (or underclocking) within Linux. It may already work, I don't know, I don't have a Zen 2 CPU to try it but you'll definitely want to be on a recent kernel and hope the support is there even though Zen 2 CPUs are relatively very new.

Good luck.

Edit: Some links for reference,
Linux frequency scaling, governor setting, and frequency manipulation

P-state clock adjustment tool that was made for Zen1
 
Last edited:

VirtualLarry

No Lifer
Aug 25, 2001
56,326
10,034
126
Intel CPUs have a lot more of these steps than AMD CPUs. I specifically asked why is that the case. I don't know how and where I was wrong.
This is simply untrue.

Edit: Linux CPU-freq. step table notwithstanding, try using Ryzen Master in WIndows 10. My experience monitoring Ryzen CPUs (both 1st-gen, and 3rd-gen, aka. Ryzen 3000-series CPU), is that they have a 25Mhz granularity, but given certain vendor's BIOS code, you may not be able to manually set those "intermediate" frequencies in the BIOS. My ASRock board was famous for that, you could only set 100Mhz-stepped (whole-multi freqs.) in BIOS, but in Windows, you could observer, and set with Ryzen Master, quarter-multi steps (25Mhz granularity).
 
Last edited: