【问题标题】:C++ Linux get CPU nominal frequencyC++ Linux获取CPU标称频率
【发布时间】:2016-03-24 21:55:58
【问题描述】:

我需要在 C++ 代码中获得 Linux 下的 CPU 标称频率。据我所知,/proc/cpuinfo 包含当前频率。

/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

以 kHz 为单位的标称频率总是可靠的?

或者有没有更好的方法从 C++ 中获取这些信息?

【问题讨论】:

  • 仅供参考,我的机器上不存在该文件。原因可能是CPU不支持动态频率调整,所以最大值没有意义。
  • s/cpufrequ/cpufreq/g
  • 我也没有 OP 提到的文件。
  • 你到底想达到什么目标?我问的原因是,如果你告诉我们,它可能会给你一个更好的答案,而不是询问现在或将来可能存在或不存在的特定文件。
  • @MatsPetersson 我想获得 CPU 标称(最大)频率的值。

标签: c++ linux cpu-speed


【解决方案1】:

C++ 没有任何方法可以访问这个值,它甚至不假设存在这样一个值。即使在您的情况下,您也只是查看其中一个 CPU,而不是所有 CPU。这意味着您将不得不做一些与操作系统相关的事情,您可能可以在 C++ 中构建。

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

【讨论】:

  • 我知道,这是依赖于操作系统的,我必须在 Linux 下获得这个值。不幸的是 /proc/cpuinfo 包含当前频率,而不是最大频率。
【解决方案2】:

没有一种通用的方法来读取标称频率。使用acpi-cpufreq 缩放驱动程序时,您可以从/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq(标称+ 1 MHz)读取英特尔处理器的标称频率,但是intel_pstate 将此文件的内容设置为最大涡轮频率。尽管如此,也有替代解决方案。 Intel CPU 将标称频率作为 CPU 型号名称的一部分写入(当输入 EAX = 0x01 或来自 /proc/cpuinfo 时使用 CPUID 指令读取),或者您可以读取 MSR_PLATFORM_INFO (0xCE) 寄存器。

编辑:AMD 处理器提供/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq 的标称频率,无需额外的 1 MHz

EDIT2:某些处理器可能有/sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_nominal_freq 文件,例如电源9

【讨论】:

  • afaik,这是操作系统构建的功能,如果它“知道”那个 CPU。程序实际上必须找出模型并将其与数据表交叉引用。例如。如果处理器太新、太旧或太奇特,所有的赌注都没有。
  • 没有赌注,我所写的内容非常适合英特尔处理器。我对 AMD 不太熟悉,但我现在正在使用 AMD,所以我编辑了我的答案以更准确。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2014-11-16
  • 2011-03-02
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多