英特尔 MSR 频率缩放每个线程



我正在扩展Linux内核以控制某些线程的频率:当它们被调度到内核(任何内核!)上时,内核的频率通过将正确的p状态写入寄存器IA32_PERF_CTL来改变,正如英特尔手册中所建议的那样。但是,当调度具有不同"自定义"频率的不同线程时,似乎所有线程的吞吐量都会增加,就好像所有内核都以最大设定频率运行一样。

我在不同的负载和配置条件下进行了许多试验和测量,但结果是相同的。在使用 CPUFreq 进行一些试验后(没有运行应用程序,我在每个内核上设置了不同的频率,最后测量的频率,使用 cpufreq-info -w,是相等的),我想知道 CPU 内核是否真的可以以不同的独立频率运行,或者是否有硬件策略或约束。

最后,是否有一种 CPU 模型使这种细粒度频率缩放可行?

我正在使用的CPU是英特尔酷睿i5 750

您无法控制活动内核的单个内核频率。但是,您可以将所有活动内核的频率控制为相同。原因在前面的答案中 - 所有内核都在同一个有源电压平面上。希望下一代Haswell处理器能够单独控制每个内核。

我认为你错过了一大块图片!

阅读电源和时钟域。域中的所有处理器内核都以相同的 P 状态(即相同的频率和电压)运行。所有内核将在该域中运行的 P 状态将始终是请求该域中最高 P 状态的核心的 P 状态。MSR 根本不反映这一点,内核公开的接口也不反映这一点。

Anandtech对此有一篇很好的文章:http://www.anandtech.com/show/2658/2

"这与AMD的Phenom非常相似,但两者的不同之处在于它们如何处理电源管理。虽然 AMD 将允许单个内核请求不同的时钟速度,但 Nehalem 尝试以相同的频率运行其所有内核;如果一个内核处于空闲状态,那么它只是电源门控,并且内核实际上被关闭。

我还没有将功率计连接到SB/IB,但我的猜测是行为是相同的。

cpufreq-info 将显示有关哪些内核需要在其 P 状态下同步的信息:

[root@navi ~]# cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0 1 <---- THIS
  CPUs which need to have their frequency coordinated by software: 0 <--- and THIS
  maximum transition latency: 10.0 us.

至少正因为如此,我建议通过 cpufreq 接口而不是直接设置寄存器,以及使其可以在可能具有不常见要求的非英特尔 CPU 上运行。

还要检查如何使内核线程粘附到特定内核,以避免意外切换(如果您还没有这样做)。

我要

感谢大家的贡献!进一步调查,我发现了与社区分享的其他细节。

正如建议的那样,Nehalem将所有内核放在一个时钟域中,以便所有内核中设置的最大频率应用于所有内核;某些工具可能会在空闲内核上显示不同的频率,但运行任何应用程序足以使频率提高到最大。根据我的测试,这也适用于Sandy Bridge,其中内核和LLC切片都位于同一频域/电压域中。我假设这种行为也会发生在常春藤桥上,因为它只是一个"刻度"迭代。相反,我相信Haswell将内核和LLC切片放置在不同的单一域中,从而实现每个内核的频率。这也在几个页面中做广告,例如http://www.anandtech.com/show/8423/intel-xeon-e5-version-3-up-to-18-haswell-ep-cores-/4

最新更新