C++中的CPU限制

Pio*_*ski 43 c++ cpu performance throttling

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

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

Mat*_*ier 20

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

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

  1. 计算自上次调用限制函数以来线程使用的CPU时间量(我称之为dCPU).您可以使用GetThreadTimes() API来获取线程执行的时间.
  2. 计算自上次调用限制函数以来经过的实际时间量(我称之为dClock).
  3. dCPU/dClock是CPU使用百分比(一个CPU).如果它高于你想要的,增加你的睡眠时间,如果更低,减少睡眠时间.
  4. 让你的线程在计算的时间内休眠.

根据监视程序计算CPU使用情况的方式,您可能希望使用GetProcessAffinityMask()来查找系统具有的CPU数量.dCPU /(dClock*CPUs)是可用CPU总时间的百分比.

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


Mar*_*son 5

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