提高C++程序CPU使用率

5

我有一个用C++编写的程序,每秒运行多个for循环而不使用任何会使它等待的东西。它一直使用2-10%的CPU。有没有办法强制它使用更多的CPU,并进行更多的计算,而不使程序变得更加复杂?另外,我在Windows电脑上使用C::B进行编译。本质上,我想知道是否有一种方法可以通过增加CPU使用率来使我的程序更快,如果有,该如何实现。


1
为什么我在读“fork bomb”... - karlphillip
1
听起来你不想增加CPU的消耗,而是想提高性能。通常情况下,同步循环会占用一个CPU核心。如果没有占用,通常是因为等待资源/操作系统(例如文件系统)。在现代架构中,你需要将计算分配到多个核心中。然而,如果没有查看你的代码,可能很难确定如何做到这一点。 - Bruce
4
如果你的程序没有任何延迟(没有等待),那么通常它会在不需要任何额外步骤的情况下使用单个核心的100%计算能力(即在4核心机器上,它将使用25%的CPU)。如果你的程序只使用了1%-2%,那么要么这是一个50-100核心的机器,要么就是你没有告诉我们某些重要信息(即与你的信念相反,你的程序确实有很多等待)。 - AnT stands with Russia
1
我在哪里可以得到那些甜蜜的50-100核心CPU呢?嗯嗯! - paxdiablo
1
请发布代码(至少是您的for循环代码)。我完全同意@AndreyT的观点。因此,如果没有代码,讨论就毫无意义。我们大多数人(包括我在内)都有不会占用整个CPU核心的等待代码,因此在您发布代码之前,无法找出您的代码有何不同。 - Serge Dundich
显示剩余2条评论
6个回答

6
这取决于为什么它只使用了10%的CPU。如果是因为您使用了多CPU计算机,而您的程序只使用了一个CPU,则不需要,您需要在代码中引入并发以使用额外的计算能力。
如果它受到其他限制(例如,将数据从磁盘复制出来),那么您不需要关注CPU,而是需要关注瓶颈所在。最有可能的情况是从磁盘读取的速度限制了程序运行,您可以通过使用更好的缓存机制来改善这种情况。

5
假设您的应用程序有权限(PROCESS_SET_INFORMATION访问权限),您可以使用SetPriorityClass来提高您的优先级(当然,这通常会对所有其他进程产生不利影响)。
您可以选择ABOVE_NORMAL_PRIORITY_CLASS(首先尝试此选项),HIGH_PRIORITY_CLASS(使用此选项时要非常小心)或REALTIME_PRIORITY_CLASS(我强烈建议您可能不应该尝试此选项)。
如果您尝试了更高的优先级,但仍然很慢,那可能是因为您不是CPU绑定的(例如,如果您正在将数据写入输出文件)。如果是这种情况,您可能需要找到一种方法使自己成为CPU绑定状态。
请记住,这样做可能并不必要(甚至可能不可取)。如果您以比其他线程更高的优先级运行,但仍未吸收大量CPU,则可能是因为Windows已经(最有可能是正确地)决定您不需要它。

5

程序没有权利或责任要求系统提供额外的资源。这是操作系统作为资源调度器的工作。

如果需要使用比操作系统认为合适的更多CPU时间,应使用特定于平台的API向操作系统请求。在这种情况下,似乎是类似于SetPriorityClassSetThreadPriority的东西。


0
创建一个线程并将该线程的优先级提高可能是一种方法。

当处于高优先级时,它使用10%。 - TimeCoder

0

0

一些性能分析工具可以很好地指示代码瓶颈所在。例如,CodeAnalyst(仅适用于AMD芯片)具有每个周期的指令比率。我相信英特尔的性能分析工具也是类似的。

正如Billy O'Neal所说,如果你在8核上运行,被卡在10%的CPU使用率是正常的。如果这是你的问题,那么Windows msvc ++有一个并行模式({{link1:parallel patterns library}})用于标准算法。如果您已按照C ++方式编写了循环,则可以免费进行并行化(仍然需要确保循环是线程安全的)。我没有使用过msvc版本,但gnu::__parallel_for_each等工具非常好用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接