增加C++程序CPU的使用

Increasing C++ Program CPU Use

本文关键字:CPU C++ 程序 增加      更新时间:2023-10-16

我有一个用C++编写的程序,它每秒运行多个for循环,而不使用任何会让它等待的东西。它始终使用2-10%的CPU。有没有办法在不使程序变得更复杂的情况下,迫使它使用更多的CPU并进行更多的计算?此外,我在Windows计算机上使用C::B进行编译。从本质上讲,我在问是否有一种方法可以通过增加CPU的使用来加快我的程序,如果有,如何。

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

如果它受到其他因素的限制(例如,将数据复制到磁盘和从磁盘复制数据),那么你不需要关注CPU,你需要关注瓶颈是什么。最有可能的是,限制器将是从磁盘读取,你可以通过使用更好的缓存机制来改进这一点。

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

你可以选择ABOVE_NORMAL_PRIORITY_CLASS(先试试这个)、HIGH_PRIORITY_CLASS(小心这个)或REALTIME_PRIORITY_CLASS(我强烈建议你可能不应该尝试这个)。

如果你尝试更高的优先级,但它的时钟仍然很低,那么这可能是因为你没有CPU限制(例如,如果你正在将数据写入输出文件)。如果是这样的话,您可能必须找到一种自己被CPU绑定的方法。

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

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

如果有必要使用比操作系统认为合适的更多的CPU时间,您应该使用依赖于平台的API向操作系统请求。在这种情况下,这似乎与SetPriorityClassSetThreadPriority类似。

创建线程&给予线程更高的优先级可能是一种方式。

如果使用C++,请考虑使用"英特尔线程构建块"。你可以在这里找到一些例子。

一些评测器可以很好地指示代码中的瓶颈所在。例如,CodeAnalyst(仅适用于AMD芯片)具有每个周期的指令比率。我相信情报分析人员是相似的。

不过,正如Billy O'Neal所说,如果你在8核处理器上运行,那么在10%的cpu上运行是正确的。如果这是你的问题,那么Windows msvc++有一个用于标准算法的并行模式(并行模式库)。如果用c++的方式编写循环,这可以免费提供并行化(确保循环是线程安全的仍然是您的责任)。我没有使用过msvc版本,但gnu::__parallel_for_each等可以很好地工作。