Intel i7-1065G7无法达到最大的Turbo Boost频率。

我有一台配备Intel i7-1065G7处理器的笔记本电脑。turbostat报告如下:
35 * 100.0 = 3500.0 MHz max turbo 8 active cores
35 * 100.0 = 3500.0 MHz max turbo 7 active cores
35 * 100.0 = 3500.0 MHz max turbo 6 active cores
35 * 100.0 = 3500.0 MHz max turbo 5 active cores
35 * 100.0 = 3500.0 MHz max turbo 4 active cores
35 * 100.0 = 3500.0 MHz max turbo 3 active cores
38 * 100.0 = 3800.0 MHz max turbo 2 active cores
39 * 100.0 = 3900.0 MHz max turbo 1 active cores

(这是4个物理/8个虚拟核心)当我给CPU施加大量单线程负载(使用mpfr计算π)时,我观察到两个核心(可能是一个物理核心?)运行在恰好3500 MHz的频率上,而其他核心则具有较低的频率。但它们从未达到更高的睿频频率。
如果我禁用一些CPU核心(例如使用echo 0 > /sys/devices/system/cpu/cpu[2-7]*/online),笔记本电脑确实可以达到相应的更高睿频频率,从而提高性能(以前平均需要18.5秒的任务现在只需16.8秒)。
当不需要所有核心时,我该如何让我的新笔记本电脑达到最大时钟速度?
我正在使用Ubuntu 20.04和内核5.4.0,在HP Envy x360笔记本电脑上运行。
我期望的是: 在我的旧笔记本电脑上,使用i7-4712MQturbostat会给出以下结果。
30 * 100.0 = 3000.0 MHz max turbo 4 active cores
30 * 100.0 = 3000.0 MHz max turbo 3 active cores
32 * 100.0 = 3200.0 MHz max turbo 2 active cores
33 * 100.0 = 3300.0 MHz max turbo 1 active cores

(这也是一台4/8核心的机器)。在这台机器上,单核负载会使一个核心提升到接近3.3 GHz,双核负载下两个核心会以3.2 GHz运行,依此类推。
我没有在Windows上检查过各个CPU的频率,但任务管理器有时会显示超过3.7GHz的频率。
更新:所以问题消失了...我不知道为什么。我确实卸载了linux-cloud-tools,但我不认为这应该是原因。

看起来你有足够多的其他任务在进行,以至于其他内核足够活跃,不能让你的计算机达到3.8或3.9 GHz。我不知道在运行图形用户界面的计算机上有没有解决方法。我是一个服务器人员,没有图形用户界面,如果我关闭不需要的服务,我就可以轻松地达到我的最大单核限制。你的问题表述清晰而完整,谢谢。你可以尝试强制设置CPU亲和性,以避免CPU切换和相关的启动时间。 - Doug Smythies
@DougSmythies 我不这么认为。如果我禁用6个核心并运行单线程任务(使用mpfr计算π),我得到的总使用率不到60%,而且任务完成得更快。 - 0x539
请确认您的确切CPU型号,我在Intel Ark上找不到它。 - Philip Couling
啊,我打错了。它是i7-1065G7 - 0x539
哦,那你可能需要使用性能调度器而不是默认的省电调度器。我仍然建议为单个线程强制设置CPU亲和性。 - Doug Smythies
@DougSmythies 好主意,我还没有检查过。可惜它仍然无法超过3.5GHz。 - 0x539
你的旧电脑没有HWP(硬件P状态)控制功能,而你的新电脑有。尝试通过在grub命令行中使用intel_pstate=no_hwp来禁用HWP。 - Doug Smythies
很遗憾,那似乎没有任何区别。 - 0x539
你试过强制CPU亲和性吗?比如使用taskset -c 5 single-threaded-command命令? - Doug Smythies
@DougSmythies 记录一下,那也没有帮助。 - 0x539
那么我回到我的第一个评论,并坚称这就是正在发生的事情。你禁用核心的测试只是将其他任务强制转移到剩余的核心上。 - Doug Smythies
2个回答

