首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用intel_pstate驱动的电池性能差

用intel_pstate驱动的电池性能差
EN

Unix & Linux用户
提问于 2020-05-19 22:13:46
回答 2查看 2.2K关注 0票数 2

编辑: Ubuntu (mate) 20.04,intel_pstate驱动。电脑是我正在使用的一个掠夺者刀片隐形超级本(2019年初),与英特尔核心i7 i7-8565U。

我遇到了奇怪的行为(极端减速),而仅在电池动力,即使当我已经设置了TLP的交流模式。如果我将cpufrequtils设置为性能模式(特别是如果我是多线程的话),那么问题就更严重了!

我们将从单线程(即只有主线程)开始。我正在运行一个级联的OPENCV滤波器(高斯模糊等)从文件或摄像头的视频帧。如果首先将所有帧加载到内存中并不重要(也就是说,这不是磁盘或设备I/O问题)。下面列出了单个循环(一个帧)的处理时间。这不是复杂的代码。基本上,它所做的是:

代码语言:javascript
复制
Filter filters[400]
while( cap.read(frame) )
{
 for( int i=0; i<400; ++i )
 {
  filters[i].dofilter(frame);
 }
}

其中过滤器我.dofilter只是调用例如cv::GaussianBlur、resize()等,目标cv::Mat预先分配(我不做任何额外的分配)

这是只使用CPU (也就是说,它不使用OPENCV、透明的openCL或任何东西)。

单螺纹

代码语言:javascript
复制
AC  + powersave:    71 msec (variance 70.5-71.5)
AC  + performance:  67 msec (variance 66.5-67.5)
BAT + powersave:    95 msec (variance 84.0-115.0)  *1
BAT + performance:  104 msec (variance 76.0-202.0) *2

1* Note: spikes to 110+ about every 5 sec
2* Note:  most ~96, with few spikes low to 80s and high to 120s

方法:每次运行10次,持续60秒(每次约600帧,10次运行=6000次),随机排序(使热、电池电压等不混淆)。

我对每个循环使用相同的输入帧(换句话说,并不是因为每次处理的图像内容不同)。它实际上是处理完全相同的输入每一时间步骤。我可以看到每帧处理时间立即改变,如果我拔出或插入AC适配器或设置电源保存/性能使用cpufrequtils。

我完全不知所措。

我使用的是掠夺者刀片隐形超级本,与英特尔核心i7 i7-8565U。Ubuntu (伙伴) 20.04,intel_pstate驱动程序。

因此,我有三个具体的问题:

1)到底发生了什么事?

2)如何设置TLP (核参数?)迫使它像在AC上一样运行(当然电池可以提供足够的cpu/内存绑定的单核程序,就像在AC上那样快)?它甚至都没做那么多!

( 3)电池电源是否有任何秘密或奇怪的设置?特别是与多线程有关?这个问题是高度并行的--基本上有8个独立的过滤器链,我可以并行运行。通常是我做的。当我在AC上做这件事时,它是这样的:

多线程(8个线程)

代码语言:javascript
复制
AC  + powersave:    28.6 msec (variance 26.8-31.1)
AC  + performance:  28.8 msec (variance 26.6-31.2)
BAT + powersave:    39 msec (variance 36.0-64.0)   *3
BAT + performance:  176 msec (variance 39.0-202.0) *4

3* Note: this is very tame compared to if I run with webcam -- then it spikes heavily between 40 and 90

4* Note: will update at 40 msec for a few frames, then go to 180 msec for a long time, then burst at 40 for a few.

该软件是通过线程池多线程的。我检查了锁,即使在极端多线程的情况下也不会花时间等待锁(这实际上是我花的时间最多的地方,因为我认为这是最初的问题……)。我在2~8个线程上得到了类似的结果。在有更多线程(特别是在性能模式下)的电池上变得更慢,在有更多线程的AC上速度更快。

编辑:即使我禁用TLP,问题也会发生。我还没有尝试切换到旧的acpi频率调节器(认为这会有效吗?)

编辑2:在单线程模式下,htop只显示一个固定的CPU核心(也就是说,它没有使用openmp或其他东西来矢量化和使用更多的内核)。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-05-20 09:07:12

问题是intel_pstate驱动程序。

我通过引导内核参数切换到原始的ACPI驱动程序。具体来说,在/etc/ DEFAULT /grub中,我将默认的引导行更改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=disable acpi=force"

(记得update-grub之后)。

现在,即使没有任何更改(即默认的“按需”):

多线程(8个线程)

代码语言:javascript
复制
BAT + ondemand:     38.5 (37.5 ~ 40.0)
BAT + performance:  31.8 (30.1 ~ 35.0) *1

我看到一些很小的尖峰,每隔几秒钟35次,但这是合理的.

具有讽刺意味的是,正常工作负载期间的功耗(浏览、EMACS、wifi等)实际上,ACPI驱动程序的使用也比intel_pstate更好(平均为590 mA vs 660 mA)。一个愉快的(但令人担忧的)副作用。

编辑:一个缺点是,当不使用intel_pstate驱动程序时,挂起(睡眠模式)似乎会消耗更多的能量。大约每12小时10% ..。

票数 3
EN

Unix & Linux用户

发布于 2020-06-10 11:13:16

这是我的内核make“只下降”-benchmarks(即。只有make,当没有什么可做的-几秒钟)。

我花了一段时间才意识到make中的-j选项;我不需要重新启动就可以更改Turbo和SMT/超线程设置:它们可以通过/sys访问。

我的TDP是28W。它不是笔记本电脑,而是i5-8259 U。它通常(就像现在一样)消耗3.5W-5W。以下是我注意到的一些结果,重点放在我身体上的瓦茨身上。

time make -j10 -O O=../make-out/

代码语言:javascript
复制
TB+HT,mitigations=off

-j8:    4.8s    57W (max.)
-j4:   12.3s    20W (-35W)  
no-j:  21.7s    19W (max.)
-j4II:  6.4s    45W

用焦耳就更准确了。我想57W包括风扇。两个-j4结果表明:总能量(Ws=Joule)基本保持不变。

代码语言:javascript
复制
TB no, HT yes
-j10:  7.7s  22W

最后一个测试我记下了:

代码语言:javascript
复制
TB 25-35-1sec "tau", HT yes, mitig.=off
-j10:  5.2s  40W

这个涡轮增压设置是从BIOS -它似乎有助于限制"57W最大值“。从第一轮开始。

但是在sysfs中将75 %(%)写入intel_pstate/max_perf_pct,我现在找到了一种更好的方法来增强它,但它只提供了3.0GHz,而不是3.8GHz。

现在我用35W得到了5.5秒(最大)。44W),而50W左右的4.8s。在25W时,没有提升是6.7秒。

更多的激活核和更高的CPU频率可以在时间和瓦特上产生巨大的差异。GPU甚至可以添加到其中(在exampl中)和风扇。

我现在没有问题,如果电池有太多的安培,除了变得空(非常)很快。但我的测量结果表明,这种差异可能是巨大的,有些节流可能会起作用--通常是温度造成的。

但是有剃须刀刀片超薄电池!

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/587768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档