Russian Qt Forum
Ноябрь 24, 2024, 12:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTime vs rdtsc() ? или QTime vs QTime?  (Прочитано 6764 раз)
Белый пони
Гость
« : Июль 06, 2010, 13:55 »

Какому из этих способов измерения верить?

Вот функция rdtsc() ( подсмотрено тут - http://www.iakovlev.org/index.html?p=536)

Код:
extern __inline__ uint64_t rdtsc() {
   uint64_t x;
   __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
   return x;
 }

Соответственно, для измерения интервала времени используется следующая конструкция:

Код:
ini = rdtsc(); 
usleep(0);
end = rdtsc();
time = (end -ini) / MHz;
printf("usleep itself : %llu ticks,\t %fµs\n\n", end - ini, time);

,где MHz - частота процессора.

Используя эту штуку, я контролирую частоту оборотов цикла в thread'е:

Код:
void myThread::run()
{
...
while( cycleflag )
{
...
Ini = rdtsc();
for( j = 0; j < 8; j++)
{
...
if( j == 7)
{
do { End = rdtsc();
loopTime = (End - Ini) / CPU_MHz;
} while( loopTime < 78930);       // надо 100000(?), пауза в мкс

cerr << loopTime << "  ";
Ini = End;
}
}
}
}

Мне надо, чтобы цикл while выполнялся 10 раз в секунду (за это время 80 раз выполняется цикл for).  То есть после выполнения 8-ми оборотов цикла for я жду пока "натикает" до 0.1 секунды. Быстродействия хватает с головой.

Проблемы начались, когда я начал с каждым оборотом while выводить в файл время QTime с миллисекундами. Согласно этому времени, период цикла while был не 100 мс, а примерно 120 мс.

Кому больше верить QTime или rdtsc(), по кому из них синхронизировать цикл?
Кто, вообще, может что-нибудь сказать про стабильность rdtsc() ?
« Последнее редактирование: Июль 13, 2010, 09:21 от Белый пони » Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #1 : Июль 06, 2010, 18:09 »


Сделать большое кол-во циклов и засечь с секундомером.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Июль 06, 2010, 18:35 »

Имхо, точнее rdtsc

Хотя, по факту все будет зависеть от загруженности процессора. т.е. не факт что твои функции/операторы в потоке (run) будут выполняться "равномерно". т.е. все-равно каждый раз будет у тебя какая-то ошибка в измерении. Как вариант - дать потоку наивысший приоритет. Хотя, измерение на PC интервалов времени точнее 100 +/- 50 мс дохлое дело. Имхо.
« Последнее редактирование: Июль 06, 2010, 18:39 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Белый пони
Гость
« Ответ #3 : Июль 07, 2010, 20:04 »

Да, похоже QTime по-лучше в данном случае.
Спасибо за ответы Улыбающийся
Записан
Белый пони
Гость
« Ответ #4 : Июль 13, 2010, 09:21 »

Что-то я ваще запутался. Похоже в ошибке виноват не rdtsc().

В приведённом выше примере заменил задержку
Код:
if( j == 7)
{
do { End = rdtsc();
loopTime = (End - Ini) / CPU_MHz;
} while( loopTime < 78930);       

cerr << loopTime << "  ";
Ini = End;
}

на
Код:
if( j == 7)
{
do { End = rdtsc();
loopTime = (End - Ini) / CPU_MHz;
} while( myTimer.elapsed() < 100);     

myTime.restart();
}

Результат одинаковый.

Суть:

имеется два thread'а в одном данные считываются с внешнего устройства, при каждом считываении испускается сигнал. В другом thread'е при получении сигнала эти данные записываются в файл;

в каждом из thread'ов свой экземпляр QTime. Так вот интервалы измерянные этими QTime'ами не совпадают.  То есть если данные считываются раз в 100 мс (согласно таймеру в одном п-ссе), то в файл они записываются раз в примерно 120 мс (согласно таймеру в другом процессе).  (аналогично было, когда в считывающем процессе задержка выполнялась с помощью rdtsc() )

Как же так? Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июль 13, 2010, 09:34 »

Цитировать
Хотя, по факту все будет зависеть от загруженности процессора. т.е. не факт что твои функции/операторы в потоке (run) будут выполняться "равномерно". т.е. все-равно каждый раз будет у тебя какая-то ошибка в измерении. Как вариант - дать потоку наивысший приоритет. Хотя, измерение на PC интервалов времени точнее 100 +/- 50 мс дохлое дело. Имхо.

Бросьте это дело. Не получите вы то что нужно. Отмерять промежутки времени большой точности на PC и ОС типа Windows или Linux не получится.
Для этого нужна хотя-бы ОСРВ или MSDOS. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Белый пони
Гость
« Ответ #6 : Июль 13, 2010, 11:21 »

Бросьте это дело. Не получите вы то что нужно. Отмерять промежутки времени большой точности на PC и ОС типа Windows или Linux не получится.
Для этого нужна хотя-бы ОСРВ или MSDOS. Улыбающийся
Сурово(  У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое Улыбающийся))
Записан
BRE
Гость
« Ответ #7 : Июль 13, 2010, 11:57 »

Сурово(  У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое Улыбающийся))
А при правильном подходе он и не уступает.  Улыбающийся
Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут.
Записан
Белый пони
Гость
« Ответ #8 : Июль 13, 2010, 12:40 »

А при правильном подходе он и не уступает.  Улыбающийся
Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут.

Насклько я понял в возможности выполнения точных задержек уступает Улыбающийся
Или есть другой способ?
Записан
BRE
Гость
« Ответ #9 : Июль 13, 2010, 12:53 »

Насклько я понял в возможности выполнения точных задержек уступает Улыбающийся
Не стоит забывать, что в отличии от DOS, на современных системах параллельно выполняются множество процессов. Поэтому, например, ты запустил цикл ожидания в своем процессе (что само по себе жутко не эффективно и жрет максимум процессорного времени), а ОС переключилась на выполнение другого процесса (более важного) и этот процесс работал 500 тактов, после переключения на твой процесс ты обнаружишь, что задержка составила больше 500 тактов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.