C++ Linux 获取CPU名义频率

5

我需要在C++代码中在Linux系统下获取CPU名义频率。据我所知,/proc/cpuinfo中包含当前频率。

/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq始终可靠作为名义频率(单位:千赫兹)吗?

还是有更好的从C++获取这些信息的方法吗?


只是提供信息,那个文件在我的机器上不存在。可能的原因是CPU不支持任何动态频率调整,因此最大值毫无意义。 - Ulrich Eckhardt
1
s/cpufrequ/cpufreq/g - Vladimir Kunschikov
我也没有OP提到的那个文件。 - Baltasarq
1
你实际上想要实现什么?我问这个问题是因为如果你告诉我们你想要实现什么,而不是询问现在或未来可能存在的某个特定文件,那么可能会给你一个更好的答案。 - Mats Petersson
1
@MatsPetersson 我想获取CPU名义(最大)频率的值。 - Dejwi
显示剩余2条评论
2个回答

1

C++没有任何方法来访问这个值,它甚至不假设存在这样的值。即使在您的情况下,您只是查看其中一个CPU,而不是所有CPU。这意味着您将必须执行一些依赖于操作系统的操作,这可能可以使用C++构建。

无论如何,您知道提供该数字的任何工具吗?获取其源代码并查看其如何执行!除此之外,我会查看/proc/cpuinfo并构建“cpu MHz”值的平均值。 /proc文件系统基本上是/sys文件系统的前身,但信息应该是相同的。


我知道这是依赖于操作系统的,我必须在Linux下获取此值。不幸的是,/proc/cpuinfo包含当前频率而不是最大频率。 - Dejwi

1
无法单一普遍的方法读取名义频率。使用acpi-cpufreq缩放驱动程序,您可以从/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq(名义+1 MHz)中读取Intel处理器的名义频率,但是intel_pstate将此文件的内容设置为最大涡轮频率。不过,还有替代方案。Intel CPU的名义频率写在CPU型号名称中(当输入EAX = 0x01时,可使用CPUID指令读取,或者从/proc/cpuinfo读取),或者您可以读取MSR_PLATFORM_INFO (0xCE)寄存器。
编辑:AMD处理器在/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq中提供名义频率,无需额外的1 MHz。
编辑2:某些处理器可能具有/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_nominal_freq文件,例如POWER9。

据我所知,那是操作系统版本的功能,要看它是否“认识”该CPU。程序必须确切地找出模型并与数据表进行交叉引用。例如,如果处理器太新、太旧或太奇特,一切都可能不准确。 - Swift - Friday Pie
没有问题,我所写的代码完美地适用于英特尔处理器。虽然我对 AMD 不是很熟悉,但我现在正在使用一台 AMD 处理器,因此我修改了我的答案以更加精确。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接