如何降低程序的CPU使用率?

时间:2009-03-07 12:33:25

标签: c++ performance parallel-processing qtconcurrent

我编写了一个多线程程序,它通过大量浮点运算来执行一些CPU繁重的计算。更具体地说,它是一个逐帧比较动画序列的程序。即对于动画A中的所有帧,它将来自动画A的帧数据与动画B中的所有帧进行比较。我对不同的动画并行执行此强化操作,因此程序可以在AB对,BC对和CA对中进行平行。该程序使用QtConcurrent和“map”函数,该函数将带有运动的容器映射到函数上。 QtConcurrent为我管理线程池,我正在使用英特尔四核处理器,因此它产生了4个线程。

现在,问题是我的进程会破坏我的CPU。用法是100%不变的,如果我在一个足够大的运动集上运行我的程序(非分页区域中的页面错误),我实际上得到了一个蓝屏死机。我怀疑这是因为我的电脑超频了。但是,这可能是因为我编写程序的方式吗?我用来测试机器稳定性的一些非常密集的benchamrking工具从未使我的PC崩溃。有没有办法控制我的程序如何使用我的CPU来减少负载?或许我误解了我的问题?

13 个答案:

答案 0 :(得分:9)

超频PC可能会导致各种奇怪的问题。如果您怀疑这是问题的根本原因,请尝试在合理的范围内计时并重试您的测试。

它也可能是某种非常奇怪的内存错误,你以某种方式破坏你的RAM(因为BSOD,我猜操作系统因为BSOD而无法恢复)(非常不可能,但谁知道)。

我能想到的另一种可能性是,你的线程实现中有一些错误导致Windows死机。

但首先,我会看一下超频问题......

答案 1 :(得分:5)

  

我怀疑这是因为我的电脑超频了。

这绝对有可能。尝试将其设置为正常速度一段时间。

  

这可能是因为我编写程序的方式吗?

以用户模式运行的程序不太可能导致BSOD。

答案 2 :(得分:5)

您所描述的操作类型已经高度可并行化。运行多个作业实际上可能伤害性能。原因是因为任何处理器的缓存大小有限,并且尝试并发执行的越多,每个线程的缓存份额就越小。

您还可以使用GPU查看选项以吸收部分处理负载。对于大多数类型的视频转换而言,现代GPU的效率远高于类似代的CPU。

答案 3 :(得分:5)

这里有一些很好的答案。

我只会从进行大量性能调整的角度来补充,除非每个线程都经过积极优化,否则很有可能减少周期。

为了与长途汽车比赛进行类比,有两种方法可以获胜:

  1. 让车子变得更快
  2. 减少停靠和副驾驶
  3. 根据我的经验,大多数首次编写的软件与采用最直接的路径相距甚远,尤其是随着软件变得越来越大。

    要找到程序中浪费的周期,正如Kenneth Cochran所说,从不猜测。如果你在没有证明这是一个问题的情况下修复某些东西,那么你就会投入猜测。

    查找性能问题的常用方法是使用分析器。

    但是,我做了很多,我的方法是:http://www.wikihow.com/Optimize-Your-Program%27s-Performance

答案 4 :(得分:4)

猜测一下,我会说你没有运行3核计算机(或4,使用率为100%),如果你使用的线程多于核心,并行化将会对你的性能产生影响。每个CPU核心只需要一个线程,无论你做什么,都不会同时由不同的线程访问数据。大多数多核CPU中的缓存锁定算法绝对会扼杀您的性能。在这种情况下,在处理L帧动画的N核CPU上,我会在帧0-(L / N)上使用线程1,在帧上使用线程2(L / N) - (2 * L / N),. ..帧上的线程N((N-1)* L / N)-L。按顺序执行不同的组合(A-B,B-C,C-A),这样就不会破坏缓存,编码应该更简单。

作为旁注?真正的计算就像这个应该使用100%的CPU,这意味着它的速度尽可能快。

答案 5 :(得分:2)

超频是导致不稳定的最可能原因。使用任何CPU密集型算法都会出现一些CPU抖动。超频无法承受,我会找到一个好的性能分析器来找到性能瓶颈。永远不要猜测问题出在哪里。您可能需要花费数月时间来优化对性能没有实际影响的事情,否则性能会下降甚至会降低。

答案 6 :(得分:1)

责怪硬件太容易了。我建议你尝试在不同的系统上运行你的程序,看看结果是如何得到的。

可能你有一个错误。

答案 7 :(得分:1)

考虑使用SIMD操作。我想你在这种情况下想要SSE。它们通常是比并行化更好的第一步,因为它们更容易正确并且为大多数线性代数类型的操作提供了相当大的推动力。

使用SIMD获得它后,请查看并行化。听起来你也在抨击CPU,所以你可能会做一些睡眠,而不是忙着等待,并确保你正在清理或重新使用线程。

答案 8 :(得分:0)

由于缺少BSOD错误代码(对于查找非常有用),对您来说这有点困难。

你可能会尝试在物理上重新安装你的内存(把它拿出来放进去。)我和其他一些我知道的机器已经在需要它的几台机器上工作了。例如我曾经尝试升级OS X一台机器,它一直在崩溃...最后我将内存弹出并将其丢回,一切都很好。

答案 9 :(得分:0)

睡眠(1);将CPU使用率减少一半。我使用CPU密集型算法遇到了同样的问题。

答案 10 :(得分:0)

如果您的处理器有两个或更多内核,您可以转到任务管理器并转到进程并右键单击程序名称并单击Set affinity并将程序设置为使用更少的内核。

执行您要求的操作需要更长时间,但会导致CPU使用率显着下降。

答案 11 :(得分:-1)

我认为当内核内存区域被破坏时会导致蓝屏死机。 因此,使用多线程执行并行操作不是原因。

如果您创建多个线程,每个线程都进行大量浮点运算,那么您的CPU利用率肯定会高达100%。

如果你可以在每个线程中给一些睡眠,那么其他进程有机会会更好。 您也可以尝试降低线程的优先级。

答案 12 :(得分:-1)

如果在Windows平台上,经过一些工作后调用一个函数来通知CPU你想让cpu到其他进程。像这样打电话给睡眠功能:

Slepp ( 0 );