我有类似的经历,在类似的设置下(i7-9700K CPU,Ubuntu 18.04)。我认为我的机器使用情况可能也相似:这是一台桌面机器,我用它来运行一些密集的(但单线程)应用程序,同时可能还打开了一个网页浏览器和一些消息应用程序。我发现原帖下的评论中的建议很有效——设置进程的CPU亲和性。我使用taskset来做到这一点[1]。
第一次测试(未更改亲和性设置): 所有8个核心的利用率都在10%左右。我启动了一个单线程的CPU密集型任务。一个核心跳到100%,我使用i7z看到所有核心都达到了3.6 GHz(没有超频的最大频率)。
第二次测试: 将所有运行中的进程限制在CPU核心0和1上,使用以下命令:for i in `sudo ps -aux | awk '{ print $2 }'`; do sudo taskset -a -p -c 0-1 $i; done。现在这两个核心的占用率为30-40%,其余核心为0%(尽管操作系统可能会启动其他进程导致一些其他核心开始活动)。然后开始相同的单线程、CPU密集型任务。一个核心的占用率跳至100%,但现在我看到它达到了最大睿频4.9 GHz。之后,通过将范围0-1替换为0-7(在我的情况下),将亲和性设置回使用所有核心。
[1] http://manpages.ubuntu.com/manpages/focal/man1/taskset.1.html

1"为进程设置CPU亲和性" - 这是回答中唯一与问题相关的部分,但并不清楚。回答的其余部分是叙述性的,解释了您曾经遇到过相同的问题以及如何解决该问题。我们的问答格式旨在获取答案并减少闲聊和干扰。如果额外的细节有助于解释答案,那么进行详细阐述是可以的,但请确保如何应用您的解决方案得到明确说明,并与不必要的内容区分开来。 - Nmath

你写道...
当我执行一个大的单线程负载时,
如果你的程序是单线程的,它不需要在其他线程上达到最大频率,所以它没有。
你提供的链接是关于Intel® Core™ i7-1065G7处理器的。
你提供的Intel文档显示最大频率为3900 MHz。根据你的数据,似乎有一个核心运行在3900 MHz,所以我不知道为什么你认为它没有达到最大值。你发布了这个...
35 * 100.0 = 3500.0 MHz max turbo 8 active cores
35 * 100.0 = 3500.0 MHz max turbo 7 active cores
35 * 100.0 = 3500.0 MHz max turbo 6 active cores
35 * 100.0 = 3500.0 MHz max turbo 5 active cores
35 * 100.0 = 3500.0 MHz max turbo 4 active cores
35 * 100.0 = 3500.0 MHz max turbo 3 active cores
38 * 100.0 = 3800.0 MHz max turbo 2 active cores
39 * 100.0 = 3900.0 MHz max turbo 1 active cores

一般来说,如果读数不是最大频率,要么是因为它只间歇性地达到最大频率,所以测量结果也只会显示间歇性的数据;要么是因为它不需要达到最大频率,因为存在某些限制,比如输入输出。不用担心这个问题。如果你编写的程序没有任何限制,换句话说,它是一个计算受限的线程,我保证它会达到最大频率。
18.5秒的经过时间可能并不具有意义,因为其中可能存在你不想用来得出结论的随机效应。运行时间长达200秒或更长的作业可能会给你更有意义的数据。

没错,但我希望执行它的核心提升至3.9 GHz。 - 0x539
好的,我会删除您不感兴趣的信息。 - H2ONaCl
这仍然没有解决问题。我不关心其他核心,只关心程序运行的那个核心。 - 0x539
我解决了我说有限制的问题。 - H2ONaCl
我更新了我的问题,以明确表示禁用核心会导致更高的频率和对计算受限任务的可测量性能提升。 - 0x539
正如我所写的,CPU核心不会超过3.5GHz(根据/sys/devices/system/cpu/cpu$i/cpufreq/scaling_cur_freq)。我发布的数据仅是turbostat报告的处理器规格,而不是CPU的实际频率。 - 0x539
那些不是规格。它说的是scaling_cur_freq,这意味着它是当前频率。 - H2ONaCl
你引用的不是频率读数,而是turbostat的输出,它提供了(静态的)系统信息。 - 0x539