2013-07-17 61 views
4

我想在我的linux機器上的C++線程中定期調用一個採樣函數。我想在非常短的時間內(最好是1毫秒)重新啓動我的功能,但我發現在1毫秒時間內消耗的功率(以瓦特爲單位)非常高:系統運行功率水平是雙倍週期是5毫秒。保持低功耗是我想要的功能的主要關注點。細粒度nanosleep在linux上的C++程序中不能省電

具體地說,

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

注意到2X的功率:

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

我已確定,在第2個頻率在我的採樣的功率使用的差值是可忽略的,並且,額外的功率消費來自睡眠呼叫。也就是說,即使我在上面的兩個片段中註釋了sample()行,第二個仍然佔用了一半的權力。有關我如何能夠減少睡眠呼叫消耗的功率的任何想法?

通知你,我在24核Intel Xeon和搜索頻率我的/ boot/config中的運行Ubuntu 3.2.0顯示以下內容:

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倍)。謝謝你的幫助!

+1

請指定您的硬件以及您正在運行的內核版本。電源狀態管理是深沉的巫術,並且高度依賴於硬件。 –

+0

Mark B(下面)可能是正確的,所以這是一個很長的一步,但是...你可以嘗試使用timerfd(見http://linux.die.net/man/2/timerfd_create),以防這是一個內部實施小睡眠睡眠的問題。 – Nemo

+0

Ubuntu 3.2.0(如上所述)和Intel Xeon 24核心機器(現在添加到主體中) – jst14

回答

1

問題幾乎可以肯定不是睡眠呼叫,但事實上,您的CPU無法快速上下電。進入睡眠狀態後,CPU幾乎肯定不會立即使用較少的電源,因此需要一些時間來完成。當你長時間進入睡眠狀態時,CPU可以更好地降低功耗。

我不確定這裏有什麼可以做的,雖然潛在地降低CPU的頻率可能會在更頻繁地喚醒時幫助降低功耗。