编辑: Ubuntu (mate) 20.04,intel_pstate驱动。电脑是我正在使用的一个掠夺者刀片隐形超级本(2019年初),与英特尔核心i7 i7-8565U。
我遇到了奇怪的行为(极端减速),而仅在电池动力,即使当我已经设置了TLP的交流模式。如果我将cpufrequtils设置为性能模式(特别是如果我是多线程的话),那么问题就更严重了!
我们将从单线程(即只有主线程)开始。我正在运行一个级联的OPENCV滤波器(高斯模糊等)从文件或摄像头的视频帧。如果首先将所有帧加载到内存中并不重要(也就是说,这不是磁盘或设备I/O问题)。下面列出了单个循环(一个帧)的处理时间。这不是复杂的代码。基本上,它所做的是:
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或任何东西)。
单螺纹
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个线程)
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或其他东西来矢量化和使用更多的内核)。
发布于 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个线程)
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% ..。
发布于 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/
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)基本保持不变。
TB no, HT yes
-j10: 7.7s 22W最后一个测试我记下了:
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中)和风扇。
我现在没有问题,如果电池有太多的安培,除了变得空(非常)很快。但我的测量结果表明,这种差异可能是巨大的,有些节流可能会起作用--通常是温度造成的。
但是有剃须刀刀片超薄电池!
https://unix.stackexchange.com/questions/587768
复制相似问题