增加 C++ 程序 CPU 使用率

Posted

技术标签:

【中文标题】增加 C++ 程序 CPU 使用率【英文标题】:Increasing C++ Program CPU Use 【发布时间】:2011-09-20 22:00:01 【问题描述】:

我有一个用 C++ 编写的程序,它每秒运行多个 for 循环,而不使用任何会使其因任何原因等待的东西。它始终使用 2-10% 的 CPU。有什么方法可以强制它使用更多的 CPU 并进行更多的计算而不会使程序更复杂?此外,我在 Windows 计算机上使用 C::B 进行编译。本质上,我在问是否有一种方法可以通过增加 CPU 的使用率来使我的程序更快,如果可以,如何实现。

【问题讨论】:

我为什么要读 fork bomb.. 听起来你不想增加 CPU 消耗但性能。通常,当同步时,循环会消耗 CPU 内核。如果没有,通常是因为等待资源/操作系统(例如,文件系统)。在现代架构上,您可能希望将计算拆分为核心。但是,如果不查看您的代码,可能很难知道如何去做。 如果你的程序没有任何类型的延迟(没有等待),那么通常它会使用 100% 的单核而无需任何额外的步骤(即它会使用 25% 的组合 CPU 在 4 -核心机)。如果你的程序只使用了 1%-2%,那么它要么是 50-100 核机器,要么你没有告诉我们一些重要的事情(即与你的想法相反,你的程序确实有很多等待)。 我的肮脏小手在哪里可以弄到那些可爱的 50-100 核 CPU。嗯嗯! 发布代码(至少是你的 for 循环)。我完全同意@AndreyT。因此,没有代码,讨论毫无意义。我们大多数人(包括我)的代码无需等待就可以消耗整个 CPU 内核,因此在您发布代码之前,不可能找出您的代码有什么不同。 【参考方案1】:

这取决于为什么它只使用 10% 的 CPU。如果是因为您使用的是多 CPU 机器,而您的程序只使用一个 CPU,那么不,您必须在代码中引入并发性才能使用额外的功能。

如果它受到其他限制(例如,将数据复制到磁盘或从磁盘复制数据),那么您无需关注 CPU,您需要关注瓶颈所在。最有可能的是,限制器将从磁盘读取,您可以通过使用更好的缓存机制来改进。

【讨论】:

【参考方案2】:

要求系统提供额外资源确实不是程序的权利或责任。这是操作系统的工作,作为资源调度程序。

如果需要使用超过操作系统认为合适的 CPU 时间,您应该使用平台相关 API 从操作系统请求。在这种情况下,这似乎类似于SetPriorityClassSetThreadPriority

【讨论】:

【参考方案3】:

假设您的应用程序具有权限(PROCESS_SET_INFORMATION 访问权限),您可以使用 SetPriorityClass 提高您的优先级(当然,这通常会损害所有其他进程)。

你可以去ABOVE_NORMAL_PRIORITY_CLASS(先试试这个),HIGH_PRIORITY_CLASS(小心这个)或REALTIME_PRIORITY_CLASS(我强烈建议你可能不应该给这是一张)。

如果您尝试更高的优先级,但它的时钟仍然很低,那可能是因为您不受 CPU 限制(例如,如果您正在将数据写入输出文件)。如果是这种情况,您可能必须找到一种方法来自己受 CPU 限制。

请记住,这样做可能没有必要(甚至是不可取的)。如果您以比其他线程更高的优先级运行并且仍然没有占用大量 CPU,这可能是因为 Windows(很可能,正确地)决定您不需要它。

【讨论】:

【参考方案4】:

创建线程并赋予线程更高的优先级可能是一种方法。

【讨论】:

高优先级时使用 10%。【参考方案5】:

如果您使用 C++,请考虑使用Intel Threading Building Block。你可以找到一些例子here。

【讨论】:

【参考方案6】:

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

正如比利奥尼尔所说,如果您在 8 核上运行,那么卡在 10% 的 cpu 上是正确的。如果这是您的问题,那么 Windows msvc++ 具有标准算法的并行模式(parallel patterns library)。如果以 c++ 方式编写循环,这可以免费提供并行化(确保循环是线程安全的仍然是您的责任)。我没有使用过 msvc 版本,但 gnu::__parallel_for_each 等可以使用。

【讨论】:

以上是关于增加 C++ 程序 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的应用程序最小化时 CPU 使用率会增加?

为啥运行应用程序时 Eclipse CPU 使用率会增加?

测量使用预编译库(C++、Linux)的程序的总 CPU 时间

应用程序冻结但 CPU 使用率随着时间的推移而增加

如何使用 C++ 从 macOS 的 Activity Monitor 应用程序获取 CPU、GPU 和 RAM 使用情况?

C++学习(二五五)HAXM是什么