C ++中的CPU节流

时间:2020-03-05 18:37:40  来源:igfitidea点击:

我只是想知道是否有一种优雅的方法来为执行密集计算的特定线程设置最大CPU负载。
现在,我在线程中找到了最耗时的循环(它仅压缩),并使用带有硬编码值的GetTickCount()和Sleep()。它可以确保循环持续一定时间,然后休眠一定的最短时间。这项工作或者多或者少地完成了工作,即保证线程使用的CPU不超过50%。
但是,行为取决于CPU内核的数量(巨大的缺点),而又仅仅是丑陋的(较小的缺点:))。
有任何想法吗?

解决方案

回答

我无法想到我们想要的任何跨平台方式(或者任何保证的句号),但是当我们使用GetTickCount时,我们可能对跨平台不感兴趣:)

我将使用进程间通信并为密集的流程设置良好的级别,以获取所需的信息,但是我不确定这是否适合情况。

编辑:
我同意Bernard的观点,这就是为什么我认为进程而不是线程可能更合适,但它可能不适合目的。

回答

在Linux上,我们可以使用nice()更改线程的调度优先级。

回答

我不知道有任何API可以使操作系统的调度程序执行我们想要的操作(即使线程是空闲优先级的,如果没有更高优先级的就绪线程,线程也会运行)。但是,我认为我们可以根据已经在做的事情即兴发挥一个相当优雅的调节功能。本质上(我没有Windows开发机):

选择线程在每次迭代中休眠的默认时间。然后,在每次迭代中(或者在每第n次迭代中,限制功能本身不会成为很大的CPU负载),

  • 计算自上次调用限制函数以来,线程使用的CPU时间(我将其称为dCPU)。我们可以使用GetThreadTimes()API来获取线程已执行的时间。
  • 计算自上次调用节流函数以来的实时时间(我将其称为dClock)。
  • dCPU / dClock是(一个CPU的)CPU使用率百分比。如果比我们想要的高,请增加睡眠时间;如果比我们想要的低,请减少睡眠时间。
  • 让线程在计算的时间内进入睡眠状态。

根据看门狗计算CPU使用率的方式,我们可能需要使用GetProcessAffinityMask()来找出系统有多少个CPU。 dCPU /(dClock * CPUs)是可用的总CPU时间的百分比。

我们仍然必须为初始睡眠时间和增量/减量选择一些不可思议的数字,但是我认为可以对该算法进行调整,以使线程在相当接近确定的CPU百分比的情况下运行。

回答

问题是在工作时想让CPU空闲是不正常的。通常,我们将后台任务设置为" IDLE优先级",然后让操作系统处理所有交互式任务未使用的CPU时间的调度。

在我看来,问题在于看门狗进程。

如果后台任务是CPU密集型的,那么我们希望它占用其任务所有未使用的CPU时间。

也许我们应该考虑修复看门狗程序?