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

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

有帮助吗?

解决方案

这里有一些很好的答案。

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

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

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

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

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

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

其他提示

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

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

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

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

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

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

  

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

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

  

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

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

猜测一下,我会说你没有运行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,这意味着它的速度尽可能快。

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

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

可能你有一个错误。

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

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

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

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

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

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

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

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

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

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

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

Slepp(0);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top