Russian Qt Forum

Qt => Общие вопросы => Тема начата: Белый пони от Июль 06, 2010, 13:55



Название: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: Белый пони от Июль 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() ?


Название: Re: QTime vs rdtsc() ?
Отправлено: vipet от Июль 06, 2010, 18:09

Сделать большое кол-во циклов и засечь с секундомером.


Название: Re: QTime vs rdtsc() ?
Отправлено: kuzulis от Июль 06, 2010, 18:35
Имхо, точнее rdtsc

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


Название: Re: QTime vs rdtsc() ?
Отправлено: Белый пони от Июль 07, 2010, 20:04
Да, похоже QTime по-лучше в данном случае.
Спасибо за ответы :)


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: Белый пони от Июль 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() )

Как же так? :)


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: kuzulis от Июль 13, 2010, 09:34
Цитировать
Хотя, по факту все будет зависеть от загруженности процессора. т.е. не факт что твои функции/операторы в потоке (run) будут выполняться "равномерно". т.е. все-равно каждый раз будет у тебя какая-то ошибка в измерении. Как вариант - дать потоку наивысший приоритет. Хотя, измерение на PC интервалов времени точнее 100 +/- 50 мс дохлое дело. Имхо.

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


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: Белый пони от Июль 13, 2010, 11:21
Бросьте это дело. Не получите вы то что нужно. Отмерять промежутки времени большой точности на PC и ОС типа Windows или Linux не получится.
Для этого нужна хотя-бы ОСРВ или MSDOS. :)
Сурово(  У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое :)))


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: BRE от Июль 13, 2010, 11:57
Сурово(  У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое :)))
А при правильном подходе он и не уступает.  :)
Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут.


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: Белый пони от Июль 13, 2010, 12:40
А при правильном подходе он и не уступает.  :)
Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут.

Насклько я понял в возможности выполнения точных задержек уступает :)
Или есть другой способ?


Название: Re: QTime vs rdtsc() ? или QTime vs QTime?
Отправлено: BRE от Июль 13, 2010, 12:53
Насклько я понял в возможности выполнения точных задержек уступает :)
Не стоит забывать, что в отличии от DOS, на современных системах параллельно выполняются множество процессов. Поэтому, например, ты запустил цикл ожидания в своем процессе (что само по себе жутко не эффективно и жрет максимум процессорного времени), а ОС переключилась на выполнение другого процесса (более важного) и этот процесс работал 500 тактов, после переключения на твой процесс ты обнаружишь, что задержка составила больше 500 тактов.