Я пытаюсь периодически вызывать функцию выборки в потоке С++ на моей машине с Linux. Я хотел бы перезапустить свою функцию после очень короткого периода, в идеале 1 мс, но я обнаружил, что мощность (в ваттах), потребляемая в течение 1 мс, чрезмерно высока: система работает с удвоенным уровнем мощности, как когда мой период 5 мсек. Поддержание низкого энергопотребления является серьезной проблемой для функциональности, которую я хочу.
Конкретно,
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);
}
}
Я определил, что разница в энергопотреблении моего сэмплера на двух частотах незначительна, и что дополнительное энергопотребление связано со спящим вызовом. То есть, даже если я закомментирую строку sample() в обоих приведенных выше фрагментах, вторая все равно будет потреблять вдвое меньше энергии. Любые идеи относительно того, как я мог бы уменьшить мощность, потребляемую вызовом сна?
К вашему сведению, я использую Ubuntu 3.2.0 на 24-ядерном процессоре Intel Xeon, и поиск частоты в /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 Гц (что в 4 раза превышает частоту, с которой я хотел бы производить выборку). Спасибо за вашу помощь!
sample
? Может ли это быть основано на событиях? - person Mooing Duck   schedule 17.07.2013