C ++中的CPU限制

时间:2008-08-05 07:11:08

标签: c++ performance cpu throttling

我只是想知道是否有一种优雅的方法来设置特定线程进行密集计算的最大CPU负载。

现在我找到了线程中最耗时的循环(它只进行压缩),并使用GetTickCount()Sleep()和硬编码值。它确保循环持续一段时间,而不是睡眠一段时间。它或多或少地起作用,即保证线程不会使用超过50%的CPU。
然而,行为取决于CPU核心的数量(巨大的劣势)和简单的丑陋(较小的劣势:))。
有什么想法?

5 个答案:

答案 0 :(得分:18)

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

选择线程每次迭代休眠的默认时间。然后,在每次迭代(或每第n次迭代,使得限制函数本身不会成为重要的CPU负载)时,

  1. 计算自上次调用限制函数以来线程使用的CPU时间量(我称之为dCPU)。您可以使用GetThreadTimes() API来获取线程执行的时间。
  2. 计算自上次调用限制函数以来经过的实际时间量(我称之为dClock)。
  3. dCPU / dClock是CPU使用百分比(一个CPU)。如果它高于你想要的,增加你的睡眠时间,如果更低,减少睡眠时间。
  4. 让你的线程在计算的时间内休眠。
  5. 根据监视程序计算CPU使用情况的方式,您可能希望使用GetProcessAffinityMask()来查找系统具有的CPU数量。 dCPU /(dClock * CPUs)是可用CPU总时间的百分比。

    您仍然需要为初始睡眠时间和增量/减量量选择一些幻数,但我认为可以调整此算法以使线程在相当接近确定的CPU百分比的情况下运行。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

我想不出任何你想要的跨平台方式(或者任何保证完全停止的方式),但是当你使用GetTickCount时,也许你对跨平台不感兴趣:)

我会使用进程间通信并将密集进程设置得很好,以获得您所需要的但我不确定这是否适合您的情况。

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

答案 3 :(得分:2)

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

听起来像问题是看门狗程序。

如果您的后台任务受CPU约束,那么您希望它为其任务占用所有未使用的CPU时间。

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

答案 4 :(得分:0)

您可以更改线程的优先级,但更改最大利用率要么需要轮询和黑客来限制发生的事情,要么使用可以设置进程最大利用率的OS工具。 但是,我没有看到你想要这样做的任何情况。