【问题标题】:C++: Limiting CPU usage intentionallyC++:有意限制 CPU 使用率
【发布时间】:2011-04-30 03:29:53
【问题描述】:

在我的公司,我们经常测试 USB 和 FireWire 设备在 CPU 压力下的性能。

我们运行了一个加载 CPU 的测试代码,它通常用于非常简单的非正式测试,以了解我们设备的性能会发生什么变化。

我查看了这方面的代码,它是一个简单的循环,它增加一个计数器并根据新值进行计算,将此结果存储在另一个变量中。

运行单个实例将使用 1/X 的 CPU,其中 X 是内核数。

因此,例如,如果我们在一台 8 核 PC 上,并且想要查看我们的设备在 50% 的 CPU 使用率下如何运行,我们可以一次打开四个实例,依此类推...

我想知道:

  1. 是什么决定了 CPU 的使用量?它只是在单线程应用程序的单线程上尽可能快地运行所有内容吗?

  2. 有没有办法自愿限制您的程序可以使用的最大 CPU 使用率?我可以想到一些“草率”的方法(添加睡眠命令或其他东西),但是有没有办法限制说,可用 CPU 的某个指定百分比或其他东西?

【问题讨论】:

  • 1. CPU 尝试尽可能快地运行代码。 2. 没有“草率”的方式,你就不能施加限制。
  • @Ben Aw 是不是很新。
  • @David:也许是 Windows 的新手,但实时操作系统长期以来一直提供 CPU 分区。

标签: c++ cpu-usage


【解决方案1】:

Windows 7Linux 上的 CPU 配额。

还有QNX (i.e. Blackberry Tablet OS)LynuxWorks

如果链接断开,文章被命名为:

  • Windows --“Windows Server 2008 R2 和 Windows 7 中的 CPU 速率限制”
  • Linux -- “Linux 的 CPU 使用限制器”
  • QNX -- “自适应分区”
  • LynuxWorks - “分区操作系统”和“ARINC 653”

【讨论】:

    【解决方案2】:
    1. 操作系统通常决定如何调度进程以及它们应该在哪些 CPU 上运行。它基本上为准备运行的进程保留一个就绪队列(未标记为终止并且未阻塞等待某些 I/O、事件等)。每当一个进程用完它的时间片或阻塞时,它基本上都会释放一个处理核心,并且操作系统会选择另一个进程来运行。现在,如果您有一个始终准备好运行且永不阻塞的进程,那么该进程基本上会在任何时候运行,从而将处理单元的利用率提高到 100%。当然,这是一个有点简化的描述(例如进程优先级之类的东西)。
    2. 通常没有通用的方法来实现这一点。您使用的操作系统可能会提供一些机制来执行此操作(某种 CPU 配额)。您可以尝试测量经过了多少时间与您的进程使用了​​多少 CPU 时间,然后让您的进程休眠一段时间以达到所需 CPU 利用率的近似值。

    【讨论】:

    • 1.在 Firewire 或 USB 驱动程序中,优先级起着关键作用,因为它们将抢占任何用户进程。 2. 当然有一个通用的方法,你可以实现一个反馈循环尝试保持处理器时间是挂钟时间的某个倍数。
    【解决方案3】:

    您基本上已经回答了自己的问题!

    消耗大量 CPU 的代码的关键特征是它从不做任何阻塞的事情(例如等待网络或文件 I/O),并且从不主动放弃它的时间片(例如 sleep() 等) .

    另一个技巧是代码必须做一些编译器无法优化的事情。因此,很可能您的 CPU 烧录代码最终会根据循环计算输出一些内容,或者只是在没有优化的情况下编译,这样优化器就不会试图删除无用的循环。由于您正在尝试加载 CPU,因此无论如何优化都没有意义。

    正如您所假设的,与此描述匹配的单线程代码将使 CPU 内核饱和,除非操作系统拥有的这些进程多于运行它们的内核 - 然后它将循环调度它们并且每个进程的利用率将是 100% 的一部分。

    【讨论】:

      【解决方案4】:

      问题不在于 CPU 闲置了多少时间,而在于您的代码开始执行需要多长时间。只要延迟低,谁在乎它是空闲还是做低优先级的忙碌工作?

      您的问题基本上是使用综合基准的结果,大概是为了获得可重现的结果。但综合基准往往会产生无意义的结果,因此可重复性没有实际意义。

      查看您的错误数据库,找到实际的客户投诉,并使用实际的软件和测试硬件来重现实际上让某人不满意的情况。与严格的、有意义的性能要求并行开发性能测试。

      【讨论】:

        猜你喜欢
        • 2017-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 2012-07-06
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多