【问题标题】:CPU throttling in C++C++ 中的 CPU 节流
【发布时间】:2010-09-05 08:15:16
【问题描述】:

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

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

【问题讨论】:

  • 你想要实现什么样的可见行为?也就是说,这个看门狗想从你的线程中得到什么?他们不应该使用超过 80% 的 CPU 吗?将进程基本优先级设置为空闲是否可以使 WD 平静下来?

标签: c++ performance cpu throttling


【解决方案1】:

我不知道有任何 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 百分比运行。

【讨论】:

  • 如果您的目标是避免浪费 CPU 时间,那么更便宜的启发式方法可能是更好的选择。根据您的线程在高系统负载下饿死自己的问题有多大,您可以只是检查经过的挂钟时间。在 x86 上,这非常便宜,因为基于 rdtsc 的时间函数甚至不需要进入内核模式。进行多次系统调用,即使是 n 迭代也比只进行一次更糟糕,除非它可以让您将 n 增加很多并且仍然获得您想要的行为。
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    如果您的后台任务受 CPU 限制,那么您希望它占用所有未使用的 CPU 时间来执行其任务。

    也许你应该看看修复看门狗程序?

    【讨论】:

    • 想要一个空闲的 CPU 是非常合理的。也许您想做一些计算,但不在乎它完成的速度有多快,只要它不会启动笔记本电脑上的 CPU 风扇即可。
    【解决方案5】:

    您也许可以更改线程的优先级,但更改最大利用率将需要轮询和 hack 来限制正在发生的事情的数量,或者使用可以设置进程最大利用率的操作系统工具。 但是,我没有看到您想要这样做的任何情况。

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 2014-11-05
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2019-11-22
      • 2012-08-06
      • 2020-10-19
      • 2012-08-06
      相关资源
      最近更新 更多