Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RDTSC 
:(
    Опции темы
Miha777
Дата 29.10.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2005

Репутация: нет
Всего: нет



Подскажите, пожалуйста, почему код, который выполняется в DOSе выполняется каждый раз за разное колличество процессорных тактов (замеряю RDTSC до кода и после выполнения кода, формирую разницу, при следующем запуске приложения эта разница уже другая) smile
PM MAIL   Вверх
rsm
Дата 29.10.2005, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



1. Инструкцию rdtsc нужно использовать правильно, в соответствии с рекомендациями Intel:
Код

xor eax,eax
cpuid
rdtsc

2. На время выполнения замера времени устанавливай своей программе высший приоритет - это позволит свести к минимуму влияние посторонних приложений.
3. Более-менее высокая точность достигается только в случае, когда минимальный промежуток времени составляет 50~100 тактов.

Вообще, штатными средствами процессора измерять время выполнения отдельных команд невозможно - нет достаточной точности.
PM MAIL   Вверх
Miha777
Дата 29.10.2005, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2005

Репутация: нет
Всего: нет



Дело немного не в этом, я выполняю определенный код n-е количество раз (порядка млн) и определяю количество затраченых процессорных тактов. Все это происходит в однозадачной ОС - DOS, но этот код почему-то выполняется за разное количество этих тактов, почему так происходит?

_asm{
xor eax,eax
xor edx,edx
db 0x0f,0x31 //rdtsc
mov edx1,edx
mov eax1,eax
}
;----------------------------------------------------------
_asm mov eax,num // num - колличество раз
m3:
_asm dec eax
_asm jz en_d
_asm jmp m3
en_d:
;-------------------------------------------------------

_asm{
xor eax,eax
xor edx,edx
db 0x0f,0x31
mov edx2,edx
mov eax2,eax
}

В edx1, eax1 - начало ; edx2, eax2 - конец

Делаю несколько запусков в DOSе с одним и тем же num, но результат почему-то отличается (при num=1000000 розличие порядка 10 единиц)
PM MAIL   Вверх
rsm
Дата 29.10.2005, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



Еще раз повторю - используй официальный способ вызова rdtsc. У меня тоже иногда разброс просто огромный (см. аттач). Но 99% результатов аналогичны.

Это сообщение отредактировал(а) rsm - 29.10.2005, 20:57

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  rdtsc.zip 42,39 Kb
PM MAIL   Вверх
Miha777
Дата 29.10.2005, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2005

Репутация: нет
Всего: нет



rsm, я тебя прекрасно понял, пусть даже если rdtsc вызывать так как ты говориш, в Windows - разброс значений понятен в следствии ее многозадачности, но ПОЧЕМУ В DOSе один код выполняется за разное количество тактов? Меня интересует именно почему так происходит! (даже при вызове rdtsc по рекомендациям Intel)
PM MAIL   Вверх
rsm
Дата 29.10.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 2
Всего: 62



Цитата(Miha777 @ 29.10.2005, 23:20)
Меня интересует именно почему так происходит!

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

Теоретически, получить достаточно точный результат работы команды rdtsc на обычном компе можно единственным способом: оставить только процессор, удалить полностью всю периферию (кроме той, которая обеспечивает его работоспособность) и управлять им путем прямой подачи импульсов с блока управления. Практически это можно реализовать так: взять микроконтроллер, написать для него программу и тестировать время выполнения команд пока не надоест.

Это сообщение отредактировал(а) rsm - 29.10.2005, 22:54
PM MAIL   Вверх
Miha777
Дата 30.10.2005, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2005

Репутация: нет
Всего: нет



rsm, пасибо за ответы, я подумаю над етим
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.