首页 / 知识

关于性能:C ++中的CPU节流

2023-04-11 15:50:00

关于性能:C ++中的CPU节流

CPU throttling in C++

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

现在,我在线程中找到了最耗时的循环(它仅压缩),并使用带有硬编码值的GetTickCount()Sleep()。 它可以确保循环持续一定的时间段,而不是休眠一定的最短时间。 这项工作或多或少地完成了工作,即保证线程使用的CPU不超过50%。 但是,行为取决于CPU内核的数量(巨大的劣势),而仅仅是丑陋的(较小的劣势:))。 有任何想法吗?


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

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

  • 计算自上次调用限制功能以来,线程使用的CPU时间(我将其称为dCPU)。您可以使用GetThreadTimes()API来获取线程已执行的时间。
  • 计算自上次调用节流函数以来的实时时间(我将其称为dClock)。
  • dCPU / dClock是(一个CPU的)CPU使用率百分比。如果比您想要的高,请增加您的睡眠时间,如果比您想要的低,请减少睡眠时间。
  • 让线程在计算的时间内进入睡眠状态。
  • 根据看门狗计算CPU使用率的方式,您可能希望使用GetProcessAffinityMask()来找出系统有多少个CPU。 dCPU /(dClock * CPUs)是可用的总CPU时间的百分比。

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


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


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

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

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

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


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

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

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


    您可能可以更改线程的优先级,但是更改最大利用率可能需要轮询和黑客来限制发生的事情数量,或者使用可以设置进程最大利用率的OS工具。
    但是,在任何情况下我都不会这样做。


    线程性能循环计算

    最新内容

    相关内容

    热门文章

    推荐文章

    标签云

    猜你喜欢