Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的CPU节流+;_C++_Performance_Cpu_Throttling - Fatal编程技术网

C++ C+中的CPU节流+;

C++ C+中的CPU节流+;,c++,performance,cpu,throttling,C++,Performance,Cpu,Throttling,我只是想知道是否有一种优雅的方法可以为执行密集计算的特定线程设置最大CPU负载。 现在我找到了线程中最耗时的循环(它只进行压缩),并使用带有硬编码值的GetTickCount()和Sleep()。它确保循环持续一定的时间,然后休眠一定的最短时间。它或多或少地完成了这项工作,即保证线程不会使用超过50%的CPU然而,行为取决于CPU内核的数量(巨大的缺点)和简单的丑陋(较小的缺点:)有什么想法吗?我想不出任何跨平台的方式来满足您的需求(或任何保证方式的句号),但当您使用GetTickCount时,

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


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

我想不出任何跨平台的方式来满足您的需求(或任何保证方式的句号),但当您使用GetTickCount时,您可能对跨平台不感兴趣:)

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

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

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

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

选择线程在每次迭代中睡眠的默认时间量。然后,在每次迭代中(或在每次第n次迭代中,节流功能本身不会成为一个显著的CPU负载)

  • 计算自上次调用节流函数以来线程使用的CPU时间量(我将调用此dCPU)。您可以使用API获取线程执行的时间量
  • 计算自上次调用节流函数以来经过的实时时间量(我将此称为dClock)
  • dCPU/dClock是(一个CPU的)CPU使用率百分比。如果它高于您想要的,请增加您的睡眠时间,如果较低,请减少睡眠时间
  • 让线程在计算的时间内睡眠
  • 根据看门狗计算CPU使用率的方式,您可能希望使用来确定系统有多少CPU。dCPU/(dClock*CPU)是总可用CPU时间的百分比


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

    问题是,在您有工作要做的时候让CPU空闲是不正常的。通常,您会设置一个背景将任务分配到空闲优先级,并让操作系统处理调度交互任务未使用的所有CPU时间

    在我看来,问题似乎是看门狗程序

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


    也许您应该考虑修复watchdog程序?

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

    想要一个空闲的CPU是非常合理的。也许你想做一些计算,但不在乎它完成得有多快,只要它不会启动你笔记本电脑上的CPU风扇。你想实现什么可见的行为?也就是说,这个看门狗想从你的大脑中得到什么ds?它们应该不会占用超过(比如)80%的CPU吗?将进程基优先级设置为空闲可以让WD平静下来吗?如果您的目标是避免浪费CPU时间,那么更便宜的启发式方法可能是更好的选择。根据线程在高系统负载下耗尽自身的问题程度,您可以只检查ELAPed wall clock time。在x86上,这是非常便宜的,因为基于
    rdtsc
    的时间函数甚至不需要进入内核模式。即使是
    n
    多次迭代,也比只进行一次迭代更糟糕,除非它允许您大量增加
    n
    ,并且仍然获得您想要的行为。其他平台也有类似的features,另请参见:我认为这是一个很好的问题解决方案,尽管语义不同-即没有50%的CPU消耗保证