6

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

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

4

13 回答 13

9

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

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

我能想到的另一种可能性是,您的线程实现中有一些错误会杀死窗口。

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

于 2009-03-07T12:38:08.033 回答
5

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

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

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

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

于 2009-03-07T13:01:16.230 回答
5

您描述的那种操作已经是高度可并行化的。运行多个工作实际上可能会损害性能。这样做的原因是因为任何处理器的缓存大小都是有限的,您尝试并发执行的次数越多,每个线程的缓存份额就越小。

您还可以查看使用 GPU 来吸收一些处理负载的选项。对于大多数类型的视频转换,现代 GPU 比同类 CPU 的效率要高得多。

于 2009-03-07T13:02:15.590 回答
5

这里有一些很好的答案。

我只想补充一点,从已经进行了大量性能调整的角度来看,除非每个线程都经过积极优化,否则它有很大的减少周期的空间。

用长距离赛车来类比,有两种方法可以尝试获胜:

  1. 让车开得更快
  2. 减少中途停留和绕行

以我的经验,大多数最初编写的软件都远没有走最直接的路线,尤其是当软件变得越来越大时。

正如 Kenneth Cochran 所说,要在你的程序中找到浪费的循环,永远不要猜测。如果你在没有证明它是一个问题的情况下修复了某些东西,那么你就是在猜测。

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

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

于 2009-03-09T13:06:12.240 回答
4

猜测一下,我会说您没有运行 3 核机器(或 4,考虑到 100% 的使用率),如果您使用的线程多于核心,并行化会严重损害您的性能。每个 CPU 内核只创建一个线程,无论您做什么,都不会同时让不同线程访问数据。大多数多核 CPU 中的缓存锁定算法绝对会扼杀你的性能。在这种情况下,在处理 L 帧动画的 N 核 CPU 上,我将在帧 0-(L/N) 上使用线程 1,在帧 (L/N)-(2*L/N) 上使用线程 2,. .. 框架上的螺纹 N ((N-1)*L/N)-L。依次执行不同的组合(AB、BC、CA),这样您就不会破坏您的缓存,而且它应该更易于编码。

作为旁注?像这样的真实计算应该使用 100% 的 CPU,这意味着它会尽可能快地运行。

于 2009-03-07T23:03:40.527 回答
2

超频是不稳定的最可能原因。对于任何 CPU 密集型算法,都会有一些 CPU 抖动。超频无法承受,我会找到一个好的性能分析器来找到性能瓶颈。永远不要猜测问题出在哪里。您可能会花费几个月的时间来优化对性能没有实际影响的东西,或者更糟糕的性能甚至会下降。

于 2009-03-07T13:01:41.380 回答
1

归咎于硬件太容易了。我建议您尝试在不同的系统上运行您的程序,看看使用相同的数据结果如何。

可能你有一个错误。

于 2009-03-07T12:48:47.183 回答
1

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

一旦你使用 SIMD 得到它,然后考虑并行化。听起来你也在猛烈撞击 CPU,所以你也许可以做一些睡眠而不是忙等待,并确保你正在清理或正确重用线程。

于 2009-03-07T23:11:38.433 回答
0

由于没有 BSOD 错误代码(用于查找),因此很难帮助您解决这个问题。

您可以尝试重新安装内存((取出并放入)。我和我认识的其他一些人已经在一些需要它的机器上工作过。例如,我曾经尝试在机器上升级 OS X 并且它一直在崩溃...最后我弹出内存并将其放回原处,一切都很好。

于 2009-03-07T17:14:13.160 回答
0

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

于 2009-03-07T22:43:22.883 回答
0

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

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

于 2015-06-16T19:19:19.160 回答
-1

我认为当内核内存区域损坏时会导致蓝屏死机。所以使用多线程来执行并行操作不可能是这个原因。

好吧,如果您要创建多个线程,每个线程都进行繁重的浮点运算,那么您的 CPU 利用率肯定会达到 100%。

如果您可以在每个线程中给予一些睡眠,以便其他进程获得一些机会,那就更好了。您也可以尝试降低线程的优先级。

于 2009-03-07T12:44:07.817 回答
-1

如果在 Windows 平台上,在一些工作之后调用一个函数来通知 CPU 你想让 cpu 给其他进程。像这样调用 sleep 函数:

睡眠(0);

于 2009-03-07T17:09:28.163 回答