c++ - 细粒度 nanosleep 在 Linux 上的 C++ 程序中效率不高

标签 c++ linux sleep power-saving

我试图在我的 Linux 机器上的 C++ 线程中定期调用采样函数。我想在很短的时间后重新启动我的功能,最好是 1 毫秒,但我发现 1 毫秒周期消耗的功率(以瓦特为单位)高得令人望而却步:系统运行时的功率水平是我的两倍周期为 5 毫秒。保持低功耗是我想要的功能的主要关注点。

具体来说,

void* loop_and_sample(void* arg) {
    while(1) {
      sample();
      nanosleep((struct timespec[]){{0,1000000}}, NULL);
    }
}

需要 2 倍的功率:

void* loop_and_sample(void* arg) {
    while(1) {
      sample();
      nanosleep((struct timespec[]){{0,5000000}}, NULL);
    }
}

我已经确定我的采样器在 2 个频率下的功耗差异可以忽略不计,额外的功耗来自 sleep 调用。也就是说,即使我在上面的两个代码片段中注释掉了 sample() 行,第二个代码片段仍然占用了一半的功率。关于如何减少 sleep 调用消耗的电量有什么想法吗?

仅供引用,我在 24 核 Intel Xeon 上运行 Ubuntu 3.2.0,在我的/boot/config 中搜索频率显示如下:

cat /boot/config-3.2.0-48-generic | egrep 'HZ'
CONFIG_RCU_FAST_NO_HZ=y
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_MACHZ_WDT=m

但是,运行这个脚本:http://www.advenage.com/topics/linux-timer-interrupt-frequency.php ,我发现我的内核定时器中断至少是 4016 Hz(这是我想要采样的频率的 4 倍)。感谢您的帮助!

最佳答案

几乎可以肯定问题根本不是 sleep 调用,而是您的 CPU 无法快速启动和关闭的事实。 CPU 几乎肯定不会在您进入休眠状态后立即使用更少的电量,因此它需要一些时间才能做到这一点。当您进入休眠时间较长时,CPU 能够更好地降低功耗。

我不确定您能在这里做什么,尽管潜在地降低 CPU 的频率可能有助于在更频繁地醒来时降低电源使用率。

关于c++ - 细粒度 nanosleep 在 Linux 上的 C++ 程序中效率不高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17707361/

相关文章:

linux - 如何在不降低设备速度的情况下调试 gstreamer

linux - 如何在 Unix/Linux 中找到文件中出现频率最高的 10 个词

c编程获取sleep后tty的修改时间

ios - 从后台打开后检测应用何时完成加载

java - 如何暂停 Runnable() 对象以进行测试

c++ - VC++ 中的异常错误 c0000005

c++ - c++中的持久化数据结构

C++ 重载函数作为模板参数

c++ - void({}) 中的 {} 是什么?

linux - 如何在 Linux 中创建同时执行多项任务的 bash 脚本