2013-07-17 4 views
4

리눅스 머신의 C++ 스레드에서 주기적으로 샘플링 기능을 호출하려고합니다. 나는 매우 짧은 기간, 이상적으로 1 밀리 초 후에 기능을 다시 시작하고 싶지만 1 밀리 초 동안 소비되는 전력 (와트)은 엄청나게 높다는 것을 알게되었다. 기간은 5msec이다. 저전력을 유지하는 것은 내가 원하는 기능에 대한 주요 관심사입니다. 특히세분화 된 나노 슬립은 리눅스의 C++ 프로그램에서 전력 효율이 떨어짐

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); 
    } 
} 

여분의 전력이 소비는 수면 전화에서 비롯됩니다. 즉 위의 두 조각에서 sample() 행을 주석 처리하더라도 두 번째 코드는 여전히 절반의 전력을 소비합니다. 수면 통화로 소비되는 전력을 어떻게 줄일 수 있을지에 대한 아이디어가 있습니까? 그러나

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 

을이 스크립트를 실행 : 참고로, 나는 24 코어 인텔 제온 및 주파수에 대한 내/부팅/설정의 검색에 우분투 3.2.0을 실행하는거야

는 다음을 보여줍니다 http://www.advenage.com/topics/linux-timer-interrupt-frequency.php , 나는 내 커널 타이머 인터럽트가 적어도 4016 Hz 인 것을 발견했다. (이것은 내가 샘플링하고자하는 주파수의 4 배이다.) 당신의 도움을 주셔서 감사합니다!

+1

하드웨어 및 실행중인 커널 버전을 지정하십시오. 전원 상태 관리는 심오한 부두이며 하드웨어 의존도가 높습니다. –

+0

마크 B (아래)는 아마도 맞을 것이므로, 이것은 아주 깁니다. 그러나 ... timerfd (http://linux.die.net/man/2/timerfd_create 참조)를 사용해보십시오. 작은 간격 동안 nanosleep의 내부 구현 문제. – Nemo

+0

우분투 3.2.0 (앞에서 설명한대로)과 인텔 제온 24 코어 머신 (이제 본체에 추가됨) – jst14

답변

1

문제는 거의 잠자기 전화가 아니지만, 귀하의 CPU가 위와 아래로 빠르게 전원을 공급할 수 없다는 사실입니다. CPU는 잠자기 후에 거의 순간적으로 전력을 적게 사용하지 않으므로 시간이 필요합니다. 더 오랜 시간 동안 잠자기를하면 CPU가 전력 사용량을 줄일 수 있습니다.

잠재적으로 CPU를 언더 클럭킹하면 전원을 더 자주 사용하는 데 도움이 될 수 있지만 여기서는 할 수있는 일이 있는지 확신 할 수 없습니다.